SlideShare a Scribd company logo
COMMUNICATION
PATTERNS
Babel Coder
Babel Coder
https://www.babelcoder.com
Babel Coder
Babel Coder
https://www.babelcoder.com
COMMUNICATION TYPES
การสือสารระหว่างเซอร์วิสสามารถจําแนกได้เปน 2 ประเภท หากจําแนกตาม Protocol จะสามารถจําแนกได้ดังนี
Synchronous Protocol การสือสารประเภทนีอยู่ในรูปแบบของ Request/Response โดยหลักแล้วมักเปนการ
เชือมต่อผ่าน HTTP หรือ TCP มีลักษณะการทํางานที client ทําการส่ง Request ไปยังเซอร์วิสอืนแล้วต้องรอเซอร์วิส
นันประมวลผลจนเสร็จสินจึงได้ผลลัพธ์ตอบกลับมา ระหว่างขันตอนทีเกิดขึน client จะถูกบลอคการทํางานจนกว่าขัน
ตอนทังหมดจะเสร็จสิน
Asynchronous Protocol การสือสารประเภทนี client จะทําการส่ง message ไปยังเซอร์วิสปลายทางโดยไม่รอ
ผลลัพธ์ของการทํางานนัน message ทีกล่าวถึงนีโดยมากแล้วจะอยู่ในรูปแบบของ Event โดยมี protocol ทีเข้ามา
เกียวข้อง เช่น AMQP เปนต้น
Babel Coder
Babel Coder
https://www.babelcoder.com
COMMUNICATION TYPES
การสือสารระหว่างเซอร์วิสยังสามารถจําแนกประเภทตามจํานวนของผู้รับ (receivers) ได้ ดังนี
Single Receiver แต่ละ Request จะถูกประมวลผลโดยเซอร์วิสหรือ Receiver เพียงตัวเดียว เช่น รูปแบบของ
Command Pattern
Multiple Receivers รูปแบบนี Request ใด ๆ จะได้รับการประมวลผลโดยเซอร์วิสหรือ Receivers ตังแต่ศูนย์ตัว
ขึนไป โดยมีลักษณะการสือสารเปนแบบ Asynchronous ตัวอย่างเช่น รูปบบ pub/sub ในสถาปตยกรรมแบบ
Event-Driven Architecture
Babel Coder
Babel Coder
https://www.babelcoder.com
https://learn.microsoft.com/
COMMUNICATION TYPES
Babel Coder
Babel Coder
https://www.babelcoder.com
https://learn.microsoft.com/
COMMUNICATION TYPES
Babel Coder
Babel Coder
https://www.babelcoder.com
สถาปตยกรรมการขับเคลือนด้วยเหตุการณ์ เปนรูปแบบของการสือสารระหว่างเซอร์วิสทีประกอบไปด้วย
Event Producers เปนเซอร์วิสผู้สร้างลําดับของเหตุการณ์ (Stream of Events)
Event คือเหตุการณ์ทีเกิดขึนประกอบด้วย Type คือชนิดข้องเหตุการณ์ และ Message คือข้อมูลทีส่งไปพร้อมกับ
เหตุการณ์นัน ๆ
Event Consumers คือเซอร์วิสปลายทางทีทําการดึง Event หรือเหตุการณ์ทีเกียวข้องมาประมวลผล
EVENT-DRIVEN ARCHITECTURE
Babel Coder
Babel Coder
https://www.babelcoder.com
สถาปตยกรรมการขับเคลือนด้วยเหตุการณ์ สามารถเลือกรูปแบบการทํางานได้ ดังนี
Pub/Sub การทํางานรูปแบบนีโครงสร้างของระบบการสือสารจะบันทึก Subscriptions กล่าวคือเมือ Event ได้รับ
การเผยแพร่ผ่านโครงสร้างระบบ ระบบจะทําการจัดส่ง Event ดังกล่าวไปยัง Subscriber (Consumer) เมือ
Subscriber ได้รับ Event แล้ว Event ดังกล่าวจะหายไปและไม่สามารถเล่นซํา (Replay) ได้อีก รูปแบบโครงสร้างเช่น
นีจะทําให้เมือมี Subscriber ใหม่เข้ามาในระบบจะไม่สามารถอ่านค่า Event ก่อนหน้านันได้อีก
Event Streaming โครงสร้างรูปแบบนีจะมีการจัดเก็บ Event ในรูปแบบของ Logs ทีเรียงลําดับของเหตุการณ์ไว้ใน
สิงทีเรียกว่า partition การจัดเก็บนีจะเปนการจัดเก็บข้อมูลแบบถาวร (durable) ในช่วงระยะเวลาหนึง การเข้าถึง
Event ใน Logs จะควบคุมโดย client เองทีสามารถเลือกเข้าถึง Event จากตําแหน่งใด ๆ ใน Logs ก็ย่อมได้ การ
ทํางานบนโครงสร้างนี client ตัวใหม่ ๆ ทีเพิมเข้ามาในระบบจึงสามารถเข้าถึง Event ต่าง ๆ ทีผ่านมาแล้ว (Replay)
ได้
EVENT-DRIVEN ARCHITECTURE
Babel Coder
Babel Coder
https://www.babelcoder.com
Payment
Order
EVENT-DRIVEN ARCHITECTURE
PAYMENT_REQUESTED
Message Broker
Babel Coder
Babel Coder
https://www.babelcoder.com
Coupon
Payment
Order
EVENT-DRIVEN ARCHITECTURE
PAYMENT_CREATED
Event Logs
SYNCHRONOUS
PROTOCOL
Babel Coder
Babel Coder
https://www.babelcoder.com
Babel Coder
Babel Coder
https://www.babelcoder.com
RESTFUL API
Order Stock Payment
check stock
Calculate total price
2
3
POST <STOCK_IP>/products/<ID>
POST <PAYMENT_IP>/checkout
Babel Coder
Babel Coder
https://www.babelcoder.com
orders
products
users
GRAPHQL FEDERATION
GraphQL Federation เปนหนึงในความสามารถของ GraphQL Server ในการรวมหลาย GraphQL API ให้เปนหนึงเดียว เรียกว่า
Supergraph โดยเราสามารถแจกแจงเซอร์วิสต่าง ๆ เปน GraphQL API ย่อย ๆ เรียกว่า Subgraph ได้ เมือมีการร้องขอข้อมูลไปยัง
Supergraph การร้องขอนันจะมีการส่ง Query ย่อย แบบ Synchronous ไปยัง Subgraph ซึงเปนเซอร์วิสต่าง ๆ แล้วจึงรวมผลลัพธ์
กลับสู่ Client ต่อไป
Babel Coder
Babel Coder
https://www.babelcoder.com
GRAPHQL FEDERATION
Babel Coder
Babel Coder
https://www.babelcoder.com
GRPC
gRPC เปนรูปแบบหนึงของ Remote Procedure Call
ทีทําให้ client สามารถเรียกใช้งานเมธอดทางฝง server
ได้เสมือนเปนเมธอดของตนเอง โดยทีทัง client และ
server สามารถพัฒนาบนภาษาโปรแกรมทีแตกต่างกันได้
ในการสือสารระหว่าง client และ server นีต้องอาศัย
กระบวนการในการจัดเรียงข้อมูลให้อยู่ในฟอร์แมตทีสือสาร
กันได้ (Serialization) รูปแบบเช่นทีว่านี gRPC จะใช้
Proto Buffers เปนพืนฐาน การสือสารจะเกิดขึนได้โดย
อาศัย gRPC Stub ทางฝง client เพือแลกเปลียนและ
สือสารกันด้วย Protocol Buffers นันเอง https://grpc.io/
Babel Coder
Babel Coder
https://www.babelcoder.com
PROTOCOL BUFFERS
RPC Methods
Messages
Fields
user.proto
Babel Coder
Babel Coder
https://www.babelcoder.com
MESSAGE PATTERN
Message Pattern เปนรูปแบบการสือสารแบบ Request/Response บน Nest.js ทีกําหนดให้ฝงหนึงเปนเซอร์วิสผู้ส่ง
Message และอีกฝงหนึงเปนเซอร์วิสผู้รับ Message มาประมวลผลต่อ เมือเซอร์วิสผู้รับ Message ประมวลผลเสร็จจะ
ทําการส่งข้อมูลตอบกลับไปยังเซอร์วิสต้นทางทีส่ง Message มา การทํางานแบบ Message Pattern นีสามารถเปนได้ทัง
การสือสารแบบ Synchronous และ Asynchronous
Babel Coder
Babel Coder
https://www.babelcoder.com
order
stock
MESSAGE PATTERN
order.created
RABBITMQ
Babel Coder
Babel Coder
https://www.babelcoder.com
Babel Coder
Babel Coder
https://www.babelcoder.com
RABBITMQ
RabbitMQ เปนเครืองมือลําเลียง Message ประเภท Message Broker / Message Queue และ Streaming
Broker ทีสนับสนุนการทํางานหลาย Protocol เช่น AMQP 1.0 เปนต้น RabiitMQ สนับสนุนการทํางานกับ
Microservices ด้วยรูปแบบการวางโครงสร้างทางการสือสารทีหลากหลาย เช่น Pub/Sub Routing และ Topics
เปนต้น ตัวอย่างการสือสารต่อไปนีจะอิงตามรูปแบบของ AMQP เท่านัน
Babel Coder
Babel Coder
https://www.babelcoder.com
S2
S1
S3
Exchange
JARGON
Producer ทําหน้าทีส่ง Message
Exchange เปนตัวกลางในการตัดสินใจว่า Message ทีมาจาก
Producer ควรจัดส่งไปยัง Queue ใดโดยพิจารณาจาก Exchange
Type สําหรับ Exchange ถ้าไม่ระบุจะใช้ Default Exchange แทน
Queue เปน Buffer สําหรับจัดเก็บ
Message
Consumer เปนเซอร์วิสทีรับ Message ไป
ประมวลผล
Babel Coder
Babel Coder
https://www.babelcoder.com
C
P Exchange
QUEUE
Queue เปนรูปแบบของการกําหนดชือ Queue ปลายทางทีต้องการเชือมต่อโดย producer จะทําการระบุว่าต้องการส่งค่า
ไปยัง Queue ใด ในขณะเดียวกัน consumer ต้องทําการ subscribe บน Queue ทีมีชือเดียวกันด้วย ขันตอนการ
ทํางานนีไม่จําเปนต้องระบุ Exchange โดยจะใช้ Default Exchange แทน
Babel Coder
Babel Coder
https://www.babelcoder.com
MESSAGE ACKNOWLEDGMENT
โดยทัวไปแล้วเมือ Message ถูกส่งไปยัง consumer แล้ว RabbitMQ จะทําการลบ Message นันออกจาก Queue
อย่างไรก็ตามหาก Message ถูกส่งไปยัง consumer แล้ว แต่ consumer ยังประมวลผลไม่เสร็จและเกิดข้อผิดพลาดจน
ต้องหยุดการทํางาน กรณีเช่นนีจะทําให้ Message ดังกล่าวทีหายไปอย่างถาวรนันไม่สามารถนํากลับมาประมวลผลได้ใหม่อีก
ต่อไป กรณีเช่นนีเราควรตังค่า noAck เปน false บนฝงของ consumer / worker เพือบอกว่าไม่ให้ทําการลบ
Message โดยอัตโนมัติแต่จะทําการลบเมือ worker ทํางานเสร็จสินและทําการบอก Queue ว่าการทํางานเสร็จสินแล้วผ่าน
คําสัง channel.ack
Babel Coder
Babel Coder
https://www.babelcoder.com
C1
P Exchange
PREFETCH
การทํางานของ Task Queues นันจะกระจายการสัง Message แบบ Round-Robbin การทํางานแบบนีจะเกิดปญหา
เมือชุดของ Message ใดมีการใช้เวลาประมวลผลนานกว่าตัวอืน เช่น Message ลําดับเลขคู่มีการประมวลผลนาน ขณะที
Message เลขคีประมวลผลได้ไว หากมี 2 workers จะทําให้ worker แรกที Message ทีรอประมวลผลอยู่เยอะเพราะ
ทํางานได้ช้า
C2
H
e
a
v
y
H
e
a
v
y
light
Babel Coder
Babel Coder
https://www.babelcoder.com
C1
P Exchange
PREFETCH
กรณีดังกล่าวจึงควรบอก Queue ว่าให้ทําการส่ง Message ไปให้ worker ทีละ message โดยจะส่งให้เมือ message
นัน ack กลับมาแล้ว เมือกระทําเช่นนี Message ทีมีการทํางานได้ช้าก็จะได้รับการกระจายไปยัง worker ต่าง ๆ อย่างเท่า
เทียม เราสามารถกระทําสิงนีได้ด้วยการตังค่า prefetch เปน 1
C2
p
r
e
f
e
t
c
h
=
1
prefetch=1
Babel Coder
Babel Coder
https://www.babelcoder.com
MESSAGE DURABILITY
กรณีที RabbitMQ หยุดทํางาน เช่น เกิดข้อผิดพลาดจนหยุดทํางาน โดยทัวไปแล้ว Queue และ Messages ใน Queue
จะถูกลบทิง เพือปองกันการสูญเสียทัง Queue และ Messages เราต้องดําเนินการสองขันตอน ดังนี
ประกาศให้ Queue เปนแบบถาวรด้วยการตังค่า durable เปน true หากมี Queue ถูกสร้างไว้แล้วต้องทําการลบ
Queue ดังกล่าวทิงก่อน ค่า durable นีจึงจะสามารถทํางานได้
ประกาศให้ Message ถูกจัดเก็บลงดิสก์ผ่านการตังค่า persistent เปน true เมือทําการส่ง Message
Babel Coder
Babel Coder
https://www.babelcoder.com
PUBLISH / SUBSCRIBE
Exchange Type แบบ fanout เปนรูปแบบทีเมือ Exchange ได้รับ Message มาแล้วจะทําการ Broadcast
Message นันไปยัง Queue ปลายทางทังหมด นันทําให้ consumers ปลายทางทังหมดได้รับ Messages เหล่านันไป
ประมวลผลของใครของมันได้
C1
P
C2
Exchange
(fanout)
Babel Coder
Babel Coder
https://www.babelcoder.com
DIRECT
Exchange Type แบบ direct เปนรูปแบบที Queue ต้องทําการ Bind กับ Exchange ด้วย Routing Key ในการส่ง
Message จาก product จะต้องระบุว่า Message นัน ๆ มี Routing Key เปนอะไร ส่วนของ Exchange จะทําการ
พิจารณา Routing Key นันก่อนส่งไปยัง Queue ปลายทางทีผูกความสัมพันธ์กับ Routing Key นัน ๆ ไว้
C1
P
C2
Exchange
(direct)
error
fatal
info
Babel Coder
Babel Coder
https://www.babelcoder.com
TOPIC
Exchange Type แบบ topic เปนรูปแบบที Routing Key ไม่ใช่ข้อความแบบเจาะจงเหมือน direct แต่เปนข้อความทีคัน
กันด้วย dot เช่น *.order.* เปนต้น Routing Key ดังกล่าวมีสองสัญลักษณะทีถูกตีความเปนพิเศษ ดังนี
เครืองหมาย * (star) ใช้แทนคําใด ๆ 1 คํา
เครืองหมาย # (hash) ใช้แทนคําตังแต่ศุนย์คําขึนไป
Babel Coder
Babel Coder
https://www.babelcoder.com
TOPIC
C1
P
C2
Exchange
(topic)
*.em
ail.*
*.notification.*
*.log.#
APACHE KAFKA
Babel Coder
Babel Coder
https://www.babelcoder.com
Babel Coder
Babel Coder
https://www.babelcoder.com
P1
P1
C1
C2
APACHE KAFKA
Apache Kafka คือระบบการจัดเก็บข้อมูลแบบกระจายเพือนําเข้าและประมวลผลข้อมูลในลักษณะของ Event ทีไหลต่อ
เนืองแบบเรียลไทม์ (Event Streaming) ข้อมูลการสตรีมเปนข้อมูลทีสร้างขึนอย่างต่อเนืองโดยแหล่งข้อมูลทีเรียกว่า
Producer ได้อย่างไม่จํากัดจํานวน โดยข้อมูลนีจะถูกจัดเก็บในรูปแบบของ Event Logs ทีพร้อมให้ Consumers ไม่จํากัด
จํานวนเข้าถึงเพือประมวลผลต่อไป
Event Logs
Babel Coder
Babel Coder
https://www.babelcoder.com
P1
P1
C1
C2
TOPIC
กลุ่มของ Events ทีสัมพันธ์กันจะถูกจัดเก็บในสิงทีเรียกว่า Topic ซึงเปรียบเสมือนเปนโฟลเดอร์สําหรับจัดเก็บ Event ที
สอดคล้องกัน
Order Topic
Payment Topic
Babel Coder
Babel Coder
https://www.babelcoder.com
P1
C2
TOPIC
Event ทีจัดเก็บใน Topic ถ้าจัดเก็บเปนก้อนเดียวจะไม่สามารถมีหลาย Consumer มาช่วยกันประมวลผลได้ ด้วยเหตุนี
Topic จึงสามารถแบ่งแยกออกมาเปน Partition ได้ โดยแต่ละ Partition สามารถกําหนด Consumer เข้าไปช่วย
ประมวลได้นันเอง
Order Topic
Partition 0
Partition 1 C3
Babel Coder
Babel Coder
https://www.babelcoder.com
RECORDS
Event ถือเปนข้อมูลหรือ Record ทีประกอบด้วยข้อมูลทีบรรจุอยู่ภายในได้แก่
Event Key เช่น Paul, Tuk
Event Value เช่น “Let it go”
Event Timestamp เช่น July. 30, 2024 at 3:03 p.m.
ข้อมูล Metadata ใน Headers
Event Record
Babel Coder
Babel Coder
https://www.babelcoder.com
OFFSETS
Record ใด ๆ ใน Partition จะมีค่าตําแหน่งทีแสดงลําดับของ Record นัน ๆ ใน Partition เราเรียกค่านีว่า Offset
Offset
0
1
2
3
4
5
6
7
8
Babel Coder
Babel Coder
https://www.babelcoder.com
PARTITION KEY
ในการสร้าง Event Record แล้วทําการ publish สู่ Topic ใด ๆ Topic จะทําการพิจารณาจาก Partition Key ว่าจะส่ง
Record นันไปจัดเก็บใน Partition ไหน ถ้าไม่มีการระบุ Topic จะทําการสุ่ม Partition ในการจัดเก็บ จากตัวอย่างข้างล่าง
ถ้าทําการสุ่ม Partition จะมีโอกาสทีขันตอนการทํางานจะผิด เช่น (PAUL) ORDER_UPDATED จะถูกทํางานก่อน (PAUL)
ORDER_CREATED ซึงเปนไปไม่ได้
(PAUL)
ORDER_CREATED
(TUK)
ORDER_CANCELLED
(TUK)
ORDER_CREATED
(TUK)
ORDER_UPDATED
(PAUL)
ORDER_CANCELLED
(PAUL)
ORDER_UPDATED
Random
Partition
C1
C2
Babel Coder
Babel Coder
https://www.babelcoder.com
PARTITION KEY
ถ้าเรากําหนด Key ทีเหมือนกันจะเปนการการันตีว่า Event นันจะถูกส่งไปยัง Partition เดียวกัน เปนผลให้ลําดับของ
Event สําหรับ Key นัน ๆ เปนไปอย่างถูกต้อง เช่นตัวอย่างข้างล่างนีใช้ Key เปนชือ
(PAUL)
ORDER_CANCELLED
(PAUL)
ORDER_UPDATED
(PAUL)
ORDER_CREATED
(TUK)
ORDER_CANCELLED
(TUK)
ORDER_UPDATED
(TUK)
ORDER_CREATED
Random
Partition
C1
C2
Babel Coder
Babel Coder
https://www.babelcoder.com
PARTITION KEY
Producer สามารถส่ง Event กระจายไป
ยัง Partition ต่าง ๆ ได้ตามค่า Key หรือ
ทําการ Random ในกรณีทีไม่ระบุค่า
Key
Babel Coder
Babel Coder
https://www.babelcoder.com
Partition 0
Partition 1
CONSUMER GROUP
Partition ออกแบบมาเพือให้สามารถทํางานแบบขนานได้ดดยอาศัย Consumer หลาย ๆ ตัวทีรวมกันเปน Consumer
Group ทีมี ID เดียวกันเรียกว่า Consumer Group ID กรณีที Group มีเพียง Consumer เดียวนันจะทําให้ทุก ๆ
Record จากทุก ๆ Partition ถูกประมวลผลด้วย Consumer เดียวนัน
Topic Consumer Group 1
Consumer 1
Babel Coder
Babel Coder
https://www.babelcoder.com
Partition 0
Partition 1
CONSUMER GROUP
หากภายใต้ Group เดียวกันมี Consumer หลายตัวและมีจํานวนเท่ากับ Partition ทีมีอยู่ Consumer เหล่านันจะได้รับ
การจับคู่แบบ 1 ต่อ 1
Topic Consumer Group 1
Consumer 1
Consumer 2
Babel Coder
Babel Coder
https://www.babelcoder.com
Partition 0
Partition 1
CONSUMER GROUP
กรณีที Consumer มีมากกว่าจํานวน Partition จะมี Consumer ส่วนเกินทีอยู่ในสถานะ Idle และไม่ได้รับการประมวล
ผล Event ทีเกิดขึนจาก Partition ใด ๆ
Topic Consumer Group 1
Consumer 1
Consumer 2
Consumer 3
Babel Coder
Babel Coder
https://www.babelcoder.com
CONSUMER GROUP
เราสามารถมีหลาย Consumer Group ได้ โดย Consumer ในแต่ละ Group จะแยกกันอ่านค่า Record โดยไม่สนว่า
Cunsumer ใน Group อืนจะอ่านค่า Record นัน ๆ แล้วหรือไม่
Partition 0
Partition 1
Topic Consumer Group 1
Consumer 1
Consumer 2
Consumer Group 2
Consumer 1
Consumer 2
Babel Coder
Babel Coder
https://www.babelcoder.com
CONSUMER GROUP
แต่ละ Consumer Group จะแยกกันอ่าน Record และสามารถจดจํา Offset ทีอ่านล่าสุดแล้วแตกต่างกันไปในแต่ละ
Group ข้อมูลของ Offset ที Cunsumer แต่ละตัวทําการอ่านจะบันทึกใน Topic ทีมีชือว่า __consumer_offsets
Topic Consumer Group 1
Consumer 1
Consumer 2
Consumer Group 2
Consumer 1
Consumer 2
Babel Coder
Babel Coder
https://www.babelcoder.com
KAFKA BROKERS
หาก Partition ทังหมดถูกจัดเก็บบนเซิฟเวอร์แค่ตัวเดียวเมือเซิฟเวอร์นันไม่สามารถทํางานได้ ระบบทังหมดย่อมล้มเหลว
Kafka จึงมีหลักการของ Brokers สําหรับแก้ปญหานี
Broker คือ Node หรือเครืองเซิฟเวอร์บนระบบของ Kafka ในการใช้งานจริงจะต้องมี Brokers มากกว่า 1 ตัว Broker จะ
จัดเก็บ Partition ของ Topic เอาไว้ในฐานะของ Log File ในกระบวนการทํางานนัน Producer จะส่ง Message ไปยัง
Broker โดย Broker จะจัดเก็บลง Partition แบบกระจายไปหลาย Broker ส่วนของ Consumer จะทําการเชือมต่อกับ
Broker เพือร้องขอข้อมูลจาก Topic ทีสนใจ
Babel Coder
Babel Coder
https://www.babelcoder.com
Producer 1 Producer 2 Producer 3
KAFKA BROKERS
Kafka
Cluster
Broker 1
Topic 1
Partition 1
Partition 2
Topic 2
Partition 1
Partition 2
Topic 3
Broker 2 Broker 3
Partition 1
Partition 2
Consumer 1
Consumer 2
Consumer 3
Babel Coder
Babel Coder
https://www.babelcoder.com
KAFKA BROKERS
Kafka
Cluster
Broker 1
Topic 1
Partition 1
(Leader)
Partition 2
Topic 2
Partition 1
Partition 2
(Leader)
Topic 3
Broker 2 Broker 3
Partition 1
Partition 2
Client
w
r
i
t
e
replica write
replica write

More Related Content

More from NuttavutThongjor1 (20)

PDF
Modern DevOps Day 5.pdfModern DevOps Day 5.pdf
NuttavutThongjor1
 
PDF
Modern DevOps Day 4.pdfModern DevOps Day 4.pdf
NuttavutThongjor1
 
PDF
Modern DevOps Day 3.pdfModern DevOps Day 3.pdf
NuttavutThongjor1
 
PDF
Modern DevOps Day 2.pdfModern DevOps Day 2.pdf
NuttavutThongjor1
 
PDF
Modern DevOps Day 1.pdfModern DevOps Day 1.pdfModern DevOps Day 1.pdf
NuttavutThongjor1
 
PDF
misc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdf
NuttavutThongjor1
 
PDF
Nest.js Microservices.pdfNest.js Microservices.pdfNest.js Microservices.pdfNe...
NuttavutThongjor1
 
PDF
GraphQL.pdfGraphQL.pdfGraphQL.pdfGraphQL.pdfGraphQL.pdfGraphQL.pdf
NuttavutThongjor1
 
PDF
Nest.js RESTful API development.pdf Nest.js RESTful API development.pdf
NuttavutThongjor1
 
PDF
Nest.js RESTful API development.pdfNest.js RESTful API development.pdf
NuttavutThongjor1
 
PDF
Recap JavaScript and TypeScript.pdf Recap JavaScript and TypeScript.pdf
NuttavutThongjor1
 
PDF
Next.js web development.pdfNext.js web development.pdfNext.js web development...
NuttavutThongjor1
 
PDF
Recap JavaScript and TypeScript.pdf Recap JavaScript and TypeScript.pdf
NuttavutThongjor1
 
PDF
Intro to Modern DevOps.pdfIntro to Modern DevOps.pdfIntro to Modern DevOps.pdf
NuttavutThongjor1
 
PDF
10 วัฒนธรรมองค์กรของ DevOps.pdf10 วัฒนธรรมองค์กรของ DevOps.pdf
NuttavutThongjor1
 
PDF
9 logging and monitoring.pdf 9 logging and monitoring.pdf
NuttavutThongjor1
 
PDF
8 iac.pdf 8 iac.pdf8 iac.pdf8 iac.pdf8 iac.pdf8 iac.pdf8 iac.pdf
NuttavutThongjor1
 
PDF
7 cicd.pdf 7 cicd.pdf 7 cicd.pdf 7 cicd.pdf
NuttavutThongjor1
 
PDF
6 GitOps คืออะไร.pdf 6 GitOps คืออะไร.pdf 6 GitOps คืออะไร.pdf
NuttavutThongjor1
 
PDF
5 Kubernetes.pdf 5 Kubernetes.pdf 5 Kubernetes.pdf
NuttavutThongjor1
 
Modern DevOps Day 5.pdfModern DevOps Day 5.pdf
NuttavutThongjor1
 
Modern DevOps Day 4.pdfModern DevOps Day 4.pdf
NuttavutThongjor1
 
Modern DevOps Day 3.pdfModern DevOps Day 3.pdf
NuttavutThongjor1
 
Modern DevOps Day 2.pdfModern DevOps Day 2.pdf
NuttavutThongjor1
 
Modern DevOps Day 1.pdfModern DevOps Day 1.pdfModern DevOps Day 1.pdf
NuttavutThongjor1
 
misc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdfmisc.pdf
NuttavutThongjor1
 
Nest.js Microservices.pdfNest.js Microservices.pdfNest.js Microservices.pdfNe...
NuttavutThongjor1
 
GraphQL.pdfGraphQL.pdfGraphQL.pdfGraphQL.pdfGraphQL.pdfGraphQL.pdf
NuttavutThongjor1
 
Nest.js RESTful API development.pdf Nest.js RESTful API development.pdf
NuttavutThongjor1
 
Nest.js RESTful API development.pdfNest.js RESTful API development.pdf
NuttavutThongjor1
 
Recap JavaScript and TypeScript.pdf Recap JavaScript and TypeScript.pdf
NuttavutThongjor1
 
Next.js web development.pdfNext.js web development.pdfNext.js web development...
NuttavutThongjor1
 
Recap JavaScript and TypeScript.pdf Recap JavaScript and TypeScript.pdf
NuttavutThongjor1
 
Intro to Modern DevOps.pdfIntro to Modern DevOps.pdfIntro to Modern DevOps.pdf
NuttavutThongjor1
 
10 วัฒนธรรมองค์กรของ DevOps.pdf10 วัฒนธรรมองค์กรของ DevOps.pdf
NuttavutThongjor1
 
9 logging and monitoring.pdf 9 logging and monitoring.pdf
NuttavutThongjor1
 
8 iac.pdf 8 iac.pdf8 iac.pdf8 iac.pdf8 iac.pdf8 iac.pdf8 iac.pdf
NuttavutThongjor1
 
7 cicd.pdf 7 cicd.pdf 7 cicd.pdf 7 cicd.pdf
NuttavutThongjor1
 
6 GitOps คืออะไร.pdf 6 GitOps คืออะไร.pdf 6 GitOps คืออะไร.pdf
NuttavutThongjor1
 
5 Kubernetes.pdf 5 Kubernetes.pdf 5 Kubernetes.pdf
NuttavutThongjor1
 

Nest.js Microservices (1).pdf Nest.js Microservices (1).pdfNest.js Microservices (1).pdf

  • 2. Babel Coder Babel Coder https://www.babelcoder.com COMMUNICATION TYPES การสือสารระหว่างเซอร์วิสสามารถจําแนกได้เปน 2 ประเภท หากจําแนกตาม Protocol จะสามารถจําแนกได้ดังนี Synchronous Protocol การสือสารประเภทนีอยู่ในรูปแบบของ Request/Response โดยหลักแล้วมักเปนการ เชือมต่อผ่าน HTTP หรือ TCP มีลักษณะการทํางานที client ทําการส่ง Request ไปยังเซอร์วิสอืนแล้วต้องรอเซอร์วิส นันประมวลผลจนเสร็จสินจึงได้ผลลัพธ์ตอบกลับมา ระหว่างขันตอนทีเกิดขึน client จะถูกบลอคการทํางานจนกว่าขัน ตอนทังหมดจะเสร็จสิน Asynchronous Protocol การสือสารประเภทนี client จะทําการส่ง message ไปยังเซอร์วิสปลายทางโดยไม่รอ ผลลัพธ์ของการทํางานนัน message ทีกล่าวถึงนีโดยมากแล้วจะอยู่ในรูปแบบของ Event โดยมี protocol ทีเข้ามา เกียวข้อง เช่น AMQP เปนต้น
  • 3. Babel Coder Babel Coder https://www.babelcoder.com COMMUNICATION TYPES การสือสารระหว่างเซอร์วิสยังสามารถจําแนกประเภทตามจํานวนของผู้รับ (receivers) ได้ ดังนี Single Receiver แต่ละ Request จะถูกประมวลผลโดยเซอร์วิสหรือ Receiver เพียงตัวเดียว เช่น รูปแบบของ Command Pattern Multiple Receivers รูปแบบนี Request ใด ๆ จะได้รับการประมวลผลโดยเซอร์วิสหรือ Receivers ตังแต่ศูนย์ตัว ขึนไป โดยมีลักษณะการสือสารเปนแบบ Asynchronous ตัวอย่างเช่น รูปบบ pub/sub ในสถาปตยกรรมแบบ Event-Driven Architecture
  • 6. Babel Coder Babel Coder https://www.babelcoder.com สถาปตยกรรมการขับเคลือนด้วยเหตุการณ์ เปนรูปแบบของการสือสารระหว่างเซอร์วิสทีประกอบไปด้วย Event Producers เปนเซอร์วิสผู้สร้างลําดับของเหตุการณ์ (Stream of Events) Event คือเหตุการณ์ทีเกิดขึนประกอบด้วย Type คือชนิดข้องเหตุการณ์ และ Message คือข้อมูลทีส่งไปพร้อมกับ เหตุการณ์นัน ๆ Event Consumers คือเซอร์วิสปลายทางทีทําการดึง Event หรือเหตุการณ์ทีเกียวข้องมาประมวลผล EVENT-DRIVEN ARCHITECTURE
  • 7. Babel Coder Babel Coder https://www.babelcoder.com สถาปตยกรรมการขับเคลือนด้วยเหตุการณ์ สามารถเลือกรูปแบบการทํางานได้ ดังนี Pub/Sub การทํางานรูปแบบนีโครงสร้างของระบบการสือสารจะบันทึก Subscriptions กล่าวคือเมือ Event ได้รับ การเผยแพร่ผ่านโครงสร้างระบบ ระบบจะทําการจัดส่ง Event ดังกล่าวไปยัง Subscriber (Consumer) เมือ Subscriber ได้รับ Event แล้ว Event ดังกล่าวจะหายไปและไม่สามารถเล่นซํา (Replay) ได้อีก รูปแบบโครงสร้างเช่น นีจะทําให้เมือมี Subscriber ใหม่เข้ามาในระบบจะไม่สามารถอ่านค่า Event ก่อนหน้านันได้อีก Event Streaming โครงสร้างรูปแบบนีจะมีการจัดเก็บ Event ในรูปแบบของ Logs ทีเรียงลําดับของเหตุการณ์ไว้ใน สิงทีเรียกว่า partition การจัดเก็บนีจะเปนการจัดเก็บข้อมูลแบบถาวร (durable) ในช่วงระยะเวลาหนึง การเข้าถึง Event ใน Logs จะควบคุมโดย client เองทีสามารถเลือกเข้าถึง Event จากตําแหน่งใด ๆ ใน Logs ก็ย่อมได้ การ ทํางานบนโครงสร้างนี client ตัวใหม่ ๆ ทีเพิมเข้ามาในระบบจึงสามารถเข้าถึง Event ต่าง ๆ ทีผ่านมาแล้ว (Replay) ได้ EVENT-DRIVEN ARCHITECTURE
  • 11. Babel Coder Babel Coder https://www.babelcoder.com RESTFUL API Order Stock Payment check stock Calculate total price 2 3 POST <STOCK_IP>/products/<ID> POST <PAYMENT_IP>/checkout
  • 12. Babel Coder Babel Coder https://www.babelcoder.com orders products users GRAPHQL FEDERATION GraphQL Federation เปนหนึงในความสามารถของ GraphQL Server ในการรวมหลาย GraphQL API ให้เปนหนึงเดียว เรียกว่า Supergraph โดยเราสามารถแจกแจงเซอร์วิสต่าง ๆ เปน GraphQL API ย่อย ๆ เรียกว่า Subgraph ได้ เมือมีการร้องขอข้อมูลไปยัง Supergraph การร้องขอนันจะมีการส่ง Query ย่อย แบบ Synchronous ไปยัง Subgraph ซึงเปนเซอร์วิสต่าง ๆ แล้วจึงรวมผลลัพธ์ กลับสู่ Client ต่อไป
  • 14. Babel Coder Babel Coder https://www.babelcoder.com GRPC gRPC เปนรูปแบบหนึงของ Remote Procedure Call ทีทําให้ client สามารถเรียกใช้งานเมธอดทางฝง server ได้เสมือนเปนเมธอดของตนเอง โดยทีทัง client และ server สามารถพัฒนาบนภาษาโปรแกรมทีแตกต่างกันได้ ในการสือสารระหว่าง client และ server นีต้องอาศัย กระบวนการในการจัดเรียงข้อมูลให้อยู่ในฟอร์แมตทีสือสาร กันได้ (Serialization) รูปแบบเช่นทีว่านี gRPC จะใช้ Proto Buffers เปนพืนฐาน การสือสารจะเกิดขึนได้โดย อาศัย gRPC Stub ทางฝง client เพือแลกเปลียนและ สือสารกันด้วย Protocol Buffers นันเอง https://grpc.io/
  • 16. Babel Coder Babel Coder https://www.babelcoder.com MESSAGE PATTERN Message Pattern เปนรูปแบบการสือสารแบบ Request/Response บน Nest.js ทีกําหนดให้ฝงหนึงเปนเซอร์วิสผู้ส่ง Message และอีกฝงหนึงเปนเซอร์วิสผู้รับ Message มาประมวลผลต่อ เมือเซอร์วิสผู้รับ Message ประมวลผลเสร็จจะ ทําการส่งข้อมูลตอบกลับไปยังเซอร์วิสต้นทางทีส่ง Message มา การทํางานแบบ Message Pattern นีสามารถเปนได้ทัง การสือสารแบบ Synchronous และ Asynchronous
  • 19. Babel Coder Babel Coder https://www.babelcoder.com RABBITMQ RabbitMQ เปนเครืองมือลําเลียง Message ประเภท Message Broker / Message Queue และ Streaming Broker ทีสนับสนุนการทํางานหลาย Protocol เช่น AMQP 1.0 เปนต้น RabiitMQ สนับสนุนการทํางานกับ Microservices ด้วยรูปแบบการวางโครงสร้างทางการสือสารทีหลากหลาย เช่น Pub/Sub Routing และ Topics เปนต้น ตัวอย่างการสือสารต่อไปนีจะอิงตามรูปแบบของ AMQP เท่านัน
  • 20. Babel Coder Babel Coder https://www.babelcoder.com S2 S1 S3 Exchange JARGON Producer ทําหน้าทีส่ง Message Exchange เปนตัวกลางในการตัดสินใจว่า Message ทีมาจาก Producer ควรจัดส่งไปยัง Queue ใดโดยพิจารณาจาก Exchange Type สําหรับ Exchange ถ้าไม่ระบุจะใช้ Default Exchange แทน Queue เปน Buffer สําหรับจัดเก็บ Message Consumer เปนเซอร์วิสทีรับ Message ไป ประมวลผล
  • 21. Babel Coder Babel Coder https://www.babelcoder.com C P Exchange QUEUE Queue เปนรูปแบบของการกําหนดชือ Queue ปลายทางทีต้องการเชือมต่อโดย producer จะทําการระบุว่าต้องการส่งค่า ไปยัง Queue ใด ในขณะเดียวกัน consumer ต้องทําการ subscribe บน Queue ทีมีชือเดียวกันด้วย ขันตอนการ ทํางานนีไม่จําเปนต้องระบุ Exchange โดยจะใช้ Default Exchange แทน
  • 22. Babel Coder Babel Coder https://www.babelcoder.com MESSAGE ACKNOWLEDGMENT โดยทัวไปแล้วเมือ Message ถูกส่งไปยัง consumer แล้ว RabbitMQ จะทําการลบ Message นันออกจาก Queue อย่างไรก็ตามหาก Message ถูกส่งไปยัง consumer แล้ว แต่ consumer ยังประมวลผลไม่เสร็จและเกิดข้อผิดพลาดจน ต้องหยุดการทํางาน กรณีเช่นนีจะทําให้ Message ดังกล่าวทีหายไปอย่างถาวรนันไม่สามารถนํากลับมาประมวลผลได้ใหม่อีก ต่อไป กรณีเช่นนีเราควรตังค่า noAck เปน false บนฝงของ consumer / worker เพือบอกว่าไม่ให้ทําการลบ Message โดยอัตโนมัติแต่จะทําการลบเมือ worker ทํางานเสร็จสินและทําการบอก Queue ว่าการทํางานเสร็จสินแล้วผ่าน คําสัง channel.ack
  • 23. Babel Coder Babel Coder https://www.babelcoder.com C1 P Exchange PREFETCH การทํางานของ Task Queues นันจะกระจายการสัง Message แบบ Round-Robbin การทํางานแบบนีจะเกิดปญหา เมือชุดของ Message ใดมีการใช้เวลาประมวลผลนานกว่าตัวอืน เช่น Message ลําดับเลขคู่มีการประมวลผลนาน ขณะที Message เลขคีประมวลผลได้ไว หากมี 2 workers จะทําให้ worker แรกที Message ทีรอประมวลผลอยู่เยอะเพราะ ทํางานได้ช้า C2 H e a v y H e a v y light
  • 24. Babel Coder Babel Coder https://www.babelcoder.com C1 P Exchange PREFETCH กรณีดังกล่าวจึงควรบอก Queue ว่าให้ทําการส่ง Message ไปให้ worker ทีละ message โดยจะส่งให้เมือ message นัน ack กลับมาแล้ว เมือกระทําเช่นนี Message ทีมีการทํางานได้ช้าก็จะได้รับการกระจายไปยัง worker ต่าง ๆ อย่างเท่า เทียม เราสามารถกระทําสิงนีได้ด้วยการตังค่า prefetch เปน 1 C2 p r e f e t c h = 1 prefetch=1
  • 25. Babel Coder Babel Coder https://www.babelcoder.com MESSAGE DURABILITY กรณีที RabbitMQ หยุดทํางาน เช่น เกิดข้อผิดพลาดจนหยุดทํางาน โดยทัวไปแล้ว Queue และ Messages ใน Queue จะถูกลบทิง เพือปองกันการสูญเสียทัง Queue และ Messages เราต้องดําเนินการสองขันตอน ดังนี ประกาศให้ Queue เปนแบบถาวรด้วยการตังค่า durable เปน true หากมี Queue ถูกสร้างไว้แล้วต้องทําการลบ Queue ดังกล่าวทิงก่อน ค่า durable นีจึงจะสามารถทํางานได้ ประกาศให้ Message ถูกจัดเก็บลงดิสก์ผ่านการตังค่า persistent เปน true เมือทําการส่ง Message
  • 26. Babel Coder Babel Coder https://www.babelcoder.com PUBLISH / SUBSCRIBE Exchange Type แบบ fanout เปนรูปแบบทีเมือ Exchange ได้รับ Message มาแล้วจะทําการ Broadcast Message นันไปยัง Queue ปลายทางทังหมด นันทําให้ consumers ปลายทางทังหมดได้รับ Messages เหล่านันไป ประมวลผลของใครของมันได้ C1 P C2 Exchange (fanout)
  • 27. Babel Coder Babel Coder https://www.babelcoder.com DIRECT Exchange Type แบบ direct เปนรูปแบบที Queue ต้องทําการ Bind กับ Exchange ด้วย Routing Key ในการส่ง Message จาก product จะต้องระบุว่า Message นัน ๆ มี Routing Key เปนอะไร ส่วนของ Exchange จะทําการ พิจารณา Routing Key นันก่อนส่งไปยัง Queue ปลายทางทีผูกความสัมพันธ์กับ Routing Key นัน ๆ ไว้ C1 P C2 Exchange (direct) error fatal info
  • 28. Babel Coder Babel Coder https://www.babelcoder.com TOPIC Exchange Type แบบ topic เปนรูปแบบที Routing Key ไม่ใช่ข้อความแบบเจาะจงเหมือน direct แต่เปนข้อความทีคัน กันด้วย dot เช่น *.order.* เปนต้น Routing Key ดังกล่าวมีสองสัญลักษณะทีถูกตีความเปนพิเศษ ดังนี เครืองหมาย * (star) ใช้แทนคําใด ๆ 1 คํา เครืองหมาย # (hash) ใช้แทนคําตังแต่ศุนย์คําขึนไป
  • 30. APACHE KAFKA Babel Coder Babel Coder https://www.babelcoder.com
  • 31. Babel Coder Babel Coder https://www.babelcoder.com P1 P1 C1 C2 APACHE KAFKA Apache Kafka คือระบบการจัดเก็บข้อมูลแบบกระจายเพือนําเข้าและประมวลผลข้อมูลในลักษณะของ Event ทีไหลต่อ เนืองแบบเรียลไทม์ (Event Streaming) ข้อมูลการสตรีมเปนข้อมูลทีสร้างขึนอย่างต่อเนืองโดยแหล่งข้อมูลทีเรียกว่า Producer ได้อย่างไม่จํากัดจํานวน โดยข้อมูลนีจะถูกจัดเก็บในรูปแบบของ Event Logs ทีพร้อมให้ Consumers ไม่จํากัด จํานวนเข้าถึงเพือประมวลผลต่อไป Event Logs
  • 32. Babel Coder Babel Coder https://www.babelcoder.com P1 P1 C1 C2 TOPIC กลุ่มของ Events ทีสัมพันธ์กันจะถูกจัดเก็บในสิงทีเรียกว่า Topic ซึงเปรียบเสมือนเปนโฟลเดอร์สําหรับจัดเก็บ Event ที สอดคล้องกัน Order Topic Payment Topic
  • 33. Babel Coder Babel Coder https://www.babelcoder.com P1 C2 TOPIC Event ทีจัดเก็บใน Topic ถ้าจัดเก็บเปนก้อนเดียวจะไม่สามารถมีหลาย Consumer มาช่วยกันประมวลผลได้ ด้วยเหตุนี Topic จึงสามารถแบ่งแยกออกมาเปน Partition ได้ โดยแต่ละ Partition สามารถกําหนด Consumer เข้าไปช่วย ประมวลได้นันเอง Order Topic Partition 0 Partition 1 C3
  • 34. Babel Coder Babel Coder https://www.babelcoder.com RECORDS Event ถือเปนข้อมูลหรือ Record ทีประกอบด้วยข้อมูลทีบรรจุอยู่ภายในได้แก่ Event Key เช่น Paul, Tuk Event Value เช่น “Let it go” Event Timestamp เช่น July. 30, 2024 at 3:03 p.m. ข้อมูล Metadata ใน Headers Event Record
  • 35. Babel Coder Babel Coder https://www.babelcoder.com OFFSETS Record ใด ๆ ใน Partition จะมีค่าตําแหน่งทีแสดงลําดับของ Record นัน ๆ ใน Partition เราเรียกค่านีว่า Offset Offset 0 1 2 3 4 5 6 7 8
  • 36. Babel Coder Babel Coder https://www.babelcoder.com PARTITION KEY ในการสร้าง Event Record แล้วทําการ publish สู่ Topic ใด ๆ Topic จะทําการพิจารณาจาก Partition Key ว่าจะส่ง Record นันไปจัดเก็บใน Partition ไหน ถ้าไม่มีการระบุ Topic จะทําการสุ่ม Partition ในการจัดเก็บ จากตัวอย่างข้างล่าง ถ้าทําการสุ่ม Partition จะมีโอกาสทีขันตอนการทํางานจะผิด เช่น (PAUL) ORDER_UPDATED จะถูกทํางานก่อน (PAUL) ORDER_CREATED ซึงเปนไปไม่ได้ (PAUL) ORDER_CREATED (TUK) ORDER_CANCELLED (TUK) ORDER_CREATED (TUK) ORDER_UPDATED (PAUL) ORDER_CANCELLED (PAUL) ORDER_UPDATED Random Partition C1 C2
  • 37. Babel Coder Babel Coder https://www.babelcoder.com PARTITION KEY ถ้าเรากําหนด Key ทีเหมือนกันจะเปนการการันตีว่า Event นันจะถูกส่งไปยัง Partition เดียวกัน เปนผลให้ลําดับของ Event สําหรับ Key นัน ๆ เปนไปอย่างถูกต้อง เช่นตัวอย่างข้างล่างนีใช้ Key เปนชือ (PAUL) ORDER_CANCELLED (PAUL) ORDER_UPDATED (PAUL) ORDER_CREATED (TUK) ORDER_CANCELLED (TUK) ORDER_UPDATED (TUK) ORDER_CREATED Random Partition C1 C2
  • 38. Babel Coder Babel Coder https://www.babelcoder.com PARTITION KEY Producer สามารถส่ง Event กระจายไป ยัง Partition ต่าง ๆ ได้ตามค่า Key หรือ ทําการ Random ในกรณีทีไม่ระบุค่า Key
  • 39. Babel Coder Babel Coder https://www.babelcoder.com Partition 0 Partition 1 CONSUMER GROUP Partition ออกแบบมาเพือให้สามารถทํางานแบบขนานได้ดดยอาศัย Consumer หลาย ๆ ตัวทีรวมกันเปน Consumer Group ทีมี ID เดียวกันเรียกว่า Consumer Group ID กรณีที Group มีเพียง Consumer เดียวนันจะทําให้ทุก ๆ Record จากทุก ๆ Partition ถูกประมวลผลด้วย Consumer เดียวนัน Topic Consumer Group 1 Consumer 1
  • 40. Babel Coder Babel Coder https://www.babelcoder.com Partition 0 Partition 1 CONSUMER GROUP หากภายใต้ Group เดียวกันมี Consumer หลายตัวและมีจํานวนเท่ากับ Partition ทีมีอยู่ Consumer เหล่านันจะได้รับ การจับคู่แบบ 1 ต่อ 1 Topic Consumer Group 1 Consumer 1 Consumer 2
  • 41. Babel Coder Babel Coder https://www.babelcoder.com Partition 0 Partition 1 CONSUMER GROUP กรณีที Consumer มีมากกว่าจํานวน Partition จะมี Consumer ส่วนเกินทีอยู่ในสถานะ Idle และไม่ได้รับการประมวล ผล Event ทีเกิดขึนจาก Partition ใด ๆ Topic Consumer Group 1 Consumer 1 Consumer 2 Consumer 3
  • 42. Babel Coder Babel Coder https://www.babelcoder.com CONSUMER GROUP เราสามารถมีหลาย Consumer Group ได้ โดย Consumer ในแต่ละ Group จะแยกกันอ่านค่า Record โดยไม่สนว่า Cunsumer ใน Group อืนจะอ่านค่า Record นัน ๆ แล้วหรือไม่ Partition 0 Partition 1 Topic Consumer Group 1 Consumer 1 Consumer 2 Consumer Group 2 Consumer 1 Consumer 2
  • 43. Babel Coder Babel Coder https://www.babelcoder.com CONSUMER GROUP แต่ละ Consumer Group จะแยกกันอ่าน Record และสามารถจดจํา Offset ทีอ่านล่าสุดแล้วแตกต่างกันไปในแต่ละ Group ข้อมูลของ Offset ที Cunsumer แต่ละตัวทําการอ่านจะบันทึกใน Topic ทีมีชือว่า __consumer_offsets Topic Consumer Group 1 Consumer 1 Consumer 2 Consumer Group 2 Consumer 1 Consumer 2
  • 44. Babel Coder Babel Coder https://www.babelcoder.com KAFKA BROKERS หาก Partition ทังหมดถูกจัดเก็บบนเซิฟเวอร์แค่ตัวเดียวเมือเซิฟเวอร์นันไม่สามารถทํางานได้ ระบบทังหมดย่อมล้มเหลว Kafka จึงมีหลักการของ Brokers สําหรับแก้ปญหานี Broker คือ Node หรือเครืองเซิฟเวอร์บนระบบของ Kafka ในการใช้งานจริงจะต้องมี Brokers มากกว่า 1 ตัว Broker จะ จัดเก็บ Partition ของ Topic เอาไว้ในฐานะของ Log File ในกระบวนการทํางานนัน Producer จะส่ง Message ไปยัง Broker โดย Broker จะจัดเก็บลง Partition แบบกระจายไปหลาย Broker ส่วนของ Consumer จะทําการเชือมต่อกับ Broker เพือร้องขอข้อมูลจาก Topic ทีสนใจ
  • 45. Babel Coder Babel Coder https://www.babelcoder.com Producer 1 Producer 2 Producer 3 KAFKA BROKERS Kafka Cluster Broker 1 Topic 1 Partition 1 Partition 2 Topic 2 Partition 1 Partition 2 Topic 3 Broker 2 Broker 3 Partition 1 Partition 2 Consumer 1 Consumer 2 Consumer 3
  • 46. Babel Coder Babel Coder https://www.babelcoder.com KAFKA BROKERS Kafka Cluster Broker 1 Topic 1 Partition 1 (Leader) Partition 2 Topic 2 Partition 1 Partition 2 (Leader) Topic 3 Broker 2 Broker 3 Partition 1 Partition 2 Client w r i t e replica write replica write