ลิ้นมังกร: คิวข้อความกระจาย

Nov 24 2022
ระหว่างความคลุมเครือของ WFH และสถานการณ์ที่โดดเดี่ยว ฉันเริ่มมองหาการล็อกแบบกระจายโดยใช้ Consul โปรแกรมทดสอบง่ายๆ ในไม่ช้าก็กลายเป็นเส้นทางสู่การสร้างคิวข้อความแบบกระจายที่เรียกว่า Lignum นี่คือบทความเบื้องต้นเกี่ยวกับคิวข้อความลิ้นมังกร

ระหว่างความคลุมเครือของ WFH และสถานการณ์ที่โดดเดี่ยว ฉันเริ่มมองหาการล็อกแบบกระจายโดยใช้ Consul โปรแกรมทดสอบง่ายๆ ในไม่ช้าก็กลายเป็นเส้นทางสู่การสร้างคิวข้อความแบบกระจายที่เรียกว่าLignum

ภาพรวมของลิ้นมังกร

นี่คือบทความเบื้องต้นเกี่ยวกับคิวข้อความลิ้นมังกร

ระบบกระจายคืออะไร?

มีคำจำกัดความมากมาย การค้นหาโดย Google อย่างง่ายจะทำให้ได้คำตอบมากมาย ฉันสามารถกำหนดระบบแบบกระจายเป็นชุดของโปรแกรมหรือระบบที่เป็นอิสระหรือเป็นรายบุคคลซึ่งทำงานเพื่อเป้าหมายร่วมกัน

ความหมาย ระบบหลายระบบเชื่อมต่อกันโดยวิธีการสื่อสารต่างๆ เพื่อจุดประสงค์ร่วมกัน อาจเป็นระบบที่คนหนึ่งขอหน้าเว็บและอีกคนหนึ่งให้บริการหน้าเว็บ สำหรับผู้ใช้ปลายทาง ระบบเหล่านี้อาจดูเหมือนเป็นระบบเดียว แต่อาจมีระบบดังกล่าวหลายร้อยระบบที่สื่อสารระหว่างกันเพื่อทำงานดังกล่าว

คิวข้อความคืออะไร?

ระบบที่มีโครงสร้างข้อมูลคิวสำหรับบริการอื่นในการอ่านและเขียนข้อความตามลำดับ FIFO
คิวอนุญาตให้บริการผู้ผลิตเขียนข้อความและผู้บริโภคบริโภคแบบอะซิงโครนัส ผู้ผลิตและผู้บริโภคไม่จำเป็นต้องรับรู้ซึ่งกันและกัน

คิวข้อความ

ลักษณะพื้นฐานสองประการของคิวข้อความคือ

  1. ข้อความ หัวข้อ
    จะถูกส่งไปยังบัฟเฟอร์ที่มีชื่อ ซึ่งเรียกว่าหัวข้อ เราผลิตและบริโภคข้อความจากหัวข้อ
  2. ข้อความ
    นี่คือข้อความจริงที่เราเขียนถึงหัวข้อเพื่อให้ผู้อื่นบริโภค

คิวข้อความแบบกระจายคืออะไร?

เมื่อเราสร้างคิวข้อความซึ่งโฮสต์ในหลายโหนด โดยทำงานร่วมกันเพื่อทำหน้าที่เป็นเอนทิตีเดียวสำหรับบริการอื่นๆ

จะมีข้อความผู้ใช้หลายคิวที่โฮสต์ไว้

  1. ความน่าเชื่อถือและความพร้อมใช้งานสูง
  2. ความอดทนต่อความผิดพลาด
  3. ประสิทธิภาพ
  4. แบ่งปันการอ่านโหลดกับหลาย ๆ โหนด

Lignumเริ่มต้นเป็นโปรแกรมทดสอบเพื่อเรียนรู้การล็อกแบบกระจายโดยใช้Consul session lockซึ่งเริ่มเปลี่ยนไปสู่คิวข้อความในขณะที่ฉันทำงานกับ Kafka ในเวลานั้น
สิ่งนี้เขียนใน Go ฉันเริ่มต้นด้วยการพัฒนาการทดสอบขับเคลื่อนในใจ แต่ในไม่ช้ามันก็กลายเป็นความยุ่งเหยิง

สถาปัตยกรรมลิ้นมังกร

Lignum ไม่ใช่คิวข้อความเต็มรูปแบบ แต่กำลังดำเนินการอยู่ คุณสามารถ

  • ส่งข้อความไปที่หัวข้อ
  • ใช้ข้อความจากหัวข้อ
  • ข้อความถูกจำลองไปยังโหนดทั้งหมด หมายความว่าสามารถใช้โหนดใดก็ได้เพื่ออ่านข้อความจากหัวข้อ
  • ยืนยันข้อความบนดิสก์
  • ลิ้นมังกรสามารถทำงานในโหมดคลัสเตอร์โดยไม่จำเป็นต้องตั้งค่าพิเศษใดๆ
  • การจัดการคลัสเตอร์ได้รับการอำนวยความสะดวกโดย Consul ด้วยการล็อกเซสชัน
  • แต่ละโหนดจะเชื่อมต่อกับกงสุลเพื่อรับผู้นำ หากไม่พบผู้นำ โหนดใดโหนดหนึ่งจะถูกเลือกเป็นผู้นำ
  • โหนดอื่นทั้งหมดจะลงทะเบียนตัวเองเป็นผู้ตามผู้นำ
  • ข้อความที่ส่งถึงผู้นำจะถูกทำซ้ำไปยังโหนดผู้ติดตาม

  • มีการจำลอง แบบสองโหมด การจำลองแบบ WAL
    ข. การจำลองแบบสด
  • หากผู้นำล้มลง ผู้ตามคนใดคนหนึ่งจะได้รับเลือกเป็นผู้นำ

ปัจจุบัน lignum ใช้กลยุทธ์การจำลองแบบสองโหมด

  1. การจำลองแบบ WAL
  2. การจำลองแบบสด

การจำลองแบบ 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/