جلوگیری از پردازش چندگانه پیام های SQS

Summarize this content to 400 words in Persian Lang
معرفی
Amazon SQS (سرویس صف ساده) یک سرویس صف پیام کاملاً مدیریت شده است که به شما امکان می دهد میکروسرویس ها، سیستم های توزیع شده و برنامه های بدون سرور را جدا کرده و مقیاس بندی کنید. AWS Lambda میتواند پیامها را از یک صف SQS پردازش کند و آن را به ترکیبی قدرتمند برای برنامههای رویداد محور تبدیل کند.
سناریو
یک معماری AWS مانند این را تصور کنید:
سناریویی را تصور کنید که در آن تابع Lambda شما نتواند یک پیام SQS را بهعنوان موفقیتآمیز پردازش شده برچسبگذاری کند. بهطور پیشفرض، لامبدا قبل از نادیده گرفتن پیام، حداکثر 4 بار آن را تکرار میکند. این رفتار سعی مجدد می تواند منجر به اجرای تصاعدی کنترل کننده شما شود:
First Lambda: 4 بار دوباره تلاش می کند، احتمالاً 4 پیام را به صف بعدی ارسال می کند.
لامبدا دوم: هر یک از 4 پیام، 4 بار مجدد را راه اندازی می کند که منجر به 16 اعدام می شود.
Lambda سوم: هر یک از 16 پیام، 4 بار تکرار را آغاز می کند که منجر به 64 اعدام می شود.
این رشد تصاعدی می تواند هزینه های AWS شما را تا پایان ماه به میزان قابل توجهی افزایش دهد.
علت
علت اصلی این مشکل این است که انتظار میرود کنترلکنندههای AWS Lambda که رویدادهای SQS را پردازش میکنند، یک شی SQSBatchResponse را برگردانند. اگر کنترلر شما نوع دیگری را برگرداند، در خطر از دست دادن کنترل بر آنچه AWS به عنوان یک اجرای موفق تشخیص میدهد، هستید.
در اینجا یک نمونه از امضای کنترل کننده مورد انتظار آمده است:
public class SQSLambdaHandler implements RequestHandlerSQSEvent, SQSBatchResponse> {
@Override
public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
…
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
SQSBatchResponse باید حاوی فهرستی از شناسههای پیام باشد که پردازش نشدند. اگر کنترل کننده شما یک SQSBatchResponse را با یک لیست خالی از شناسه های پیام ناموفق برگرداند، AWS این را به عنوان یک اجرای موفقیت آمیز تفسیر می کند و تابع Lambda برای آن پیام ها دوباره امتحان نمی شود.
نمونه کد
public class SQSLambdaHandler implements RequestHandlerSQSEvent, SQSBatchResponse> {
@Override
public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
ListBatchItemFailure> batchItemFailures = new ArrayList();
for (SQSMessage msg : event.getRecords()) {
try {
logger.info(“Message received: ” + msg.getBody());
// Process the message here
} catch (Exception e) {
logger.error(“Error processing message: ” + msg.getMessageId() + ” – ” + e.getMessage());
batchItemFailures.add(new BatchItemFailure(msg.getMessageId()));
}
}
return new SQSBatchResponse(batchItemFailures);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
هنگامی که یک استثنا گرفته می شود، با افزودن شناسه آن به لیست batchItemFailures، به پیام فرصت دیگری می دهیم تا به درستی پردازش شود:
batchItemFailures.add(new BatchItemFailure(msg.getMessageId()));
این به Lambda می گوید که پیام را با شناسه مشخص شده دوباره امتحان کند msg.getMessageId(). تعداد تلاشهای مجدد بر اساس پیکربندی است که در پشته cdk خود تنظیم کردهاید.
معرفی
Amazon SQS (سرویس صف ساده) یک سرویس صف پیام کاملاً مدیریت شده است که به شما امکان می دهد میکروسرویس ها، سیستم های توزیع شده و برنامه های بدون سرور را جدا کرده و مقیاس بندی کنید. AWS Lambda میتواند پیامها را از یک صف SQS پردازش کند و آن را به ترکیبی قدرتمند برای برنامههای رویداد محور تبدیل کند.
سناریو
یک معماری AWS مانند این را تصور کنید:
سناریویی را تصور کنید که در آن تابع Lambda شما نتواند یک پیام SQS را بهعنوان موفقیتآمیز پردازش شده برچسبگذاری کند. بهطور پیشفرض، لامبدا قبل از نادیده گرفتن پیام، حداکثر 4 بار آن را تکرار میکند. این رفتار سعی مجدد می تواند منجر به اجرای تصاعدی کنترل کننده شما شود:
- First Lambda: 4 بار دوباره تلاش می کند، احتمالاً 4 پیام را به صف بعدی ارسال می کند.
- لامبدا دوم: هر یک از 4 پیام، 4 بار مجدد را راه اندازی می کند که منجر به 16 اعدام می شود.
- Lambda سوم: هر یک از 16 پیام، 4 بار تکرار را آغاز می کند که منجر به 64 اعدام می شود.
این رشد تصاعدی می تواند هزینه های AWS شما را تا پایان ماه به میزان قابل توجهی افزایش دهد.
علت
علت اصلی این مشکل این است که انتظار میرود کنترلکنندههای AWS Lambda که رویدادهای SQS را پردازش میکنند، یک شی SQSBatchResponse را برگردانند. اگر کنترلر شما نوع دیگری را برگرداند، در خطر از دست دادن کنترل بر آنچه AWS به عنوان یک اجرای موفق تشخیص میدهد، هستید.
در اینجا یک نمونه از امضای کنترل کننده مورد انتظار آمده است:
public class SQSLambdaHandler implements RequestHandlerSQSEvent, SQSBatchResponse> {
@Override
public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
...
SQSBatchResponse باید حاوی فهرستی از شناسههای پیام باشد که پردازش نشدند. اگر کنترل کننده شما یک SQSBatchResponse را با یک لیست خالی از شناسه های پیام ناموفق برگرداند، AWS این را به عنوان یک اجرای موفقیت آمیز تفسیر می کند و تابع Lambda برای آن پیام ها دوباره امتحان نمی شود.
نمونه کد
public class SQSLambdaHandler implements RequestHandlerSQSEvent, SQSBatchResponse> {
@Override
public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
ListBatchItemFailure> batchItemFailures = new ArrayList();
for (SQSMessage msg : event.getRecords()) {
try {
logger.info("Message received: " + msg.getBody());
// Process the message here
} catch (Exception e) {
logger.error("Error processing message: " + msg.getMessageId() + " - " + e.getMessage());
batchItemFailures.add(new BatchItemFailure(msg.getMessageId()));
}
}
return new SQSBatchResponse(batchItemFailures);
}
}
هنگامی که یک استثنا گرفته می شود، با افزودن شناسه آن به لیست batchItemFailures، به پیام فرصت دیگری می دهیم تا به درستی پردازش شود:
batchItemFailures.add(new BatchItemFailure(msg.getMessageId()));
این به Lambda می گوید که پیام را با شناسه مشخص شده دوباره امتحان کند msg.getMessageId()
. تعداد تلاشهای مجدد بر اساس پیکربندی است که در پشته cdk خود تنظیم کردهاید.