Sobi
Sobi
خواندن ۱۰ دقیقه·۴ سال پیش

RabbitMQ به زبان ساده

چند جمله از من :

امروزه با تکنولوژی و معماری های جدید میتوان اپلیکیشن را در بهینه ترین حالت ممکن پیاده سازی کرد .اکثر شرکت های به سمت میکروسرویس ها در حال مهاجرت هستند هرچند بسته به نیاز پروژه میتوان با معماری های دیگری پیاده سازی را انجام داد ولی با توجه به بزرگ شدن اپلیکیشن ها و نیاز کاربران اپلیکیشن های بزرگ به صورت میکروسرویس پیاده سازی میشوند.میکروسرویس بحث پیچیده ای و نیاز به تجربیه بالایی دارد. در این مقاله به بخش کوچکی از این معماری خواهیم پرداخت و سعی میکنیم در قالب یک مثال ساده مفهوم را بیان کنیم.اگر به دنیای میکروسرویس ها قدم گذاشتین مطمئنا اسم RabbitMQ را مکرر شنیده اید .RabbitMQ بخش کوچکی از میکروسرویس رو ایفا میکنند که در ادامه در قالب یک مثال ساده ان را پیاده سازی خواهیم کرد.

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


؛ RabbitMQ چیست : به صورت ساده میتوان گفت :

RabbitMQ is an open-source message broker

؛ RabbitMQ یکی از محبوبترین message brokerهای open-source موجود میباشد. Messaging به اپلیکیشن ها این امکان را میدهد که به هم دیگر وصل شوند و با هم صحبت کنند.اپلیکیشن ها با تکنولوژی های مختلف میتوانند تبادل داده داشته باشند. یک مثال از دنیایه واقعی میتوانید اداره پست را در نظر بگیرید وقتی قصد ارسال بسته ای را دارید ، بسته را به پستچی میدهید و انتظار دارید بسته بدون هیچ مشکلی به مقصد تحویل داده شود.پروسه تحویل بسته ازمبدا به مقصد را message broker انجام میدهد.message broker وابسته با فریمورک یا زبان برنامه نویسی نیس شما میتوانید در سیستم مبدا و مقصد از تکنولوژی های مختلفی استفاده کنید همپنین شما بر روی سیستم عامل های مختلف یا بر روی داکر میتوانید RabbitMQ را بالا بیارید .

در این لینک میتوانید لیست از بهترین message broker را مشاهده کنید

چند اصطلاح در RabbitMQ :

؛ Producing : به سیستم ارسال کننده گفته میشود . در مثال بالا به کسی که بسته را ارسال میکند Producing میگویند.

Producing
Producing

؛ queue : یکی از انواع داده‌ساختارهاست که از آن برای ذخیره و بازیابی داده‌ها استفاده میشوند.طبق مثال بالا صف نقش پست چی را که وظیفه حمل و تحویل داده را انجام میدهد را بر عهده دارد.

برای توضیحات بیشتر درباره صف میتوانید این پیج را مطالعه کنید

؛ Consuming : به سیستم دریافت کننده گفته میشود که در مثال بالا به شخص دریافت کننده اتلاق میشود.

Consuming
Consuming

دقت کنید Producing ، Consuming مستقل از هم و داخل یک هاست نیستند.

What is a Producer?
A producer is an application responsible for sending message.
What is a Consumer?
A consumer is an application listening for messages.
What is Queue?
A queue is a storage where messages are stored by the broker.


چرا RabbitMQ استفاده میکنیم : مهمترین سوالی که قبل از یادگیری RabbitMQ باید بدانیم اینکه چرا باید از RabbitMQ استفاده کنیم ؟

ارتباط با سرویس های(کامپیوتری) مختلف از مشکلات قدیمی بوده.پروتکل های مختلفی برای ارتباط با سرویس های مختلف وجود دارن برای مثال با http میتوانید بدون وابستگی با سیستم داده انتقال داد. پروتکل های دیگر مثل MTP, FTP, HTTP or WebSockets را میتوان نام برد که بر پایه TCP/UDP عمل میکنند.برای مثال حالت زیر را در نظر بگیرید

$.post({ url: &quot/api/foo&quot, dataType: &quotjson&quot, data: { some: &quotdata&quot, goes: &quothere&quot, more: [&quotstuff&quot, &quotthings&quot, &quotetc&quot] }});
An AJAX call is a “brokerless” model
An AJAX call is a “brokerless” model


مثال بالا یک کد ajax استاندارد میباشد که با استفاده از پروتکل http داده ای را از web browser سیستم شخصی به یک web server ارسال میکند.موقع ارسال همراه درخواست یکسری داده و پارمتر هم ممکن است ارسال شوند.سرور درخواست را دریافت کرده پارمترها را گرفته و به درون برنامه ارسال میکند و بسته به درخواست یک response برای client ارسال میکند.برای مثال کد 200 (200 ok). به این سناریو میتوان distributed computing گفت چون شما یکسری کارها را از رو سیستم شخصی بر رویه سیستم دیگه ارسال میکنید.

با توجه به توضیحات بالا توانستیم بدون وابستگی به تکنولوژی دادای را به یک سیستم دیگه ارسال کنیم . پس چرا باید از RabbitMQ استفاده کنیم!?

ایجکس distributed computing را برای web browsers انجام میدهد ولی RabbitMQ محاسبات توزیع شده را بر روی سرورها انجام میدهد.http بیشتر برای درخواست های client به server استفاده میشود ولی RabbitMQ بیشتر برای ارتباطات سروری استفاده میشود


در جدول زیر میتوان تفاوت های درخواست های ایجکسی و RabbitMQ را باهم مقایسه کند.

؛ RabbitMQ به دلیل پشتیبانی از پرتوکل های مختلف مثل AMQP, MQTT, and STOMP به عنوان hybrid broker هم شناخته میشود

پروتکل های RabbitMQ :

همانطور که گفته شد RabbitMQ به صورت multiple protocols میباشد. AMQP پروتکل پیشفرض RabbitMQ بوده که به صورت binary با داده ها کار میکند .برای استفاده از پروتکل های دیگر باید به صورت جداگانه پلاگین نصب کنید

پروتکل های دیگری که RabbitMQ ساپورت میکند :

  • STOMP – A text-based message protocol
  • MQTT – Binary protocol focusing mainly on Publish/Subscribe scenarios.
  • AMQP 1.0
  • HTTP and WebSocket

از قابلیت های RabbitMQ :

  • ؛Multi-protocol : همانطور که گفته شد میتوان از چندین پروتکل مختلف استفاده کرد.
  • ؛ Many Clients :با کلاینت ها و تکنولوژی های مختلفی میتواند کار کند.
  • ؛ Management UI : برای مانیتورینگ کردن و مدیریت صف داری محیط گرافیکی است.
  • ؛ Plugin System : میتوانید از پلاگین های مختلفی استفاده کنید همچنین خودتان یک پلاگین طراحی کنید.
  • ؛ Large Community : دارای کامیونتی بزرگی میباشد که میتوانید با ان جوین شوید.
  • و....

شروع به کد نویسی :

قصد انجام یک پروژه ساده را با RabbitMQ داریم.برای شروع وابسته با زبان برنامه نویسی نیستم و شما به هر زبان برنامه نویسی که تجربه کاری دارید میتوانید پروژه را استارت بزنید.

ما در این مثال از 5 Net Core استفاده مکنیم .برای صحت نصب دستور dotnet --version را در تریمینال خود وارد کنید.

برای شروع باید پیش نیاز های لازم را بر روی سیستم نصب کنید. برای نصب RabbitMQ بر روی ویندوز میتوانید از این لینک استفاده کنید.

برای شروع تریمینال را باز کنید و دو پروژه Console application ایجاد کنید

dotnet new console --name Send mv Send/Program.cs Send/Send.cs dotnet new console --name Receive mv Receive/Program.cs Receive/Receive.cs

دقت کنید این دو پروژه هیچ وابستگی به هم ندارن و به صورت مستقل ایجاد شده اند.

پکیج RabbitMQ.Client را در دو پروژه نصب کنید

cd Send dotnet add package RabbitMQ.Client dotnet restore cd ../Receive dotnet add package RabbitMQ.Client dotnet restore

وارد پروژه send شوید و داخل تابع main کانفیگ های لازم را انجام دهید.

using System; using RabbitMQ.Client; using System.Text; class Send { public static void Main() { varدر factory = new ConnectionFactory() { HostName = &quotlocalhost&quot }; using(var connection = factory.CreateConnection()) using(var channel = connection.CreateModel()) { channel.QueueDeclare(queue: &quothello&quot, durable: false, exclusive: false, autoDelete: false, arguments: null); string message = &quotHello World!&quot var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: &quot&quot, routingKey: &quothello&quot, basicProperties: null, body: body); Console.WriteLine(&quot [x] Sent {0}&quot, message); } Console.WriteLine(&quot Press [enter] to exit.&quot); Console.ReadLine(); } }
send code
send code

در خط 8 یک کانکشن به صورت لوکال اینجاد میکنیم که میتوان یک ادرس ip باشد.

در خط 10 یک channel ایجاد کرده ایم .channel راه ارتباطی بین برنامه و RabbitMQ broker است.با استفاده از QueueDeclare یک صف درون channel ایجاد میکنیم.مقداری تایین شده دورن QueueDeclare در مقاله بعد تشریح خواهیم کرد.در خط 17 داده را به Bytes تبدیل میکنیم.و در خط 18 داده را درون چنل push میکنیم .

وارد پروژه Receive شوید و تابع main را به صورت زیر پیاده سازی کنید.کد های Receive شبیه send میباشد با این تفاوت درقسمت Receive در خط 12 Consumer در حال دریافت داده میباشد

public static void Main() { var factory = new ConnectionFactory() { HostName = &quotlocalhost&quot }; using(var connection = factory.CreateConnection()) using(var channel = connection.CreateModel()) { channel.QueueDeclare(queue: &quothello&quot, durable: false, exclusive: false, autoDelete: false, arguments: null); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Console.WriteLine(&quot [x] Received {0}&quot, message); }; channel.BasicConsume(queue: &quothello&quot, autoAck: true, consumer: consumer); Console.WriteLine(&quot Press [enter] to exit.&quot); Console.ReadLine(); } }

همزمان دو پروژه Receive , send را اجرا کنید

همانطور در شکل ملاحضه میکنید در سیستم Receive عبارت Hello World به درستی دریافت شده است.مثال بالا ساده ترین حالت پیداه سازی RabbitMQ میباشد.


اگه از مقاله راضی بودید میتونید از لینک زیر برام قهوه بخرید : )

https://www.coffeete.ir/sobhan



در حال اپدیت...

rabbitmqnetcore
www.coffeete.ir/sobhan
شاید از این پست‌ها خوشتان بیاید