ลิ้นมังกร: คิวข้อความกระจาย
ระหว่างความคลุมเครือของ WFH และสถานการณ์ที่โดดเดี่ยว ฉันเริ่มมองหาการล็อกแบบกระจายโดยใช้ Consul โปรแกรมทดสอบง่ายๆ ในไม่ช้าก็กลายเป็นเส้นทางสู่การสร้างคิวข้อความแบบกระจายที่เรียกว่าLignum
นี่คือบทความเบื้องต้นเกี่ยวกับคิวข้อความลิ้นมังกร
ระบบกระจายคืออะไร?
มีคำจำกัดความมากมาย การค้นหาโดย Google อย่างง่ายจะทำให้ได้คำตอบมากมาย ฉันสามารถกำหนดระบบแบบกระจายเป็นชุดของโปรแกรมหรือระบบที่เป็นอิสระหรือเป็นรายบุคคลซึ่งทำงานเพื่อเป้าหมายร่วมกัน
ความหมาย ระบบหลายระบบเชื่อมต่อกันโดยวิธีการสื่อสารต่างๆ เพื่อจุดประสงค์ร่วมกัน อาจเป็นระบบที่คนหนึ่งขอหน้าเว็บและอีกคนหนึ่งให้บริการหน้าเว็บ สำหรับผู้ใช้ปลายทาง ระบบเหล่านี้อาจดูเหมือนเป็นระบบเดียว แต่อาจมีระบบดังกล่าวหลายร้อยระบบที่สื่อสารระหว่างกันเพื่อทำงานดังกล่าว
คิวข้อความคืออะไร?
ระบบที่มีโครงสร้างข้อมูลคิวสำหรับบริการอื่นในการอ่านและเขียนข้อความตามลำดับ FIFO
คิวอนุญาตให้บริการผู้ผลิตเขียนข้อความและผู้บริโภคบริโภคแบบอะซิงโครนัส ผู้ผลิตและผู้บริโภคไม่จำเป็นต้องรับรู้ซึ่งกันและกัน
ลักษณะพื้นฐานสองประการของคิวข้อความคือ
- ข้อความ หัวข้อ
จะถูกส่งไปยังบัฟเฟอร์ที่มีชื่อ ซึ่งเรียกว่าหัวข้อ เราผลิตและบริโภคข้อความจากหัวข้อ - ข้อความ
นี่คือข้อความจริงที่เราเขียนถึงหัวข้อเพื่อให้ผู้อื่นบริโภค
คิวข้อความแบบกระจายคืออะไร?
เมื่อเราสร้างคิวข้อความซึ่งโฮสต์ในหลายโหนด โดยทำงานร่วมกันเพื่อทำหน้าที่เป็นเอนทิตีเดียวสำหรับบริการอื่นๆ
จะมีข้อความผู้ใช้หลายคิวที่โฮสต์ไว้
- ความน่าเชื่อถือและความพร้อมใช้งานสูง
- ความอดทนต่อความผิดพลาด
- ประสิทธิภาพ
- แบ่งปันการอ่านโหลดกับหลาย ๆ โหนด
Lignumเริ่มต้นเป็นโปรแกรมทดสอบเพื่อเรียนรู้การล็อกแบบกระจายโดยใช้Consul session lockซึ่งเริ่มเปลี่ยนไปสู่คิวข้อความในขณะที่ฉันทำงานกับ Kafka ในเวลานั้น
สิ่งนี้เขียนใน Go ฉันเริ่มต้นด้วยการพัฒนาการทดสอบขับเคลื่อนในใจ แต่ในไม่ช้ามันก็กลายเป็นความยุ่งเหยิง
Lignum ไม่ใช่คิวข้อความเต็มรูปแบบ แต่กำลังดำเนินการอยู่ คุณสามารถ
- ส่งข้อความไปที่หัวข้อ
- ใช้ข้อความจากหัวข้อ
- ข้อความถูกจำลองไปยังโหนดทั้งหมด หมายความว่าสามารถใช้โหนดใดก็ได้เพื่ออ่านข้อความจากหัวข้อ
- ยืนยันข้อความบนดิสก์
- ลิ้นมังกรสามารถทำงานในโหมดคลัสเตอร์โดยไม่จำเป็นต้องตั้งค่าพิเศษใดๆ
- การจัดการคลัสเตอร์ได้รับการอำนวยความสะดวกโดย Consul ด้วยการล็อกเซสชัน
- แต่ละโหนดจะเชื่อมต่อกับกงสุลเพื่อรับผู้นำ หากไม่พบผู้นำ โหนดใดโหนดหนึ่งจะถูกเลือกเป็นผู้นำ
- โหนดอื่นทั้งหมดจะลงทะเบียนตัวเองเป็นผู้ตามผู้นำ
- ข้อความที่ส่งถึงผู้นำจะถูกทำซ้ำไปยังโหนดผู้ติดตาม
มีการจำลอง แบบสองโหมด การจำลองแบบ WAL
ข. การจำลองแบบสด- หากผู้นำล้มลง ผู้ตามคนใดคนหนึ่งจะได้รับเลือกเป็นผู้นำ
ปัจจุบัน lignum ใช้กลยุทธ์การจำลองแบบสองโหมด
- การจำลองแบบ WAL
- การจำลองแบบสด
การจำลองแบบ WAL
ไฟล์บันทึกถูกสร้างขึ้นสำหรับแต่ละหัวข้อเมื่อข้อความเกินขนาดบัฟเฟอร์ที่กำหนดไว้ใน config( message.initial-szie-per-topic
) Lignum สร้างไฟล์ WAL( .qwal
) สำหรับแต่ละหัวข้อ เมื่อจำนวนข้อความถึงขนาดบัฟเฟอร์ ไฟล์นี้จะถูกล้างไปยังดิสก์ในlog
รูปแบบไฟล์ Lignum มักจะเฝ้าดูการสร้างไฟล์บันทึกเหล่านี้และส่งไปยังผู้ติดตาม ผู้ติดตามทั้งหมดจะซิงค์กับผู้นำเป็นระยะๆ เพื่อให้สอดคล้องกันในที่สุด/ล่าช้า
การจำลองแบบสด
นี่คือการทำซ้ำแบบสตรีมมิ่ง เมื่อผู้ติดตามลงทะเบียนกับผู้นำแล้ว เราไม่จำเป็นต้องกังวลเกี่ยวกับการซิงค์ข้อความหากหัวข้อสร้างขึ้นหลังจากนั้น เราสามารถส่งต่อข้อความที่ได้รับไปยังผู้นำเช่นเดียวกับผู้ตาม ในกลยุทธ์นี้ ข้อความจะถูกส่งไปยังผู้ติดตามที่ลงทะเบียนทันที วิธีนี้ลิ้นมังกรสามารถให้ความเหนียวแน่น
วิธีเรียกใช้ลิ้นมังกร
- ข้อกำหนดเบื้องต้น
— กงสุล
คุณสามารถใช้ Dockerfile ตามที่ระบุไว้ในREADME - โคลนที่เก็บ
https://github.com/NishanthSpShetty/lignum.git
config.yml
คุณสามารถดูเอกสารนี้เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดค่าmake run
- ส่งข้อความ
curl --request POST \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"message":"this is a test message"
}'
curl --request GET \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"from": 0,
"to": 3
}'
มีการรับประกันการจัดส่งแบบใด
เนื่องจากข้อความยังคงอยู่และผู้บริโภคสามารถอ่านค่าชดเชยใดๆ ได้ตลอดเวลา การรับประกันการจัดส่งจึงตกเป็นของผู้บริโภค Lignum รับประกันการสั่งซื้อข้อความ
ให้เพิ่มโหนดในคลัสเตอร์ที่มีอยู่
- เปลี่ยนการกำหนดค่าตามโฮสต์ของคุณ
- หากรันบนโฮสต์เดียวกันกับที่รันก่อนหน้านี้ ให้เปลี่ยนค่าพอร์ต ไดเร็กทอรีข้อมูล และพอร์ตจำลองแบบในไฟล์ปรับแต่ง
- วิ่ง
make run
นี่คือการแนะนำสั้น ๆ เกี่ยวกับลิ้นมังกร ฉันจะจัดทำเอกสารแยกต่างหากเกี่ยวกับรายละเอียดภายในและการพัฒนาในอนาคต
รหัสอยู่ใน Github : Lignum
ชำระเงินและแสดงความคิดเห็น ยินดีต้อนรับผลงาน
ตรวจสอบโปรไฟล์ Github ของฉันสำหรับโครงการที่ยอดเยี่ยมอื่น ๆ ที่ฉันกำลังทำอยู่
เชื่อมต่อกับฉันใน LinkedIn
https://www.linkedin.com/in/nishanthspshetty/