ในโลกของการพัฒนาและออกแบบระบบคอมพิวเตอร์ที่ต้องการความมั่นคงและเสถียรภาพ การจัดการกับข้อความที่ไม่สามารถดำเนินการได้ (Undeliverable Messages) ถือเป็นเรื่องสำคัญ เพื่อให้มั่นใจได้ว่าระบบจะทำงานต่อไปได้อย่างราบรื่น​ โดยแนวคิดหนึ่งที่ใช้ในระบบ Message Queue เพื่อจัดการกับข้อความเหล่านี้คือ "Dead Letter Queue" หรือที่เรียกกันย่อๆ ว่า DLQ


Dead Letter Queue (DLQ) คืออะไร?

เป็นคิวพิเศษที่ใช้ในการเก็บข้อความที่ไม่สามารถดำเนินการได้ตามข้อกำหนด ไม่ว่าจะเป็นข้อผิดพลาดในกระบวนการประมวลผล, ข้อความที่มีข้อมูลไม่ครบถ้วน, หรือการหมดเวลาของข้อความในคิวปกติ

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

ทำไมต้องใช้ Dead Letter Queue ละ?

หลักแบ่งออกเป็น 3 ข้อ คือ

1. การจัดการข้อผิดพลาดอย่างมีประสิทธิภาพ: โดยการย้ายข้อความที่เกิดปัญหาไปยัง DLQ สามารถช่วยให้ระบบหลักสามารถดำเนินการต่อไปได้โดยไม่ถูกรบกวน

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

3. การเพิ่มความยืดหยุ่นในการพัฒนา: ด้วยการแยกข้อความที่มีปัญหาออกจากคิวปกติ นักพัฒนาสามารถโฟกัสไปที่การพัฒนาฟีเจอร์ใหม่ๆ ได้โดยไม่ต้องกังวลว่าข้อความที่มีปัญหาจะกระทบต่อกระบวนการที่สำคัญ

ตัวอย่างการใช้งาน Dead Letter Queue

การใช้งาน DLQ จะขึ้นอยู่กับ Message Broker ที่เราใช้งาน เช่น RabbitMQ หรือ AWS SQS โดยจะมีวิธีการตั้งค่าให้คิวปกติสามารถย้ายข้อความที่ประสบปัญหาไปยัง DLQ ได้เมื่อเงื่อนไขที่กำหนดเกิดขึ้น

ตัวอย่างการใช้งาน DLQ ใน AWS SQS
ใน AWS SQS เราสามารถกำหนด DLQ ได้โดยระบุคิวหลัก (Source Queue) และ DLQ ในขณะที่สร้างหรือแก้ไขคิว โดยมีขั้นตอนดังนี้

1. สร้างคิวสำหรับเก็บข้อความที่เกิดปัญหา (DLQ): ทำสัญญาณปกติสำหรับคิวที่สร้างใหม่

2. กำหนด MaximumReceiveCount: ซึ่งเป็นจำนวนครั้งที่ข้อความหนึ่งๆ สามารถถูกดึงขึ้นมาก่อนที่จะถูกย้ายไปยัง DLQ

3. ผูก DLQ กับคิวหลัก: กำหนดให้ DLQ เป็นคิวสำรองสำหรับคิวหลัก เมื่อข้อความถูกดึงขึ้นมาครบตาม MaximumReceiveCount จะถูกย้ายไปยัง DLQ

import boto3

# Create SQS client
sqs = boto3.client('sqs')

# Create DLQ
response = sqs.create_queue(
    QueueName='DLQ'
)

dlq_url = response['QueueUrl']

# Create Primary Queue with DLQ redrive policy
response = sqs.create_queue(
    QueueName='PrimaryQueue',
    Attributes={
        'RedrivePolicy': '{"maxReceiveCount":"5", "deadLetterTargetArn":"arn:aws:sqs:REGION:ACCOUNT_ID:DLQ"}'
    }
)

primary_queue_url = response['QueueUrl']

ในโค้ดตัวอย่างข้างต้น เราได้สร้างคิว DLQ และ คิวหลัก (PrimaryQueue) โดยเชื่อมโยง DLQ เข้ากับคิวหลักผ่าน Redrive Policy ที่กำหนดให้ข้อความจะถูกย้ายไป DLQ เมื่อถูกดึงขึ้นมาครบ 5 ครั้งแล้วไม่สามารถประมวลผลได้

ข้อพิจารณาในการใช้งาน DLQ

ระยะเวลาในการเก็บข้อความ: ข้อความที่อยู่ใน DLQ อาจมีข้อกำหนด เรื่องระยะเวลาการจัดเก็บก่อนที่จะถูกลบตามนโยบายที่กำหนดไว้

การจัดการข้อความใน DLQ: อาจต้องพิจารณาการทำงานอัตโนมัติในการตรวจสอบหรือประมวลผลข้อความที่อยู่ใน DLQ หากต้องการลดภาระงานของผู้ดูแลระบบ