لینک کوتاه مطلب : https://hsgar.com/?p=5418

چیزی که آرزو می‌کردم قبل از اینکه خیلی دیر شود، کسی درباره استفاده از Rabbitmq به من می‌گفت – رایان رودمویر – توسعه‌دهنده نرم‌افزاری که با فکر رشد تلاش می‌کند دنیا را تغییر دهد.

ساعت من وزوز می کند و در حالت گیجی قبل از سحر نمی توانم رمزگشایی کنم که زنگ هشدار است یا تماس تلفنی. ساعت 4:45 صبح است. من آن را کنار هم می کشم تا متوجه شوم که این تماس از سوی شماره ای است که نمی دانم – هرگز نشانه خوبی نیست. من پاسخ می دهم و این یک همکار است – همتای من که تیم پشتیبانی ما را اداره می کند که تقریباً در تمام مسائل تولید برای مشتریان ما درگیر است. “سلام رایان. ببخشید که بیدارت کردم، میدونم زوده بزرگترین مشتری ما گزارش می دهد که درخواست های آنها بیش از دو ساعت طول می کشد تا نتایج را بازگردانند. ما فکر می کنیم این به دلیل سیستم پیام رسانی ما است، اما مطمئن نیستیم که از اینجا به کجا برویم. ما به کمک شما نیاز. لطفا به تماس ما بپیوندید.» چند لحظه بعد با به صدا درآمدن زنگ صبحگاهی ساعتم دوباره زنگ زد. امروز صبح امروز برای تمرین نخواهد بود.

نزدیک به سه سال است که ما RabbitMQ را برای سیستم‌های تولید خود اجرا می‌کنیم و 99.5 درصد از مواقع مشکلی نبوده است. در طول آن زمان، ما به بیش از 200 مصرف‌کننده همزمان که روی ده‌ها ماشین مجازی اجرا می‌شوند، در حین هماهنگی پردازش پیام (1 صف به N مصرف‌کننده) و صدها میلیون پیام را در برنامه دات‌نت خود پردازش کرده‌ایم. مورد استفاده اولیه ما برقراری تماس های HTTP با سرویس وب دیگری است، یا با بازیابی داده های JSON یا دانلود اسناد PDF. من به شما می گویم که RabbitMQ را توصیه می کنم و به این دلیل است که این کار را انجام می دهم. در بیشتر موارد کار با آن عالی بوده است و در برنامه ما به خوبی عمل می کند. اما، و این یک اما بزرگ است، همه اینها به قیمتی تمام شده است که ما در زمان تصمیم گیری های معماری خود نمی دانستیم.

RabbitMQ ستون فقرات معماری نظرسنجی ما برای بررسی نتایج کار است. دنباله عمل معمولی این است که کاربر درخواستی را از طریق برنامه وب ارسال می کند و باطن آن پیام را با افزودن یک پیام به RabbitMQ مدیریت می کند. مصرف کننده پیام را دریافت می کند و یک تماس HTTP با سرویس وب دیگری برقرار می کند تا در واقع درخواست را ارسال کند. از آنجا، منطق نظرسنجی به دست می‌آید و پیام‌های بعدی در صف هر کدام نشان‌دهنده تلاش نظرسنجی برای بازیابی نتایج هستند. اگر کاری نتیجه ای نداشته باشد، مصرف کننده پیامی را در صف قرار می دهد تا بتوانیم تلاش نظرسنجی بعدی را با مدت زمانی (قابل تنظیم توسط مشتری) به تاخیر بیندازیم. منطق تاخیر ما از شبکه‌ای از صف‌ها با تعاریف زمان برای زندگی (TTL) و حروف مرده استفاده می‌کند.

خوشه های غیر تولیدی ما از دو یا سه گره استفاده می کنند در حالی که خوشه های تولیدی از سه گره استفاده می کنند. هر خوشه دارای یک متعادل کننده بار است و برنامه به طور دقیق فقط به متعادل کننده بار می پردازد. در زمان اجرا، ناشران و مصرف کنندگان از یک متعادل کننده بار استفاده می کنند.

بازگشت به تجارت، شما در حال خواندن هستید زیرا کالاها را می خواهید و نه این خلاصه نویسی ضعیف برنامه ما را.

سه سال پس از پیاده سازی، این چیزی است که قبل از نوشتن یک خط کد در تعامل با RabbitMQ به خودم می گویم.

در ابتدا یک متخصص را جذب کنید

برای احتمالاً 2000 تا 3000 دلار (حدس زدن) می توانید با یک شرکت مشاوره RabbitMQ تماس بگیرید و با یک متخصص وقت بگیرید. از این فرصت برای بررسی و تأیید مفروضات خود استفاده کنید، برنامه ریزی کنید، سؤال بپرسید، توصیه ها را دریافت کنید و بررسی های لازم را انجام دهید تا بتوانید سردردها، مشکلات و مشکلات آینده را به حداقل برسانید. به احتمال زیاد با اتخاذ تصمیمات صحیح اکنون در درازمدت پول پس انداز کنید. یا می‌توانید مسیر ما را انتخاب کنید، وقتی که چرندیات به پهلو می‌روند، متخصص را درگیر کنید.

از کتابخانه ای مانند EasyNetQ یا NServiceBus استفاده کنید

برنامه ما از RabbitMQ.Client کتابخانه ای از RabbitMQ و این کتابخانه های انتزاعی (مثلاً EasyNetQ، NServiceBus) نیز از آن استفاده می کنند. با این حال، آنها بهتر از همیشه در مورد تعامل با RabbitMQ در چنین سطح پایینی می دانند و می دانند. درایور RabbitMQ سطح پایین، ابتدایی است و از شما انتظار دارد نکات ظریف را در مورد RabbitMQ درک کنید. اگر این اولین بار است که با RabbitMQ استفاده می کنید، تضمین می کنم که تجربه ای برای درک این تفاوت های ظریف ندارید.

قبل از اینکه بپرسید «چرا از کتابخانه لفاف استفاده نکردید؟» اجازه بدهید به شما بگویم. در مورد من، پروژه RabbitMQ ما زمانی در دامان من فرود آمد که توسعه دهنده اصلی شرکت را در اواخر پیاده سازی ترک کرد و او تصمیم گرفت از RabbitMQ.Client کتابخانه به طور مستقیم من زمان کافی برای انجام آن مبادله نداشتم (و نه می دانستم که باید موردی برای تعویض با یک کتابخانه لفافی درست می کردم!).

این چیز پارتیشن شبکه وجود دارد، این یک نوع معامله بزرگ است

برای اصطلاحات رایج، سیستم RabbitMQ شما خوشه نامیده می شود. یک خوشه از یک یا چند گره تشکیل شده است. یک گره به سادگی یک سرور/کانتینر است که نرم افزار RabbitMQ را اجرا می کند. همه گره‌های یک خوشه باید دقیقاً همان نسخه RabbitMQ را اجرا کنند.

RabbitMQ مکانیزمی به نام خوشه بندی را فراهم می کند تا بتوانید سایر نمونه های RabbitMQ را به هم پیوند دهید تا به عنوان یک کارگزار منطقی واحد عمل کنند. شما می توانید با هر درخواستی به هر گره ای در خوشه آدرس دهی کنید و گره ها برای انتشار پیام یا ارسال پیام به مصرف کننده همکاری می کنند.

گره ها دائماً با تبادل داده ها در مورد پیام ها، صف ها، مبادلات و غیره با یکدیگر در ارتباط هستند. با این قطع ارتباط چه باید کرد استراتژی مدیریت پارتیشن پیش فرض است ignore این بدان معناست که فقط وارد حالت پارتیشن شده شوید و در این حالت “مغز تقسیم شده” به حمل و نقل ادامه دهید و در نتیجه خوشه خود را به هرج و مرج کامل سوق دهید. این برای ما جهنم بود (و جهنم زیادی برای من). تنها راه خروج از پارتیشن، راه اندازی مجدد گره های یک طرف پارتیشن است تا سپس به طرف دیگر بپیوندد و داده های آنها را فرض کند. در نتیجه مجموعه داده‌های خود را که در حین پارتیشن‌بندی خوشه جمع‌آوری کرده است، دور می‌اندازد.

من شخصاً پارتیشن‌های شبکه را به دو صورت تجربه کرده‌ام: همه گره‌ها در کلاستر به‌طور همزمان از طریق قوانین به‌روزرسانی ویندوز و فایروال به‌روزرسانی می‌شوند. راه حل برای به روز رسانی ویندوز این بود که اطمینان حاصل شود که گره ها در کلاستر در زمان های مختلف وصله می شوند.

من باید جلوی خودم را بگیرم زیرا می‌توانم به غر زدن و هیاهو کردن درباره این موضوع برای کلمات بی‌شمار ادامه دهم. پیکربندی صحیح این است که تنظیم کنید partion_handling استراتژی به pause_minority. هنگامی که خوشه پارتیشن بندی می شود، یک طرف پارتیشن به سادگی خود را خاموش می کند و در نتیجه کاملاً از سناریوی تقسیم مغز جلوگیری می کند. طرفی که خاموش است به نظارت بر خوشه برای ازسرگیری ارتباطات ادامه خواهد داد و در آن زمان دوباره به خود می پیوندد. اکنون تنها کاری که باید انجام دهید این است که مطمئن شوید کد شما به درستی اتصالات قطع شده را کنترل می کند و یک راه حل صف نسبتاً قوی خواهید داشت.

از نظریه CAP، ignore به این معنی است که سازگاری را به قیمت در دسترس بودن قربانی کنید pause_minority قربانی کردن دسترسی به هزینه سازگاری است. اگر از من بپرسید دومی کاملاً ارزشش را دارد.

چگونه می خواهید نسخه های RabbitMQ را ارتقا دهید؟

روزی فرا می رسد که نسخه RabbitMQ شما به پایان عمر خود رسیده است. بعدش چیکار میکنی؟ به کار با نسخه پشتیبانی نشده ادامه می دهید؟ یک خوشه جدید ایجاد کنید؟ برنامه شما برای انتقال ترافیک از خوشه قدیمی به خوشه جدید چیست؟ یادداشت من (در بالا) را به خاطر بیاورید که همه گره های یک خوشه باید اجرا شوند همان نسخه دقیق. امیدواریم اگر برنامه شما برای ارتقاء گره ها در محل باشد، می توانید ببینید که چگونه این کار مشکل خواهد بود.

من شما را تنها با سؤال می گذارم، بدون پاسخ. این به این دلیل است که هر تصمیمی به شدت به استراتژی های سازمانی و عملیاتی شما بستگی دارد. به عبارت دیگر، هر کس ممکن است کمی رویکرد متفاوت برای حل این مشکلات داشته باشد.

اگر همه پیام‌ها را در RabbitMQ از دست بدهید، چه برنامه‌ای دارید؟

اگر بخواهید همه (یا حتی یک سوم) پیام های خود را در RabbitMQ از دست بدهید، چقدر بد خواهید شد؟ آیا RabbitMQ سیستم رکورد شماست؟ آیا استراتژی بازیابی برای بازگشت برنامه خود به حالت عملکردی دارید؟ چه اتفاقی می‌افتد وقتی سرورهای on-prem خود را به ابر منتقل می‌کنید – چگونه پیام‌های RabbitMQ خود را دوباره به جریان می‌اندازید؟

برنامه خود را برای پشتیبانی از آدرس های اتصال مختلف برای ناشران و مصرف کنندگان بسازید

در برخی مواقع در آینده (شاید در طول یک ارتقا) شما می خواهید انعطاف پذیری برای انتشار مستقل و مصرف از خوشه های مختلف و/یا متعادل کننده بار داشته باشید. این یک الگوی بدون ریسک و با پاداش بالا است که می توانید در همان ابتدا در برنامه خود بسازید تا جایی که در آینده به خودتان ضربه بزنید.

فایل های لاگ رشد خواهند کرد تا ده ها گیگابایت فضای دیسک را مصرف کنند

فایل‌های گزارش از RabbitMQ به مرور زمان رشد می‌کنند تا ده‌ها گیگابایت فضای دیسک را مصرف کنند. چرخاندن آن فایل ها با استفاده از آن به اندازه کافی آسان است rabbitmqctl rotate_logs اما سعی کنید یک فرآیند را خودکار کنید تا “تمام فضای دیسک” هرگز باعث قطعی نشود.

RabbitMQ افزودنی طولانی مدت به زیرساخت های ما بوده است و احتمالاً تصمیم خوبی برای استفاده از این ابزار گرفته اید. با این حال، شما همچنین باید آنچه را که من مطرح کرده‌ام جدی بگیرید و حداقل با همسالان و سهامداران خود صحبت کنید تا تصمیم بگیرید که در مورد این نکات دردناک باید سعی کنید به چه مواردی بپردازید.

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.