RabbitMQ. Частка 1. Introduction. Erlang, AMQP

Добры дзень, Хабр! Жадаю падзяліцца падручнікам-даведнікам ведаў, якія мне атрымалася сабраць па RabbitMQ і сціснуць у кароткія рэкамендацыі і высновы.

Змест

  • RabbitMQ. Частка 1. Introduction. Erlang, AMQP і RPC
  • RabbitMQ. Частка 2. Разбіраемся з Exchanges
  • RabbitMQ. Частка 3. Разбіраемся з Queues і Bindings
  • RabbitMQ. Частка 4. Разбіраемся з тым, што-такое паведамленні і фрэймы
  • RabbitMQ. Частка 5. Прадукцыйнасць публікацыі і спажыванні паведамленняў
  • RabbitMQ. Частка 6. Агляд модуляў Federation і Shovel
  • RabbitMQ. Частка 7. Падрабязна пра Connection і Chanel
  • RabbitMQ. Частка 8. RabbitMQ у .NET
  • RabbitMQ. Частка 9. Маніторынг

Коратка пра AMQP

AMQP (Advanced Message Queuing Protocol) - адкрыты пратакол для перадачы паведамленняў паміж кампанентамі сістэмы. Асноўная ідэя складаецца ў тым, што асобныя падсістэмы (ці незалежныя прыкладанні) могуць абменьвацца адвольнай выявай паведамленнямі праз AMQP-брокер, які ажыццяўляе маршрутызацыю, магчыма гарантуе дастаўку, размеркаванне струменяў дадзеных, падпіску на патрэбныя тыпы паведамленняў.

пратакол AMQP уводзіць тры паняцці:

RabbitMQ. Частка 1. Introduction. Erlang, AMQP

  • exchange (кропка абмену або абмен) - у яе адпраўляюцца паведамленні. Кропка абмену размяркоўвае паведамленне у адну ці некалькі чэргаў. Яна маршрутызуе паведамленні ў чаргу на аснове створаных сувязей (binding) паміж ім і чаргой
  • queue (чарга) - структура дадзеных на дыску або ў аператыўнай памяці, якая захоўвае спасылкі на паведамленні і аддае копіі паведамленняў consumers (спажыўцам)
  • binding (прывязка) - правіла, якое паведамляе кропцы абмену ў якую з чэргаў гэтыя паведамленні павінны трапляць

Пратакол працуе па-над TCP / IP.

Коратка пра Erlang

Зыходны код праекта знаходзіцца ў рэпазітары на GitHub. Архітэктура RabbitMQ-server заснавана на Erlang і BEAM.

Erlang распрацаваны кампаніяй Ericsson у сярэдзіне 1980-х як размеркаваная, адмоваўстойлівая, сістэма рэальнага часу для прыкладанняў, якія патрабуюць безадмоўнай працы 99,999%. Erlang прымяняецца ў розных галінах і сучасных прыкладанням, напрыклад у WhatsApp. Падрабязней можна прачытаць у артыкуле архітэктура WhatsApp, якую Facebook купіў за $19 мільярдаў

Коратка пра RabbitMQ

RabbitMQ - Гэта брокер паведамленняў з адкрытым зыходным кодам. Ён маршрутызуе зносіны па ўсіх базавых прынцыпах пратакола. AMQP апісаным у спецыфікацыі. RabbitMQ рэалізуе і дапаўняе пратакол AMQP.

Асноўная ідэя мадэлі абмену паведамленнямі ў RabbitMQ заключаецца ў тым, што producer (выдавец) не адпраўляе паведамленні непасрэдна ў чаргу. Насамрэч і даволі часта выдавец нават не ведае, ці будзе паведамленне ўвогуле дастаўлена ў якую-небудзь чаргу.

Замест гэтага выдавец можа дасылаць паведамленні толькі на абмен. З аднаго боку, абмен атрымлівае паведамленні ад выдаўцоў, а з другога - адпраўляе іх у чэргі. Абмен павінен сапраўды ведаць, што рабіць з атрыманым паведамленнем. Ці павінна яно быць дададзена ў пэўную чаргу? Ці павінна яно быць дададзена ў некалькі чэргаў? Або паведамленне трэба ігнараваць.

RabbitMQ. Частка 1. Introduction. Erlang, AMQP

Коратка працу RabbitMQ можна апісаць наступным чынам:

  1. Выдавец адпраўляе паведамленне вызначанаму абмену
  2. Абмен, атрымаўшы паведамленне, маршрутызуе яго ў адну ці некалькі чэргаў у адпаведнасці з правіламі прывязкі паміж ім і чаргой.
  3. Чарга захоўвае спасылку на гэтае паведамленне. Само паведамленне захоўваецца ў аператыўнай памяці ці на дыску
  4. Як толькі спажывец гатовы атрымаць паведамленне з чаргі, сервер стварае копію паведамлення па спасылцы і адпраўляе
  5. Спажывец атрымлівае паведамленне і адпраўляе брокеру пацверджанне
  6. Брокер, атрымаўшы пацверджанне, выдаляе копію паведамлення з чаргі. Затым выдаляе з аператыўнай памяці і з дыска

RPC

працэс RPC (remote procedure call) ляжыць у аснове практычна ўсіх узаемадзеянняў з ядром RabbitMQ. Напрыклад, пачатковыя абмеркаванні ўмоў кліента з RabbitMQ, дэманструе пэўны працэс RPC. Як толькі гэтая паслядоўнасць завершыцца, RabbitMQ будзе гатовы прымаць запыты ад кліента:

RabbitMQ. Частка 1. Introduction. Erlang, AMQP

Таксама ў спецыфікацыі AMQP і кліент і сервер могуць выклікаць каманды. Гэта азначае, што кліент чакае ўзаемадзеяння з серверам. Каманды - гэта класы і метады. Напрыклад, Connection.Start - выклік метаду Start класа Connection.

Падключэнне і каналы

Для такога абмену інфармацыяй паміж кліентам і серверам выкарыстоўваюцца каналы. Каналы ствараюцца ў рамках пэўнага падключэння. Кожны канал ізаляваны ад іншых каналаў. У сінхронным выпадку немагчыма выконваць наступную каманду, пакуль не атрыманы адказ.

Для таго каб мець магчымасць адпраўляць каманды паралельна даводзіцца адчыняць некалькі каналаў. Кожны канал стварае асобны Erlang працэс. Адно падлучэнне можа мець мноства каналаў (мультыплексаванне). Для кожнага канала існуюць нейкія структуры і аб'екты ў памяці. Таму чым больш каналаў ёсць у рамках злучэння, тым больш памяці выкарыстоўвае RabbitMQ для кіравання такім злучэннем.

RabbitMQ. Частка 1. Introduction. Erlang, AMQP

Просты прыклад стварэння падключэння і канала пры дапамозе RabbitMQ.Client:

// ...
private void TryConnect()
{
    var factory = new ConnectionFactory() 
    {
        HostName = "host_name",
        UserName = "user_name",
        Password = "p@ssword",
        // Включение автоматичекого восстановления
        // соединения после сбоев сети 
        AutomaticRecoveryEnabled = true
    };
    _connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
    _channel = _connection.CreateModel();
    // other options 
}

Адкрываць новае злучэнне для кожнай аперацыі, настойліва не рэкамендуецца, паколькі гэта прывядзе да вялікіх выдаткаў. Каналы таксама павінны быць сталымі, але шматлікія памылкі пратаколу прыводзяць да зачынення канала, таму тэрмін службы канала можа быць карацей, чым у злучэння.

Дзе выкарыстоўваецца RabbitMQ?

У кантэксце мікрасэрвісаў пратакол AMQP і яго рэалізацыю ў RabbitMQ часта выкарыстоўваюць для асінхроннага ўзаемадзеяння паміж сэрвісамі.

У кантэксце IIOT пратакол AMQP і яго рэалізацыю ў RabbitMQ выкарыстоўваюць для абмену дадзенымі паміж серверамі (сервер-сервер). Таксама выкарыстоўваюць убудову MQTT Plugin RabbitMQ які з'яўляецца рэалізацыяй пратакола MQTT для перадачы дадзеных паміж датчыкам і серверам у нізкахуткасных асяроддзях з высокай затрымкай (поўны пералік падтрымліваемых пратаколаў пералічаны на сайце праекта).

У наступным артыкуле пачнем разбірацца падрабязней з Exchanges.

Спасылкі

Крыніца: habr.com

Дадаць каментар