WIUNIX ACADEMY
پیام تکراری در RabbitMQ؛ تفاوت تأیید انتشار و پایان پردازش
با یک صف آزمایشی ببینید قطع اتصال پس از ثبت نتیجه و پیش از ACK چه اتفاقی میسازد؛ پیام بدون مسیر را تشخیص دهید و جلوی تکرار کار در تحویل دوباره را بگیرید.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من8 مقدار قابلتغییر
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
تفاوت دریافت پیام توسط RabbitMQ و انجام کار توسط مصرفکننده را با یک مثال کوچک بررسی کنید؛ همان پیام دوباره تحویل شود، اما نتیجهٔ ثبتشده در SQLite تکرار نشود.
سیستمعاملها و نسخههای پوششدادهشده
مسیرهای مستند برای Ubuntu، Debian و خانوادهٔ Red Hat؛ محصول و کلاینت سازگار باید از قبل نصب باشند. محدودیت هر شاخه در گام نخست آمده است. فرمانها هنگام نگارش روی سرویس واقعی اجرا نشدهاند.
قبل از شروع
- کلاستر موجود و سالم RabbitMQ 4.x با سه گره، listener خصوصی TLS، CA معتبر و vhost و حساب مختص آزمایش.
- کلاینت آماده با Python و Pika سازگار، مجوز ساخت یک صف تازه و پوشهای خصوصی برای فایل مثال و SQLite.
- نام یکتای صف و شناسهٔ ثابت پیام برای همین تمرین؛ صف مشترک برنامه، کاربران اصلی و عضویت کلاستر تغییر نمیکنند.
پیام به صف رسیده؛ کار برنامه هم انجام شده؟
این دو نتیجه یکی نیستند. RabbitMQ میتواند دریافت پیام را به فرستنده تأیید کند، درحالیکه برنامه هنوز آن را پردازش نکرده است. ACK مصرفکننده مسئولیت دیگری دارد: اعلام میکند برنامه رسیدگی به همان تحویل را تمام کرده است. هیچکدام جای دیگری را نمیگیرد.
در این تمرین میبینیم اگر ثبت نتیجه در دیتابیس موفق شود اما اتصال پیش از ACK قطع شود، همان پیام چگونه دوباره تحویل میشود. برنامه با شناسهٔ ثابت تشخیص میدهد نتیجه قبلاً ثبت شده و کار را تکرار نمیکند. این مثال محدود، تضمین انجام دقیقاً یکبارهٔ هر اثر بیرونی نیست.
یک صف تازه در محیط آزمایش، نه تغییر کلاستر اصلی
کلاستر و TLS باید از قبل سالم باشند و نسخهٔ RabbitMQ و Erlang آن با هم سازگار باشد. این مقاله broker نصب نمیکند، عضوی را حذف نمیکند و گرهای را برای آزمون خاموش نمیکند. کلاینت Pika هم باید از قبل آماده باشد.
quorum queue برای ادامهٔ کار به اکثریت اعضای خودش نیاز دارد. سهگرهایبودن کلاستر کافی نیست؛ باید ببینید همان صف روی چند گره replica دارد و کدامها واقعاً در دسترساند. این بررسی را پس از ساخت صف انجام میدهیم.
نام صف و شناسهٔ پیام را پیش از اجرا مشخص کنید
نشانی TLS، vhost، حساب موجود، نام صف تازه و پوشهٔ خصوصی تمرین را وارد کنید. گواهی باید با hostname مطابقت داشته باشد؛ بررسی نام را خاموش نکنید. رمز فقط در prompt خصوصی ترمینال وارد میشود. مقدارهای فرم محرمانه نیستند و در همین تب نگهداری میشوند؛ پس از «اعمال» در همهٔ پنلها یکسان خواهند بود.
شناسهٔ پیام را برای یک عملیات منطقی ثابت نگه دارید. اگر از نتیجهٔ انتشار مطمئن نیستید، عوضکردن ID و فرستادن دوباره راهحل نیست؛ برنامه دیگر نمیتواند بفهمد دو تحویل، همان کار قبلی بودهاند.
قدم بعدی
پیش از شروع، مسیر ابزار و محل اجرای فرمانها را بررسی کنید
کلاینت Python با Pika و کلاستر آزمایشی سهعضوی RabbitMQ شاخهٔ ۴ باید از قبل آماده باشند. راهنمای RabbitMQ برای نصب broker، Debian نسخههای ۱۲ و ۱۳، Ubuntu نسخهٔ ۲۶٫۰۴ و نسخههای فرعیِ تحت پشتیبانی RHEL، Rocky و Alma شاخههای ۹ و ۱۰ را پوشش میدهد. Ubuntu نسخهٔ ۲۶٫۱۰ در فهرست سیستمعاملهای broker نیست؛ این گزینه فقط کلاینت Python سازگاری را پوشش میدهد که جداگانه آماده شده است. پنلهای مخصوص گره را روی همان broker موجود و پشتیبانیشده اجرا کنید. هیچ بستهٔ broker، مخزن Erlang یا گرهای در این تمرین ساخته نمیشود. ابزارهای rabbitmq-diagnostics و rabbitmq-queues از دسترسی موجود حساب broker به cookie استفاده میکنند؛ آن اعتبارنامه را به کلاینت منتقل نکنید. در شاخهٔ Red Hat، نمونهٔ مسیر CA خصوصی از /etc/ssl/certs/academy-rabbitmq-ca.pem به /etc/pki/tls/certs/academy-rabbitmq-ca.pem تغییر میکند؛ فایل واقعی را مسئول آزمایشگاه در اختیار شما میگذارد.
این مسیرها از مستندات استخراج شدهاند و آزمون عملی سازگاری محسوب نمیشوند. ابتدا /etc/os-release و نسخهٔ دقیق محصول را بررسی کنید. حسابها، دسترسی شبکه و اعتبارنامههای محافظتشده باید از قبل آماده باشند. برای آمادهکردن ابزارها، سرویس موجود را دوباره راهاندازی نکنید، دیتابیس تازه مقداردهی اولیه نکنید، پورتی روی فایروال باز نکنید و Python سیستم را تغییر ندهید.
محیط Python برنامه باید از قبل وابستگی سازگار را داشته باشد. RHEL 9 بهطور پیشفرض Python 3.9 و RHEL 10 نسخهٔ 3.12 دارد؛ نسخهٔ چاپشده و نسخهٔ کتابخانه را بررسی کنید. این صفحه بستهای با pip در Python سیستم نصب نمیکند.
اگر SELinux فعال است، درستبودن مالک و مجوز فایل بهتنهایی کافی نیست. آن را فعال نگه دارید. در صورت ردشدن دسترسی به فایل، سوکت یا اتصال، مسئول مجاز باید رخداد AVC و context واقعی فرایند و فایل را بررسی کند؛ نوع امنیتی را حدس نزنید، chcon بازگشتی اجرا نکنید و policy کلیِ مجازکننده نسازید. بررسی تنظیمات موجود firewalld فقط با مجوز مدیریتی انجام شود؛ این راهنما به قانون ورودی تازه نیاز ندارد.
کلاینت مدیریت مجاز؛ بررسیهای مخصوص گره فقط روی همان گرهٔ موجود
cat /etc/os-release
id
python3 --version
python3 -c "import ssl,sqlite3,pika; print(pika.__version__); print(ssl.OPENSSL_VERSION); print(sqlite3.sqlite_version)"
test -r "/etc/pki/tls/certs/academy-rabbitmq-ca.pem"
if command -v getenforce >/dev/null; then getenforce; id -Z; fiسیستمعامل، مسیر و نسخهٔ ابزار با محیط انتخابی سازگار است؛ در صورت تفاوت، پیش از تغییر داده توقف کنید.
قدم بعدی
پیش از ساخت صف، سلامت کلاستر و نامها را بررسی کنید
با حساب سیستمعامل مجاز RabbitMQ روی یک گرهٔ آزمایشی اجرا کنید. ابزار از cookie محافظتشدهٔ موجود استفاده کند؛ مقدار آن را در خط فرمان ننویسید. سلامت سه گره و نبودن صف با نام انتخابی را در vhost مخصوص ببینید.
نام صفها و شمارندهها را خصوصی ثبت کنید. برای آمادهکردن این مثال به force_boot، reset، purge یا تغییر عضو نیاز ندارید؛ اگر محیط سالم نیست، ابتدا همان مشکل را از مسیر عملیاتی کلاستر حل کنید.
گرهٔ کلاستر سهعضوی RabbitMQ آزمایشی
rabbitmq-diagnostics check_running
rabbitmq-diagnostics cluster_status
rabbitmqctl list_queues -p 'academy_lab' name type durable messages_ready messages_unacknowledged consumersکلاستر آزمایشی سالم است و نام صف انتخابی هنوز استفاده نشده است.
قدم بعدی
برای فایل مثال، پوشهٔ خصوصی تازه بسازید
روی کلاینت و با حساب مجاز آزمایش اجرا کنید. والد باید از قبل خصوصی و قابلنوشتن باشد. پوشهٔ تمرین نباید موجود یا لینک باشد؛ اگر کنترل خطا داد، مسیر را بررسی کنید و آن را به حذف پوشهٔ موجود تبدیل نکنید.
فقط فایل Python و دیتابیس کوچک SQLite در این مسیر ساخته میشوند. مسیر نمونه را با حساب و پوشهٔ مناسب محیط خود عوض کنید؛ برای استفاده از آن، مجوز یک پوشهٔ مشترک را تغییر ندهید.
کلاینت آزمایشی با Pika نسخهٔ ۱٫۳ یا بالاترِ نصبشده
test ! -e '/home/academy/rabbitmq-probe-20261028' && test ! -L '/home/academy/rabbitmq-probe-20261028' || exit 1
(umask 077; mkdir -- '/home/academy/rabbitmq-probe-20261028') || exit 1
nano '/home/academy/rabbitmq-probe-20261028/confirm-ack-probe.py'پوشهٔ تازه و خصوصی آماده است و فایل مثال برای ویرایش باز شده است.