ในปี 2017 เราชนะการแข่งขันเพื่อพัฒนาธุรกรรมหลักในธุรกิจการลงทุนของ Alfa-Bank และเริ่มทำงาน (ที่ HighLoad++ 2018 พร้อมรายงานเกี่ยวกับหลักของธุรกิจการลงทุน
ในระหว่างกระบวนการพัฒนา ระบบได้พัฒนาและได้รับฟังก์ชันการทำงาน และเมื่อถึงจุดหนึ่ง เราก็ตระหนักว่าเรากำลังตกผลึกบางสิ่งที่มากกว่าแค่แอปพลิเคชันซอฟต์แวร์ที่สร้างขึ้นเพื่อแก้ไขช่วงงานที่กำหนดไว้อย่างเคร่งครัด: เราประสบความสำเร็จ ระบบสำหรับการสร้างแอพพลิเคชั่นแบบกระจายพร้อมพื้นที่จัดเก็บข้อมูลถาวร. ประสบการณ์ที่เราได้รับเป็นพื้นฐานของผลิตภัณฑ์ใหม่ -
ฉันต้องการพูดคุยเกี่ยวกับสถาปัตยกรรม TDG และโซลูชันที่เราพบในระหว่างกระบวนการพัฒนา แนะนำคุณเกี่ยวกับฟังก์ชันการทำงานหลัก และแสดงให้เห็นว่าผลิตภัณฑ์ของเราสามารถเป็นพื้นฐานสำหรับการสร้างโซลูชันที่สมบูรณ์ได้อย่างไร
ทางสถาปัตยกรรมเราแบ่งระบบออกเป็นแยกออกจากกัน โรลลิชซึ่งแต่ละส่วนมีหน้าที่รับผิดชอบในการแก้ไขปัญหาบางช่วง อินสแตนซ์แอปพลิเคชันที่ทำงานอยู่เดี่ยวจะใช้ประเภทบทบาทตั้งแต่หนึ่งประเภทขึ้นไป คลัสเตอร์สามารถมีบทบาทประเภทเดียวกันได้หลายบทบาท:
เชื่อมต่อ
Connector มีหน้าที่ในการสื่อสารกับโลกภายนอก หน้าที่ของมันคือการยอมรับคำขอ แยกวิเคราะห์ และหากสำเร็จ ให้ส่งข้อมูลสำหรับการประมวลผลไปยังตัวประมวลผลอินพุต เรารองรับรูปแบบ HTTP, SOAP, Kafka, FIX สถาปัตยกรรมนี้ช่วยให้คุณเพิ่มการรองรับรูปแบบใหม่ได้อย่างง่ายดาย โดยจะรองรับ IBM MQ ในเร็วๆ นี้ หากการแยกวิเคราะห์คำขอล้มเหลว ตัวเชื่อมต่อจะส่งกลับข้อผิดพลาด มิฉะนั้นจะตอบกลับว่าคำขอได้รับการประมวลผลสำเร็จแล้ว แม้ว่าจะมีข้อผิดพลาดเกิดขึ้นในระหว่างการประมวลผลต่อไปก็ตาม สิ่งนี้ทำขึ้นโดยเฉพาะเพื่อทำงานกับระบบที่ไม่รู้วิธีทำซ้ำคำขอ - หรือในทางกลับกันก็ทำอย่างต่อเนื่องเกินไป เพื่อไม่ให้ข้อมูลสูญเสียคิวการซ่อมแซม: วัตถุจะเข้าไปก่อนและหลังจากลบการประมวลผลสำเร็จแล้วเท่านั้น ผู้ดูแลระบบสามารถรับการแจ้งเตือนเกี่ยวกับออบเจ็กต์ที่เหลืออยู่ในคิวการซ่อมแซม และหลังจากกำจัดข้อผิดพลาดของซอฟต์แวร์หรือฮาร์ดแวร์ล้มเหลวแล้ว ให้ลองอีกครั้ง
โปรเซสเซอร์อินพุต
ตัวประมวลผลอินพุตจะจัดประเภทข้อมูลที่ได้รับตามคุณลักษณะเฉพาะและเรียกตัวประมวลผลที่เหมาะสม ตัวจัดการคือโค้ด Lua ที่ทำงานบนแซนด์บ็อกซ์ ดังนั้นจึงไม่สามารถส่งผลกระทบต่อการทำงานของระบบได้ ในขั้นตอนนี้ ข้อมูลสามารถถูกลดขนาดลงเป็นรูปแบบที่ต้องการได้ และหากจำเป็น ก็สามารถเริ่มงานจำนวนเท่าใดก็ได้ซึ่งสามารถใช้ตรรกะที่จำเป็นได้ ตัวอย่างเช่น ในผลิตภัณฑ์ MDM (การจัดการข้อมูลหลัก) ที่สร้างขึ้นบน Tarantool Data Grid เมื่อเพิ่มผู้ใช้ใหม่ เพื่อไม่ให้การประมวลผลคำขอช้าลง เราจึงเปิดตัวการสร้างบันทึกทองเป็นงานแยกต่างหาก แซนด์บ็อกซ์รองรับคำขออ่าน เปลี่ยนแปลง และเพิ่มข้อมูล ช่วยให้คุณสามารถดำเนินการฟังก์ชันบางอย่างกับทุกบทบาทของประเภทพื้นที่จัดเก็บและการรวมผลลัพธ์ (แมป/ลด)
ตัวจัดการสามารถอธิบายได้ในไฟล์:
sum.lua
local x, y = unpack(...)
return x + y
จากนั้นจึงประกาศในการกำหนดค่า:
functions:
sum: { __file: sum.lua }
ทำไมต้องลัวะ? ลัวะเป็นภาษาที่ง่ายมาก จากประสบการณ์ของเรา สองสามชั่วโมงหลังจากทำความรู้จัก ผู้คนเริ่มเขียนโค้ดที่ช่วยแก้ปัญหาของพวกเขา และสิ่งเหล่านี้ไม่ได้เป็นเพียงนักพัฒนามืออาชีพเท่านั้น แต่ยังรวมถึงนักวิเคราะห์ด้วย นอกจากนี้ ต้องขอบคุณคอมไพเลอร์ jit ทำให้ Lua ทำงานเร็วมาก
พื้นที่จัดเก็บ
พื้นที่เก็บข้อมูลจัดเก็บข้อมูลถาวร ก่อนที่จะบันทึก ข้อมูลจะได้รับการตรวจสอบกับสคีมาข้อมูล เพื่ออธิบายวงจรเราใช้รูปแบบเพิ่มเติม
{
"name": "User",
"type": "record",
"logicalType": "Aggregate",
"fields": [
{ "name": "id", "type": "string"},
{"name": "first_name", "type": "string"},
{"name": "last_name", "type": "string"}
],
"indexes": ["id"]
}
ตามคำอธิบายนี้ DDL (Data Definition Language) จะถูกสร้างขึ้นโดยอัตโนมัติสำหรับ Tarantula DBMS และ
รองรับการจำลองข้อมูลแบบอะซิงโครนัส (มีแผนจะเพิ่มการจำลองแบบซิงโครนัส)
โปรเซสเซอร์เอาท์พุต
บางครั้งจำเป็นต้องแจ้งให้ผู้บริโภคภายนอกทราบเกี่ยวกับการมาถึงของข้อมูลใหม่ เพื่อจุดประสงค์นี้ มีบทบาทผู้ประมวลผลเอาต์พุต หลังจากบันทึกข้อมูลแล้ว สามารถส่งผ่านไปยังตัวจัดการที่เกี่ยวข้องได้ (เช่น เพื่อนำไปไว้ในแบบฟอร์มที่ผู้บริโภคต้องการ) - จากนั้นส่งผ่านไปยังตัวเชื่อมต่อเพื่อส่ง คิวการซ่อมแซมยังใช้ที่นี่ หากไม่มีใครยอมรับออบเจ็กต์ ผู้ดูแลระบบสามารถลองอีกครั้งในภายหลัง
มาตราส่วน
บทบาทของตัวเชื่อมต่อ ตัวประมวลผลอินพุต และตัวประมวลผลเอาท์พุตไม่มีสถานะ ทำให้เราสามารถปรับขนาดระบบในแนวนอนได้โดยการเพิ่มอินสแตนซ์แอปพลิเคชันใหม่โดยเปิดใช้งานประเภทบทบาทที่ต้องการ พื้นที่เก็บข้อมูลใช้สำหรับการปรับขนาดแนวนอน
คุณสมบัติข้อมูล
วัตถุอาจมีขนาดใหญ่มากและประกอบด้วยวัตถุอื่นๆ เรารับประกันความเป็นอะตอมมิกของการเพิ่มและอัปเดตข้อมูลโดยการจัดเก็บออบเจ็กต์ที่มีการขึ้นต่อกันทั้งหมดไว้ในบัคเก็ตเสมือนเดียว วิธีนี้จะป้องกันไม่ให้ออบเจ็กต์ "กระจาย" ไปยังเซิร์ฟเวอร์จริงหลายเครื่อง
รองรับการกำหนดเวอร์ชัน: การอัปเดตแต่ละครั้งของออบเจ็กต์จะสร้างเวอร์ชันใหม่ และเราสามารถแบ่งเวลาและดูว่าโลกในตอนนั้นเป็นอย่างไร สำหรับข้อมูลที่ไม่ต้องการประวัติอันยาวนาน เราสามารถจำกัดจำนวนเวอร์ชันหรือจัดเก็บเพียงเวอร์ชันเดียว ซึ่งเป็นเวอร์ชันล่าสุด กล่าวคือ ปิดใช้งานการกำหนดเวอร์ชันสำหรับบางประเภทเป็นหลัก คุณยังสามารถจำกัดประวัติตามเวลาได้ เช่น ลบออบเจ็กต์ทั้งหมดบางประเภทที่มีอายุมากกว่า 1 ปี รองรับการเก็บถาวรด้วย: เราสามารถยกเลิกการโหลดออบเจ็กต์ที่เก่ากว่าเวลาที่กำหนด เพื่อเพิ่มพื้นที่ว่างในคลัสเตอร์
งาน
ในบรรดาคุณสมบัติที่น่าสนใจ ความสามารถในการเริ่มงานตามกำหนดเวลา ตามคำขอของผู้ใช้ หรือโดยทางโปรแกรมจากแซนด์บ็อกซ์เป็นที่น่าสังเกตว่า:
ที่นี่เราเห็นอีกบทบาทหนึ่ง - นักวิ่ง บทบาทนี้ไม่เก็บสถานะ และสามารถเพิ่มอินสแตนซ์ของแอปพลิเคชันเพิ่มเติมที่มีบทบาทนี้ลงในคลัสเตอร์ได้ตามต้องการ ความรับผิดชอบของนักวิ่งคือการทำงานให้เสร็จสิ้น ตามที่กล่าวไว้ เป็นไปได้ที่จะสร้างงานใหม่จากแซนด์บ็อกซ์ พวกเขาจะถูกบันทึกไว้ในคิวที่เก็บข้อมูลแล้วดำเนินการกับนักวิ่ง งานประเภทนี้เรียกว่างาน นอกจากนี้เรายังมีประเภทงานที่เรียกว่างาน ซึ่งเป็นงานที่ผู้ใช้กำหนดซึ่งทำงานตามกำหนดเวลา (โดยใช้ไวยากรณ์ cron) หรือตามความต้องการ เพื่อเริ่มและติดตามงานดังกล่าว เรามีตัวจัดการงานที่สะดวกสบาย เพื่อให้ฟังก์ชันนี้พร้อมใช้งาน คุณต้องเปิดใช้งานบทบาทตัวจัดกำหนดการ บทบาทนี้มีสถานะ ดังนั้นจึงไม่ได้ปรับขนาด ซึ่งอย่างไรก็ตาม ไม่จำเป็น ในเวลาเดียวกัน เช่นเดียวกับบทบาทอื่นๆ มันสามารถมีแบบจำลองที่เริ่มทำงานได้หากเจ้านายปฏิเสธกะทันหัน
คนตัดไม้
อีกบทบาทหนึ่งเรียกว่าคนตัดไม้ โดยรวบรวมบันทึกจากสมาชิกทั้งหมดของคลัสเตอร์และมีอินเทอร์เฟซสำหรับการอัปโหลดและดูผ่านอินเทอร์เฟซเว็บ
บริการ
เป็นที่น่าสังเกตว่าระบบทำให้การสร้างบริการเป็นเรื่องง่าย ในไฟล์การกำหนดค่า คุณสามารถระบุได้ว่าคำขอใดจะถูกส่งไปยังตัวจัดการที่ผู้ใช้เขียนซึ่งทำงานในแซนด์บ็อกซ์ ในตัวจัดการนี้ คุณสามารถเรียกใช้แบบสอบถามเชิงวิเคราะห์บางประเภทและส่งกลับผลลัพธ์ได้
บริการอธิบายไว้ในไฟล์กำหนดค่า:
services:
sum:
doc: "adds two numbers"
function: sum
return_type: int
args:
x: int
y: int
GraphQL API ถูกสร้างขึ้นโดยอัตโนมัติและบริการจะพร้อมสำหรับการโทร:
query {
sum(x: 1, y: 2)
}
นี่จะเรียกตัวจัดการ sum
ซึ่งจะส่งคืนผลลัพธ์:
3
แบบสอบถามโปรไฟล์และตัวชี้วัด
เพื่อให้เข้าใจถึงการทำงานของระบบและคำขอโปรไฟล์ เราได้ปรับใช้การสนับสนุนสำหรับโปรโตคอล OpenTracing ระบบสามารถส่งข้อมูลตามความต้องการไปยังเครื่องมือที่รองรับโปรโตคอลนี้ เช่น Zipkin ซึ่งจะช่วยให้คุณเข้าใจวิธีการดำเนินการตามคำขอ:
โดยปกติแล้ว ระบบจะจัดเตรียมหน่วยวัดภายในที่สามารถรวบรวมได้โดยใช้ Prometheus และแสดงภาพโดยใช้ Grafana
ปรับใช้
Tarantool Data Grid สามารถปรับใช้จากแพ็คเกจ RPM หรือไฟล์เก็บถาวรโดยใช้ยูทิลิตี้จากการแจกจ่ายหรือ Ansible นอกจากนี้ยังมีการรองรับ Kubernetes (
แอปพลิเคชันที่ใช้ตรรกะทางธุรกิจ (การกำหนดค่า ตัวจัดการ) จะถูกโหลดลงในคลัสเตอร์ Tarantool Data Grid ที่ปรับใช้ในรูปแบบของไฟล์เก็บถาวรผ่าน UI หรือใช้สคริปต์ผ่าน API ที่เราจัดเตรียมไว้ให้
การใช้งานตัวอย่าง
แอปพลิเคชันใดบ้างที่สามารถสร้างได้โดยใช้ Tarantool Data Grid ที่จริงแล้ว งานทางธุรกิจส่วนใหญ่เกี่ยวข้องกับการประมวลผล การจัดเก็บ และการเข้าถึงโฟลว์ข้อมูล ดังนั้น หากคุณมีข้อมูลจำนวนมากที่ต้องจัดเก็บและเข้าถึงอย่างปลอดภัย ผลิตภัณฑ์ของเราสามารถช่วยคุณประหยัดเวลาในการพัฒนาได้มากและมุ่งเน้นไปที่ตรรกะทางธุรกิจของคุณ
ตัวอย่างเช่น เราต้องการรวบรวมข้อมูลเกี่ยวกับตลาดอสังหาริมทรัพย์ เพื่อว่าในอนาคต เราจะมีข้อมูลเกี่ยวกับข้อเสนอที่ดีที่สุด เป็นต้น ในกรณีนี้ เราจะเน้นงานต่อไปนี้:
- หุ่นยนต์ที่รวบรวมข้อมูลจากโอเพ่นซอร์สจะเป็นแหล่งข้อมูลของเรา คุณสามารถแก้ไขปัญหานี้ได้โดยใช้วิธีแก้ปัญหาสำเร็จรูปหรือการเขียนโค้ดในภาษาใดก็ได้
- ถัดไป Tarantool Data Grid จะยอมรับและบันทึกข้อมูล หากรูปแบบข้อมูลจากแหล่งที่มาต่างกัน คุณสามารถเขียนโค้ดใน Lua ที่จะทำการแปลงเป็นรูปแบบเดียวได้ ในขั้นตอนก่อนการประมวลผล คุณจะสามารถกรองข้อเสนอที่ซ้ำกันหรืออัปเดตข้อมูลเพิ่มเติมเกี่ยวกับตัวแทนที่ทำงานในตลาดในฐานข้อมูลได้
- ตอนนี้ คุณมีโซลูชันที่ปรับขนาดได้ในคลัสเตอร์ที่สามารถเติมข้อมูลและทำการเลือกข้อมูลได้แล้ว จากนั้นคุณสามารถใช้ฟังก์ชันใหม่ได้ เช่น เขียนบริการที่จะขอข้อมูลและให้ข้อเสนอที่ได้เปรียบที่สุดต่อวัน ซึ่งจะต้องใช้สองสามบรรทัดในไฟล์การกำหนดค่าและรหัส Lua เล็กน้อย
ทำอะไรต่อไป
ลำดับความสำคัญของเราคือการปรับปรุงความง่ายในการพัฒนาโดยใช้
เรายังให้ความสำคัญกับประเด็นด้านความปลอดภัยเป็นอย่างมาก ขณะนี้เรากำลังอยู่ระหว่างการรับรองโดย FSTEC ของรัสเซีย เพื่อยืนยันการรักษาความปลอดภัยระดับสูง และตรงตามข้อกำหนดสำหรับการรับรองผลิตภัณฑ์ซอฟต์แวร์ที่ใช้ในระบบข้อมูลข้อมูลส่วนบุคคลและระบบข้อมูลของรัฐบาล
ที่มา: will.com