Message Properties
message เป็นมากกว่า body
หัวข้อที่มีชื่อว่า “message เป็นมากกว่า body”ตอน publish ตัว body — bytes จริง ๆ — เป็นแค่ครึ่งเดียวของเรื่อง ทุก AMQP message ยังพก properties มาด้วย: metadata ที่ RabbitMQ และ consumer ของคุณเอาไปใช้ได้โดยไม่ต้อง parse body บางตัวเป็นแค่ข้อมูลประกอบ แต่มีสองสามตัวที่เปลี่ยนพฤติกรรมการ deliver จริง ๆ
property ที่เปลี่ยนพฤติกรรม: delivery_mode
หัวข้อที่มีชื่อว่า “property ที่เปลี่ยนพฤติกรรม: delivery_mode”property เดียวที่มีผลต่อ reliability คือ delivery_mode (หรือเรียกว่า “persistent”):
delivery_mode = 2(persistent) — RabbitMQ เขียน message ลง disk message จึงรอดจากการ restart broker ได้delivery_mode = 1(transient, ค่า default ใน AMQP ดิบ ๆ) — message อยู่ใน memory และหายเมื่อ restart
จับคู่กับ durable queue (บทเรียนที่แล้ว) กฎนี้ควรจำ: durable queue + persistent message = รอดจากการ restart ขาดครึ่งใดครึ่งหนึ่งข้อมูลก็เสี่ยง
persistence ไม่ฟรี — การเขียนลง disk กิน throughput นี่คือ trade-off จริงที่คุณจะชั่งน้ำหนักในโมดูล reliability
property ที่เป็นข้อมูลประกอบ
หัวข้อที่มีชื่อว่า “property ที่เป็นข้อมูลประกอบ”ที่เหลืออธิบาย message เพื่อให้ consumer (และเครื่องมือต่าง ๆ) จัดการได้ถูกต้อง:
| Property | จุดประสงค์ |
|---|---|
content_type | เช่น application/json — จะตีความ body อย่างไร |
content_encoding | เช่น gzip |
headers | metadata key/value อิสระ (ใช้โดย headers exchange ด้วย) |
correlation_id | จับคู่ reply กับ request ของตัวเอง (pattern RPC) |
reply_to | queue ที่ควรส่ง reply ไป |
message_id | id เฉพาะตัว — มีประโยชน์สำหรับ idempotency และ deduplication |
timestamp | เวลาที่ message ถูกสร้าง |
priority | message priority สูงกว่าแซงคิว (ต้องใช้ priority queue) |
expiration | TTL ต่อ message เป็นมิลลิวินาที |
publish พร้อม properties
หัวข้อที่มีชื่อว่า “publish พร้อม properties”channel.publish('orders', 'order.created', Buffer.from(JSON.stringify(order)), { persistent: true, // delivery_mode = 2 contentType: 'application/json', messageId: order.id, timestamp: Date.now(), headers: { source: 'checkout' },});channel.basic_publish( exchange="orders", routing_key="order.created", body=json.dumps(order), properties=pika.BasicProperties( delivery_mode=2, # persistent content_type="application/json", message_id=order["id"], headers={"source": "checkout"}, ),)ch.PublishWithContext(ctx, "orders", "order.created", false, false, amqp.Publishing{ DeliveryMode: amqp.Persistent, // delivery_mode = 2 ContentType: "application/json", MessageId: order.ID, Timestamp: time.Now(), Headers: amqp.Table{"source": "checkout"}, Body: body, },)