NATS ภาคทฤษฎี [theory] pt.2

Anirut Kamchai
2 min readJan 28, 2022

--

NATS คืออะไร ?? แบบยาวหน่อย

Nats เป็น message queue system ตัวนึงที่ถูกพัฒนาด้วย Golang และเป็น opensource โดยปัจจุบัน ณ ตอนที่เขียน version 2.6.6 แล้ว โดย Nats supported clients แทบทุกภาษาเลยก็ว่าได้ โดยในภาคปฏิบัติผมจะพา implement ในภาษา Golang และ Rust
ในการจะใช้ Nats นั้นไม่ยากเลยสามารถ run binary ได้เลย binary เล็กกว่า 20MB เลยนะ

Nats ทำงานยังไง?

ผู้ส่ง message (publisher)
ผู้รับ message (subscriber)
การส่ง message ของ nats นั้นเป็นการส่งแบบ At most once (QoS)
At most once คือ หากในตอนที่ publisher ส่ง message ไปแต่ทว่าไม่มี subscriber message นั้นจะหายไปเลย เหมือนกับ Redis pub-sub อ้าวววว อย่างนี้ใช้ Redis pub-sub ดีกว่าไหม!
ใจเย็นนะครับ จริง ๆ แล้ว Nats support At-least / exactly once Qos แต่จะต้อง Enable Jetstream ก่อนเดี๋ยวจะกล่าวต่อไป

Nats routing message โดย Subject ใน kafka, rabbitmq เรียกว่า Topic จากตัวรูปด้านล่าง publisher publish msg “world” ไป subject ”Hello” และมี subscriber อยู่ 2 ตัวที่ subscribe subject “Hello”

โดย subscriber A และ B จะได้รับ message “world” ด้วยกันทั้งคู่

การตั้งชื่อ Subject

แนะนำ: ตัวอักขระ a-z, A-Z, 0–9 case sensitive และมีช่องว่างไม่ได้
ตัวอักขระพิเศษ:
“.” (จุด) ใช้สำหรับแบ่ง Hierachies ของ Subject
“*,>” (asterisk กับ เครื่องหมายมากกว่า) ใช้สำหรับ wildcards Subject
ตัวอย่าง

time.ustime.us.easttime.us.east.atlantatime.eu.easttime.eu.warsaw

Matching A Single Token

ส่ง msg ไปที่ Subject time.us.east โดยมี Subscriber ดังรูป

จะเห็นว่า msg ไปหา Subscriber ที่ subscribe subject ดังภาพ
“time.*.east” คือ subscribe subject ตรง star เป็นอะไรก็ได้ เช่น time.us.east, time.eu.east แต่ถ้าเป็นแบบนี้ time.us.x.east ไม่ได้นะ ได้แค่ token เดียวเท่านั้น

Matching Multiple Tokens

ส่ง msg ไปที่ Subject time.us.east.alanta โดยมี Subscriber ดังรูป

Subscriber ที่ subscribe “time.us.>” จะได้รับ msg ด้วย เป็น hierarchies wildcard กล่าวให้เข้าใจง่าย ๆ คือ msg ที่ขึ้นต้นด้วยด้านหลัง .> ในที่นี้คือ “time.us” จะรับได้หมดเลย เช่น time.us.east.alanta, time.us.a.a.a.v, time.us.e.s…. แต่ถ้า time.eu ไม่ได้นะเพราะขึ้นต้นไม่ตรงกับที่ publisher ส่งมา

เดี๋ยวยาวเกินรอต่อ pt.3 กันนะครับจะเกี่ยวข้องกับ Strategy การส่งและรับ Msg ในท่าต่าง ๆ ตามข้างล่าง

  • Publish-Subscribe (async)
  • Request-Reply (sync)
  • Queue Group (async)

--

--