<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های احسان حسینی</title>
        <link>https://virgool.io/feed/@me_ehsanhosseini</link>
        <description>توسعه دهنده نرم افزار در جاب ویژن</description>
        <language>fa</language>
        <pubDate>2026-06-10 13:05:36</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/204696/avatar/UywYM3.png?height=120&amp;width=120</url>
            <title>احسان حسینی</title>
            <link>https://virgool.io/@me_ehsanhosseini</link>
        </image>

                    <item>
                <title>معرفی RabbitMQ: بخش اول، RabbitMQ چیست؟</title>
                <link>https://virgool.io/dotnetzoom/rabbitmq-tutorial-part1-ukubkbpou5qp</link>
                <description>فهرست بخش های این آموزش:بخش اول، RabbitMQ چیست؟بخش دوم، آشنایی با Exchange ها، Routing Key ها و Binding هابخش سوم، پیاده سازی با سی شارپبخش چهارم، آشنایی با رابط مدیریت تحت وبیکی از فایده های استفاده از Queue ها این است که درصورت Offline بودن بخشی از سیستم در معماری های Microservice خطا های احتمالی را کاهش می دهد. اگر بخشی از سیستم در دسترس نبود، باقی سیستم ها میتوانند تعامل خود را با Queue ادامه دهند.صف بندی پیام ها یا Message Queuing مهمترین قسمت در معماری میکروسرویس است؛ این یکی از راه هایی است که میتوان داده ها را بین سرویس های مختلف جابجا کرد.نرم افزار RabbitMQ یکی از Message Broker های پر استفاده در جهان است، دارای بیش از 35,000 استفاده کننده از استارپ ها تا پروژه های تجاری بزرگ.صف بندی پیام ها این امکان را میدهد که سرویس ها به طور غیر همزمان(Asynchronous) با یکدیگر ارتباط داشته باشند، به عبارت دیگر سرویس هایی که پیام ها را ارسال و دریافت می کنند، با صف تعامل دارند به جای اینکه مستقیما با یکدیگر تعامل داشته باشند.تولید کننده پیام(Message Producer) پیام خود را در صف قرار میدهد بدون اینکه منتظر بماند تا آن ها پردازش شوند.معرفی Exchange:پیام ها مستقیما در صف ها قرار نمیگیرند؛ به جای آن، Producer پیام خود را برای Exchange ارسال میکند. سپس Exchange پیام ها را از Producer دریافت میکند و آنها را به سمت Queue مناسب میفرستد(Route می کند). این کار با کمک Binding ها و Routing Key ها انجام می شود. Binding یک اتصال بین Queue و Exchange است.جریان پیام(Message Flow) در RabbitMQ:1. فرستنده(Producer) یک Message را با Exchange مشخص ارسال می کند؛ درصورت  مشخص نکردن Exchange مقدار پیش فرض Direct درنظر گرفته خواهد شد.2. پس از ارسال پیام، Exchange پیام را دریافت میکند و اکنون عهده دار Route کردن پیام به سوی Queue مناسب است. Exchange بسته به Exchange type مشخص شده از روش های مختلفی برای Route کردن Message استفاده می کند (در ادامه انواع Exchange type ها معرفی می شوند)3. در عکس پایین ما دو Binding از Exchange به دو Queue مختلف داریم. Exchange پیام را به سمت Queue درست Route میکند4. این پیام ها تا زمانی که گیرنده(Consumer) آن ها را پردازش کند در داخل Queue قرار خواهند گرفت5. سپس Consumer پیام های پردازش شده را از لیست حذف میکند.انواع Exchange ها:نوع Direct: یک Direct Exchange براساس Routing Key مشخص شده در پیام، پیام ها را به سمت Queue ها Route میکند. در Direct Exchange پیام به سمت Queue مناسب که Binding key آن دقیقا مطابق Routing key پیام باشد هدایت میشود. برای مثال، اگر Queue برای Bind شدن به Exchange از &quot;pdfprocess&quot; به عنوان Binding key استفاده کند، یک پیام ارسال شده به سمت Exchange با Routing key حاوی &quot;pdfprocess&quot; به سمت این صف ارسال خواهد شد.نوع Topic: یک Topic Exchange از Pattern برای انطباق Routing key موجود در پیام و Binding key موجود در Binding استفاده می کند.نوع Fanout: یک Fanout Exchange پیام ها را به سمت همه Queue های Bind شده به این Exchange ارسال می کند.نوع Header: یک Header Exchange از Attribute های موجود در Header پیام برای مسیریابی استفاده می کند.مفاهیم RabbitMQ:مفهوم Producer: اپلیکیشنی که پیام را ارسال می کند.مفهوم Consumer: اپلیکیشنی که پیام را دریافت می کند.مفهوم Queue: بافر برای ذخیره سازی پیام ها.مفهوم Message: دیتا ارسال شده از طرف Producer به Consumer به واسطه RabbitMQ.مفهوم Connection: اتصال TCP بین اپلیکیشن و RabbitMQ broker.مفهوم Channel: یک اتصال مجازی در یک اتصال اصلی. انتشار یا دریافت پیام، همه با Channel انجام میشود.مفهوم Exchange: دریافت پیام از Producer ها و Push کردن آنها روی Queue بسته به قوانین تعریف شده در Exchange type. یک صف احتیاج دارد که به حداقل یک Exchange مقید شده باشد تا بتواند پیام ها را دریافت کند.مفهوم Binding: اتصال بین Queue و Exchange.مفهوم Routing key: یک کلید در Message که Exchange با استفاده از آن تصمیم می گیرد چطور پیام را به سمت صف Route کند. Routing key را به عنوان آدرس مقصد پیام درنظر بگیرید.مفهوم AMQP: مخفف Advanced Message Queuing Protocol، پروتکل اصلی مورد استفاده برای Messaging در RabbitMQ.مفهوم Users: این امکان وجود دارد که به وسیله نام کاربری و رمز عبور و مجوز های دسترسی مشخص شده به RabbitMQ وصل شد. همچنین میتوان برای کاربران مجوز دسترسی به Virtual host خاص تعیین کرد.مفهوم VHost: برای تفکیک اپلیکیشن هایی که درحال استفاده از RabbitMQ هستند از Virtual Host استفاده میکنیم. کاربران مختلف میتوانند دسترسی های مختلفی به VHost ها و Queue ها و Exchange های مختلف داشته باشند.مفهوم Acknowledgments and Confirms: شاخص هایی برای مشخص کردن اینکه پیام دریافت شد یا پردازش شد. Acknowledgements میتواند در هر دو طرف استفاده شود؛ برای مثال، یک Consumer میتواند به سرور اطلاع بدهد که پیام دریافت یا پردازش شد، و سرور هم میتواند همچنین گزارشی را به Producer بدهد.نصب و استفاده از RabbitMQ در ویندوز:پیش از نصب RabbitMQ احتیاج به نصب ورژن سازگار Erlang با RabbitMQ داریم.برای دانلود RabbitMQ اینجا کلیک کنید.برای دیدن ورژن سازگار Erlang با RabbitMQ اینجا کلیک کنید.برای دانلود Erlang اینجا کلیک کنید.پس از نصب RabbitMQ احتیاج داریم که پنل مدیریت تحت وب آن را فعال کنیم برای این منظور، کامند لاین را باز کرده و به آدرس زیر یا آدرسی که RabbitMQ را نصب کردید بروید:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.9\sbinدستور زیر را در کامند لاین وارد کنید تا پنل مدیریت تحت وب شما آماده شود:rabbitmq-plugins enable rabbitmq_managementاکنون رابط مدیریت RabbitMQ در آدرس http://localhost:15672 در دسترس است. نرم افزار RabbitMQ پنل مدیریت تحت وب راحتی را برای مدیریت و مانیتورینگ سرور فراهم آورده.در بخش های بعد یاد خواهیم گرفت که چطور از این رابط مدیریت استفاده کنیم.در بخش های بعدی مباحث پیشرفته تری را از RabbitMQ یاد میگیریم.این مطالب در کانال تلگرام قرار گرفت. می توانید از تلگرام هم من را دنبال کنید.https://t.me/Dev_EhsanHosseini</description>
                <category>احسان حسینی</category>
                <author>احسان حسینی</author>
                <pubDate>Wed, 25 Nov 2020 11:27:48 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی RabbitMQ: بخش چهارم، آشنایی با رابط مدیریت تحت وب</title>
                <link>https://virgool.io/dotnetzoom/rabbitmq-tutorial-part4-zdfrzkw4lrl0</link>
                <description>فهرست بخش های این آموزش:بخش اول، RabbitMQ چیست؟بخش دوم، آشنایی با Exchange ها، Routing Key ها و Binding هابخش سوم، پیاده سازی با سی شارپبخش چهارم، آشنایی با رابط مدیریت تحت وب در این بخش یاد می گیریم که چطور از طریق پنل مدیریت تحت وب RabbitMQ، صف ها، Connection ها، Channel ها، Exchange ها و User ها را مدیریت کنیم. علاوه بر آن، می توانیم نرخ ارسال و دریافت پیام ها را مانیتور کنیم؛ یا به طور دستی پیامی را به یک Exchange یا Queue خاص ارسال کنیم.این رابط کاربری یک پلاگین است که در پشت صحنه به وسیله HTTP API با RabbitMQ ارتباط برقرار می کند و به طور پیش فرض بر روی RabbitMQ نصب شده است و پس از نصب RabbitMQ می توانیم آن را فعال کنیم(در بخش اول یاد گرفتیم که چطور RabbitMQ را نصب کنیم و پلاگین Management را فعال کنیم ). از این رابط مدیریت می توان برای عیب یابی سیستم هم استفاده کرد.در این بخش با همه ی تب های این رابط مدیریت آشنا خواهیم شد. سپس با یک مثال خواهیم دید که چطور یک Queue و Exchange و Binding بین آن ها را نصب و کانفیگ کنیم.مفاهیم:مفهوم Cluster: یک Cluster شامل تعدادی Node از کامپیوتر هایی است که با هم کار می کنند. یک Instance از RabbitMQ که بیش از یک Node داشته باشد، Cluster نامیده می شود.مفهوم Node: یک کامپیوتر در RabbitMQ Cluster.تب Overviewبا نگاه کلی به شکل 1 دو نمودار را می بینیم؛ یک نمودار پیام های صف شده(Queued Message) را نشان می دهد و دیگری نرخ پیام ها(Message rates) را نشان می دهد. در بالای نمودار ها با کلیک روی &quot;last minute&quot; می توان فاصله زمانی(Interval) نمودار ها را تغیر داد. همچنین با کلیک روی &quot;?&quot; می توان اطلاعات دیگری را مشاهده کرد.نمودار پیام های صف شده(Queued message):این نمودار یک تعداد کلی از پیام های صف شده از همه Queue ها می دهد. Ready تعداد پیام های آماده تحویل را نشان میدهد. Unacked تعداد پیام هایی که منتظر پاسخ از طرف Consumer هستند تا از Queue حذف شوند را نشان می دهد.نمودار نرخ پیام ها(Message rates):نرخ پیام ها یک نمودار است که نشان می دهد رسیدگی به پیام ها با چه سرعتی انجام گرفته. شکل 1 - رابط مدیریت RabbitMQبخش Nodes:این بخش اطلاعاتی را درباره Node های مختلف RabbitMQ نشان می دهد. همچنین در اینجا اطلاعاتی درباره سرور و رم و تعداد Erlang process به ازای هر Node و پلاگین های فعال وجود دارد.شکل 2 - اطلاعات مختص Nodeبخش های Import/Export definitions:این امکان وجود دارد که کانفیگ ها و تنظیمات انجام شده در RabbitMQ را Export کنیم یا یک کانفیگ را Import کنیم. با Export کردن و دانلود کانفیگ ها ما یک فایل JSON از همه تنظیمات و کانفیگ های RabbitMQ خواهیم داشت. از این فایل JSON می توان برای بازیابی Exchange ها، Queue ها، VHost ها، سیاست(Policy) ها و User ها استفاده کرد. همچنین از این ویژگی می توان برای بک آپ استفاده کرد.شکل 3 - Import و Export کردن در فایل JSONتب های Connections و Channelsاتصالات(Connection) و Channel ها در RabbitMQ می توانند وضعیت های مختلفی اعم از Starting، Tuning، Opening، Running، Flow، Blocking، Blocked، Closing یا Closed باشد.شکل 4 - تب Connections در رابط مدیریت RabbitMQتب Connectionsدر تب Connection(شکل 4) اتصالات فعال به سرور RabbitMQ را نشان می دهد. Username نشان می دهد که این Connection مربوط به کدام کاربر است. Channels تعداد Channel هایی که از این Connection استفاده می کنند را نشان می دهد. SSL/TLS مشخص می کند که آیا این Connection توسط SSL امن شده است یا خیر.با کلیک روی یکی از Connection ها می توان یکسری اطلاعات درباره آن Connection خاص بدست آورد(شکل 5). در این بخش میتوان لیست Channel های فعال که درون این Connection و نرخ جابجایی داده ها و مشخصات Client را مشاهده کرد، همچنین در این قسمت می توانید Connection را ببندید.شکل 5 - اطلاعات اتصال یک Connection خاصتب Channels:تب Channel(شکل 6) اطلاعاتی را درباره تمامی Channel های حاضر نشان می دهد.شکل 6 - تب Channelبا کلیک بر روی یکی از Channel ها اطلاعاتی درباره آن به ما میدهد(شکل 7). نرخ پیام ها و تعداد Consumer ها را می توان از این بخش مشاهده کرد.شکل 7 - جزئیات درباره یک Channel خاصتب Exchangesلیست همه Exchange ها را می توان در این تب مشاهده کرد(شکل 8). ستون Features پارامتر های Exchange را نشان می دهد(برای مثال: D به معنی Durable است و AD به معنی Auto-Delete). مقدار ستون های Features و Type را می توان هنگام ساخت Exchange مشخص کرد. در این لیست تعدادی Exchange وجود دارند که با amq شروع شده اند و یکی به نام (AMQP Default) که از Exchange های پیشفرض هستند.شکل 8 - تب Exchangeبا کلیک بر روی نام Exchange می توانید جزئیات آن Exchange را مشاهده کنید(شکل 9). اضافه کردن Binding جدید به این Exchange و مشاهده Binding های قبلی و ارسال پیام به وسیله این Exchange و حذف Exchange از کار های دیگری است که می توان در این قسمت انجام داد.شکل 9 - جزئیات یک Exchangeتب Queuesدر این تب میتوان همه Queue های ثبت شده در یک یا همه VHost ها را مشاهده کرد(شکل 10). همچنین می توانید در این قسمت یک Queue جدید بسازید. Queue ها براساس اینکه چرا و چطور ساخته می شوند پارامتر ها و آرگومان های متفاوتی خواهند داشت. ستون Feature پارامتر ها و آرگومان های هر Queue را نشان می دهد، مثل: مفهوم Durable: یک Durable Queue اطمینان می دهد که RabbitMQ پیام ها به دست Consumer می رساند و منتظر می ماند تا Consumer پیام را پردازش کند، سپس پیام را از درون Queue حذف می کند؛ تا اگر پیام در حین پردازش در سمت Consumer با خطا رو به رو شد RabbitMQ دوباره پیام را برای پردازش ارسال کند.مفهوم Message TTL: مدت زمانی که پیام درون Queue می تواند زنده بماند قبل از اینکه دور انداخته شود.مفهوم Auto-expire: مدت زمانی که Queue می تواند بدون استفاده بماند قبل از اینکه به طور خودکار حذف شود.مفهوم Max length: حداکثر تعداد پیامی که Queue می تواند نگهداری کند قبل از اینکه آن ها را دور بریزد.مفهوم Max length byte: حداکثر سایز کل پیام هایی که Queue می تواند نگهداری کند قبل از اینکه آن ها را دور بریزد.شکل 10 - تب Queuesبا کلیک روی هر Queue از لیست Queue ها میتوان همه اطلاعات مربوط به آن را مشاهده کرد(شکل 11). دو نمودار اول به طور کلی اطلاعات مشابهی را درباره تعداد و نرخ پیام های این Queue نشان می دهند.شکل 11 - اطلاعات جزئی درباره یک Queue خاصبخش Consumersدر این بخش می توان Consumer ها و Channel های متصل به این Queue را مشاهده کرد(شکل 12).شکل 12 - لیست Consumer های متصل به Queueبخش Bindingsهمه Binding های فعال مربوط به این Queue در این قسمت نمایش داده می شوند. همچنین Binding های جدید را می توان از این بخش ایجاد کرد(شکل 13).بخش 13 - لیست Binding های مربوط به این Queueبخش Publish messageدر این بخش می توان یک پیام را به صورت دستی بر روی Queue منتشر کرد(شکل 14). این پیام به وسیله Exchange پیش فرض یعنی AMQP default با Routing key برابر با نام Queue منتشر خواهد شد؛ همچنین این امکان وجود دارد که پیام را بر روی یک Exchange منتشر کنید(در قسمت معرفی تب Exchange در این باره توضیح داده شد).شکل 14 - ارسال پیام به Queue به صورت دستیبخش Get messagesدر این بخش می توان پیام ها را به صورت دستی بررسی کرد(شکل 15).  این نکته را در نظر داشته باشید که با این کار پیام از صف خارج می شود و ممکن است به دست Consumer نرسد؛ برای جلوگیری از این اتفاق فیلد Ack Mode را برابر با &quot;Nack message requeue true&quot; قرار دهد اگر با گزینه های دیگر آشنا نیستید از همین گزینه استفاده کنید؛ این گزینه پیام را از صف خارج و دوباره وارد می کند و عملا پیام از دست نمی رود. در Messages تعداد پیام هایی که میخواهید واکشی شود را وارد کنید.شکل 15 - بررسی پیام ها به صورت دستیبخش های Delete و Purgeدر این بخش می توانیم یک Queue را حذف یا خالی کنیم(شکل 16). با زدن از دکمه Delete Queue میتوان یک Queue را حذف کرد و با زدن دکمه Purge Messages می توان همه پیام های درون Queue را حذف کرد.شکل 16 - حذف Queue و پاک کردن همه پیام های درون Queueتب ادمیندر بخش Users(شکل 17) میتوان کاربران را حذف و اضافه کرد و دسترسی هایی برای آن ها تعیین کرد. شکل 17 - تب ادمین بخش Usersدر بخش Virtual Hosts(شکل 18) میتوان Virtual Host ایجاد کرد و آن ها را مدیریت کرد.شکل 18 - تب ادمین بخش Virtual Hostsیک مثالدر این مثال می خواهیم یک Exchange به نام example.exchange ایجاد کنیم؛ سپس یک Queue به نام example_queue ایجاد میکنیم؛ در مرحله بعد یک Binding به نام example_binding و Binding key با مقدار example_key ایجاد میکنیم؛ در مرحله آخر یک پیام را از example.exchange ارسال می کنیم تا وارد example_queue شود؛ و در مرحله آخر پیام را از example_queue می خوانیم.1- یک exchange به نام example_exchange از نوع Direct ایجاد می کنیم(شکل 19). برای این کار وارد تب Exchange می شویم و در بخش &quot;Add a new exchange&quot; کانفیگ Exchange جدید را وارد می کنیم.شکل 19 - ساخت Exchange2- یک Queue به نام example_queue ایجاد می کنیم. برای این کار وارد تب Queues می شویم و در بخش &quot;Add a new queue&quot; کانفیگ Queue جدید را وارد می کنیم(شکل 20).شکل 20 - ساخت Queue3- اکنون باید بین example.exchange و example_queue یک Binding ایجاد کنیم تا Message هایی که با Routing key برابر example_key وارد example.exchange می شوند به example_queue ما هدایت شوند. برای این کار وارد تب Queues می شویم، سپس از جدول Queue ها بر روی example_queue کلیک می کنیم تا وارد جزئیات آن شویم سپس در بخش Bindings کانفینگ Binding جدید را وارد می کنیم(شکل 21).شکل 21 - ایجاد Binding4- تا اینجا Queue و Exchange و Binding بین آن ها آماده شد. اکنون یک پیام را توسط example.exchange برای example_queue ارسال می کنیم. برای این کار وارد تب Exchanges شده و از جدول Exchange ها بر روی example.exchange کلیک می کنیم تا وارد جزئیات آن شویم؛ سپس در بخش &quot;Publish message&quot; اطلاعات پیامی که می خواهیم ارسال شود را وارد می کنیم(شکل 22).شکل 22 - ارسال پیام از طرف example.exchange5- تا الان پیام ما برای example_queue ارسال شد و در صف قرار گرفت؛ اکنون می خواهیم پیام را از صف خارج کنیم و نمایش دهیم. برای این کار به تب Queues رفته و از جدول Queue ها روی example_queue کلیک کنید تا وارد جزئیات آن شویم؛ سپس از بخش &quot;Get messages&quot; می توانیم پیام های درون Queue را ببینیم؛ اما می خواهیم علاوه بر اینکه پیام نشان داده میشود از Queue هم حذف شود به این منظور فیلد &quot;Ack mode&quot; را برابر &quot;Ack message requeue false&quot; قرار می دهیم(شکل 23).شکل 23 - خواندن پیام از Queueدر بخش های بعدی مباحث پیشرفته تری را از RabbitMQ یاد میگیریم.این مطالب در کانال تلگرام قرار گرفت. می توانید از تلگرام هم من را دنبال کنید.https://t.me/Dev_EhsanHosseini</description>
                <category>احسان حسینی</category>
                <author>احسان حسینی</author>
                <pubDate>Wed, 25 Nov 2020 01:29:27 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی RabbitMQ: بخش سوم، پیاده سازی با سی شارپ</title>
                <link>https://virgool.io/dotnetzoom/rabbitmq-tutorial-part3-l57bej8c2wtt</link>
                <description>فهرست بخش های این آموزش:بخش اول، RabbitMQ چیست؟بخش دوم، آشنایی با Exchange ها، Routing Key ها و Binding هابخش سوم، پیاده سازی با سی شارپبخش چهارم، آشنایی با رابط مدیریت تحت وبدر این بخش یاد میگیریم که چطور RabbitMQ را در سمت Consumer و Producer پیاده سازی کنیم و پیام را ارسال و دریافت کنیم.ابتدا احتیاج داریم که در RabbitMQ یک Queue برای پیام ها ایجاد کنیم.اگر RabbitMQ را نصب نکرده اید بخش اول را مطالعه کنید.مرورگر را باز کرده و به آدرس http://localhost:15672 یا هر آدرسی که برای Management تنظیم کرده اید بروید:به تب Queues رفته و در زیر جدول بر روی &quot;Add a new queue&quot; کلیک کنید تا فرم آن باز شود.در فیلد Name مقدار &quot;test_queue&quot; را به عنوان نام Queue وارد کنید و روی &quot;Add Queue&quot; کلیک کنید.چون هیچ Exchange مشخصی را به این Queue مقید(Bind) نکرده ایم، از Exchange پیش فرض استفاده می شود؛ همانطور که در بخش دوم گفته شد، این Exchange پیام ها را به سمت یک Queue که نام آن برابر Routing key پیام باشد هدایت میکند.اکنون باید یک Producer ایجاد کنیم که پیام را به سمت RabbitMQ ارسال کند.ابتدا پروژه سی شارپ جدیدی برای Producer ایجاد کرده سپس پکیج &quot;RabbitMQ.Client&quot; را از Nuget نصب کنید؛ پس از نصب پکیج کد زیر را در Program.cs وارد کنید.در کد بالا از خط 11 تا 18 یک کانکشن برای اتصال به RabbitMQ ایجاد کرده ایم سپس در خط 20 یک Channel از روی این کانکشن میسازیم سپس در خطوط بعد پیام را از کاربر می گیریم و آن را به آرایه ای از بایت تبدیل میکینم و ارسال می کنیم؛ در خط 30 متد BasicPublish در اولین آرگومان، نام Exchange را دریافت می کند که ما آن را خالی گذاشته ایم تا پیام به سمت Exchange پیش فرض ارسال شود؛ در آرگومان دوم Routing key دریافت می شود.کد بالا را اجرا کنید و یک پیام ارسال کنید سپس به پنل مدیریت RabbitMQ بروید در تب Queues در جدول لیست Queue ها خواهید دید که ستون Ready و Total عدد یک را نشان می دهند(اگر هنوز هم صفر بود چند ثانیه صبر کنید سپس صفحه را رفرش کنید).پیام ما درون Queue قرار گرفت و تا زمانی که Consumer آن را پردازش کند باقی خواهد ماند؛ اکنون احتیاج به یک Consumer داریم که پیام ما را دریافت کند؛ برای این کار ابتدا پروژه سی شارپ جدیدی برای Consumer ایجاد کرده سپس پکیج &quot;RabbitMQ.Client&quot; را از Nuget نصب کنید؛ پس از نصب پکیج کد زیر را در Program.cs وارد کنید.در کد بالا از خط 12 تا 21 یک کانکشن برای اتصال به RabbitMQ ایجاد کرده ایم سپس در خط 23 یک Channel از روی این کانکشن میسازیم. در خط 25 تا 35 یک Event برای دریافت پیام ها ایجاد می کنیم.زمانی که RabbitMQ پیام را برای Consumer ارسال میکند ممکن است پیام در حین پردازش به هر دلیلی با خطا مواجه شود؛ در اینصورت پیام از بین می رود؛ اما RabbitMQ راه حلی برای این مشکل دارد؛ به این صورت که اگر موقع ایجاد صف Durability آن را برابر Durable قرار دهیم(به طور پیش فرض برابر Durable است) پس از آنکه RabbitMQ پیام را برای Consumer ارسال کرد منتظر پاسخ از طرف Consumer می ماند و پس از دریافت پاسخ، پیام را از Queue حذف میکند. در خط 32 پاسخ تایید را برای RabbitMQ ارسال می کنیم تا پیام را حذف کند.در بخش های بعدی مباحث پیشرفته تری را از RabbitMQ یاد میگیریم.این مطالب در کانال تلگرام قرار گرفت. می توانید از تلگرام هم من را دنبال کنید.https://t.me/Dev_EhsanHosseini</description>
                <category>احسان حسینی</category>
                <author>احسان حسینی</author>
                <pubDate>Sat, 21 Nov 2020 19:14:33 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی RabbitMQ: بخش دوم، آشنایی با Exchange ها، Routing Key ها و Binding ها</title>
                <link>https://virgool.io/dotnetzoom/rabbitmq-tutorial-part2-pwujw8qndy09</link>
                <description>فهرست بخش های این آموزش:بخش اول، RabbitMQ چیست؟بخش دوم، آشنایی با Exchange ها، Routing Key ها و Binding هابخش سوم، پیاده سازی با سی شارپبخش چهارم، آشنایی با رابط مدیریت تحت وبدر این بخش یاد میگیریم که Exchange و Binding و Routing Key چیست؟ اینکه Exchange ها و Queue ها چطور با هم ارتباط برقرار می کنند؟ تفاوت انواع Exchange ها و سناریو های استفاده از آن ها را در RabbitMQ یادمیگیریمهمانطور که در بخش قبلی ذکر شد، پیام ها مستقیما به سمت Queue ها منتشر نمی شوند. به جای آن، Producer پیام ها را برای Exchange ارسال می کند. Exchange ها در VHost موجود در RabbitMQ قرار دارند و مامور مسیریابی(Route) پیام هستند. Exchange ها پیام ها را از طرف اپلیکیشن های Producer دریافت می کنند و آن ها را با کمک Header Attribute ها و Binding ها و Routing Key ها به سمت Queue های مناسب هدایت می کند.هر Binding یک اتصال کانفیگ شده برای برقراری ارتباط بین Queue و Exchange است. Routing Key یک Attribute در Message است. Exchange ممکن است زمانی که درحال تصمیم گیری درباره این باشد که چطور یک پیام را به سمت Queue مناسب هدایت کند بسته به Exchange Type نگاه متفاوتی نسبت به Routing key پیام و Binding key مشخص شده در Binding بین Queue و Exchange داشته باشد.میتوان موقع ساخت Exchange ها، Connection ها و Queue ها کانفیگ هایی را بر روی آنها انجام داد؛ مثل، Durable یا Temprory یا Auto Delete. به طور خلاصه Durable Exchange ها پس ریستارت شدن سرور زنده می مانند تا زمانی که حذف شوند. Temporary Exchange ها تا قبل از خاموش شدن سرور وجود دارند. Auto-deleted exchange ها زمانی که هیچ Binding به آنها وجود نداشته باشد از بین می روند.در RabbitMQ، چهار نوع مختلف از Exchange ها پیام ها را به روش های مختلف و با استفاده از پارامتر ها و Binding های مختلف هدایت میکنند. Client ها می توانند Exchange های منحصر به فرد خود را بسازند یا از Exchange های پیش فرض از پیش تعریف شده استفاده کنند.معرفی Direct Exchange:یک Direct Exchange پیام ها را براساس Routing key به Queue ها تحویل میدهد. Routing key یک Message Attribute است که توسط Producer به Message اضافه می شود. اینطور درنظر بگیرید که Routing key یک &quot;آدرس&quot; است که Exchange از آن استفاده میکند تا تصمیم بگیرد که چطور پیام را هدایت کند. یک پیام به سمت صف هایی میرود که Binding key آن ها دقیقا برابر با Routing Key پیام باشد. نوع Direct Exchange برای تمیز دادن پیام های منتشر شده به سمت Exchange مشابه با یک شناسه ساده مورد استفاده استدر عکس زیر(شکل 1) Queue با نام create_pdf_queue به یک Direct Exchenge به نام pdf_events با Binding key مشخص pdf_create مقید(Bind) شده است. هنگامی که یک Message جدید که مقدار Routing key آن برابر با pdf_create باشد به Direct Exchange می رسد، Exchange آن را به سمت Queue که binding_key=routing_key باشد هدایت می کند، در تصویر زیر به سمت صف A یعنی create_pdf_queue هدایت می شودشکل 1 - یک پیام به سمت هر Queue هدایت می شود که Binding key آن دقیقا برابر با Routing key باشد.سناریو اول:نام Exchange مورد استفاده: pdf_eventsنام Queue مورد استفاده: create_pdf_queueمقدار Binding key بین Exchange و Queue مورد استفاده: pdf_createسناریو دوم:نام Exchange مورد استفاده: pdf_events نام Queue مورد استفاده: pdf_log_queueمقدار Binding key بین Exchange و Queue مورد استفاده: pdf_logیک پیام با Routing key مقدار pdf_log به سمت Exchange به نام pdf_events ارسال شده است(شکل 1). پیام به سمت create_log_queue هدایت می شود چون مقدار Routing key مطابق Binding key آن است.نکته: اگر Routing key پیام با هیچ Binding key مطابقت نداشته باشد، پیام دور انداخته خواهد شد.به طور پیش فرض AMQP broker ها برای Direct Exchange از &quot;amq.direct&quot; استفاده میکنند.معرفی Exchange پیش فرضاین Exchange یک Direct Exchange از پیش تعریف شده است که هیچ نامی ندارد. زمانی که از Exchange پیش فرض استفاده می شود، پیام به سمت Queue با نامی برابر با Routing key پیام هدایت می شود. همه Queue ها به طور خودکار به Exchange پیش فرض با Binding key برابر با نام صف، Bind شده اندمعرفی Topic Exchangeاین Exchange مقدار Binding key را به دید یک Pattern نگاه می کند و پیام های دریافتی را براساس انطباق Routing key و Binding key هدایت میکند. پیام ها می توانند به سمت هر Queue که به این Exchange type مقید شده باشند و Binding key آن ها منطبق با Routing key پیام باشد هدایت شوند.مقدار Routing key باید لیستی از کلمات باشد که توسط نقطه (.) از هم جدا شده باشند. مثل agreements.us یا agreements.eu.stockholm. مقدار Routing key ها می تواند شامل ستاره (*) باشد که هر ستاره با فقط یک کلمه منطبق میشود(*.*.b.*). علامت هشتگ نشان دهنده هیچ یا چند کلمه است.شکل 2 - پیام ها براساس انطباق بین Routing key و Binding key به سمت یک یا چند Queue هدایت میشوند.به طور پیش فرض AMQP broker ها برای Topic Exchange از &quot;amq.topic&quot; استفاده میکنند.با درنظر گرفتن شکل 2، به مثال های زیر توجه کنید:سناریو اول:Routing key: agreements.eu.berlin.xReciever Queues: berlin_agreements, all_agreementsسناریو دوم:Routing key: agreements.eu.x.yReciever Queues: all_agreementsسناریو سوم:Routing key: agreements.x.y.storeReciever Queues: store_agreements, all_agreementsسناریو چهارم:Routing key: agreements.x.y.zReciever Queues: all_agreementsمعرفی Fanout Exchange:یک Fanout Exchange یک کپی از پیام دریافت شده را بدون درنظر گرفتن Routing Key برای همه Queue های Bind شده به این Exchange ارسال میکند.این Exchange زمانی مورد استفاده است که می خواهیم Message های مشابه را به یک یا چند Queue با Consumer هایی که هر کدام پیام های مشابه را به روش های مختلف پردازش می کنند ارسال کنیم.به طور پیش فرض AMQP broker ها برای Fanout Exchange از &quot;amq.fanout&quot; استفاده میکنند.شکل 3 - دریافت پیام و Route کردن آن به سمت همه Queue هایی که به Exchange مشخص Bind شده باشندمعرفی Header Exchange:یک Header Exchange براساس آرگومان های Header هر Request و مقادیر اختیاری، پیام ها را Route میکند. مشابه Topic Exchenge ها، Header Exchenge موقع تصمیم گیری برای Route کردن پیام ها به جای درنظر گرفتن Routing key، مقادیر Header را درنظر میگیرد. برای انطباق بررسی میکند که مقادیر Header با مقادیر مشخص شده در Binding برابر باشند.آرگومان &quot;x-match&quot; را می توان فقط یکبار در Binding بین Exchange و Queue استفاده کرد. به وسیله این آرگومان مشخص میکنیم که آیا باید همه آرگومان های Header منطبق باشند یا فقط یکی کافی است. آرگومان &quot;x-match&quot; دو مقدار مختلف را می پذیرد: &quot;any&quot; یا &quot;all&quot;، که &quot;all&quot; مقدار پیش فرض است. مقدار &quot;all&quot; به این معنی است که همه Header شامل جفت Key و Value ها باید منطبق باشند و مقدار &quot;any&quot; به این معنی است که حداقل یکی از آرگومان های Header باید منطبق بشه. به طور پیش فرض AMQP broker ها برای Header Exchange از &quot;amq.header&quot; استفاده میکنند.شکل 4 - Header Exchange پیام ها را براساس آرگومان های Header به Queue هایی که به آن Bind شده باشند ارسال می کند.معرفی Dead Letter Exchange:نرم افزار RabbitMQ یک AMQP Extension به نام Dead Letter Exchange را فراهم آورده. این Exchange پیام های مرده را دریافت می کند و به سمت Queue مناسب ارسال می کند. زمانی یک پیام می میرد که عمر آن به پیان رسیده باشد(درصورت تنظیم کردن x-message-ttl برای Queue) یا Queue پر شده باشد(درصورت تنظیم کردن x-max-length برای Queue) یا Consumer پس از دریافت پیام در پاسخ &quot;nacked&quot; را برای سرور ارسال کند.یک Dead Letter Exchange وابسته به Exchange type خاصی نیست و به طور دستی باید کانفیگ شود.برای پیاده سازی Dead Letter Exchange راه آسانی در پیش داریم برای این کار در زمان ساخت Queue دو آرگومان به آن اضافه می کنیم، x-dead-letter-exchange برای مشخص کردن اینکه پس از مرگ پیام، به سمت کدام Exchange فرستاده شود و x-dead-letter-routing-key برای مشخص کردن Routing key پیام پس از مرگ.در بخش های بعدی مباحث پیشرفته تری را از RabbitMQ یاد میگیریم.این مطالب در کانال تلگرام قرار گرفت. می توانید از تلگرام هم من را دنبال کنید.https://t.me/Dev_EhsanHosseini</description>
                <category>احسان حسینی</category>
                <author>احسان حسینی</author>
                <pubDate>Sat, 21 Nov 2020 01:45:01 +0330</pubDate>
            </item>
            </channel>
</rss>