{"id":69621,"date":"2020-02-21T02:56:53","date_gmt":"2020-02-20T23:56:53","guid":{"rendered":"https:\/\/prohoster.info\/blog\/rabbitmq-chast-2-razbiraemsya-s-exchanges"},"modified":"2020-03-03T16:14:48","modified_gmt":"2020-03-03T13:14:48","slug":"rabbitmq-chast-2-razbiraemsya-s-exchanges","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","title":{"rendered":"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Exchange<\/code> \u2014 en udveksler eller udvekslingspunkt. Her sendes beskeder. <code>Exchange<\/code> <strong>fordeler besked<\/strong> til en eller flere k\u00f8er. Den <strong>ruter beskeder til k\u00f8en<\/strong> baseret p\u00e5 de oprettede forbindelser (<code>bindings<\/code>) mellem den og k\u00f8en. <\/p>\n<p><\/p>\n<p><code>Exchange<\/code> er ikke <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">en Erlang-proces<\/a><\/noindex>. Af skalerbarhedsm\u00e6ssige \u00e5rsager <code>exchange<\/code> \u2014 det er en streg (henvisning til modulet med koden, hvor routinglogikken er gemt) i den indbyggede database <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Mnesia\">mnesia<\/a><\/noindex>. 1 tusinde udvekslere vil kun bruge 1 MB hukommelse. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Indholdsfortegnelse<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. Del 1. Introduktion. Erlang, AMQP og RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges<\/a><\/noindex><\/li>\n<li>RabbitMQ. Del 3. Vi ser p\u00e5 Queues og Bindings<\/li>\n<li>RabbitMQ. Del 4. Vi ser p\u00e5 hvad beskeder og frames er<\/li>\n<li>RabbitMQ. Del 5. Ydeevne for publicering og forbrug af beskeder<\/li>\n<li>RabbitMQ. Del 6. Oversigt over modulerne Federation og Shovel<\/li>\n<li>RabbitMQ. Del 7. Detaljer om Connection og Channel<\/li>\n<li>RabbitMQ. Del 8. RabbitMQ i .NET<\/li>\n<li>RabbitMQ. Del 9. Overv\u00e5gning<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"direct-exchange\"><em>Direkte udveksling<\/em><\/h4>\n<p><\/p>\n<p><code>Direkte udveksling<\/code> \u2014 bruges, n\u00e5r man har brug for <strong>at levere beskeder til bestemte k\u00f8er<\/strong>. Beskeden offentligg\u00f8res i en udveksler med en bestemt <strong>routing-n\u00f8gle<\/strong> og kommer ind i alle k\u00f8er, der er forbundet til denne udveksler med den samme routing-n\u00f8gle. <strong>Routing-n\u00f8gle er en streng<\/strong>. Matchningen sker ved hj\u00e6lp af <strong>stranglighedstjek<\/strong>.<\/p>\n<p><\/p>\n<p>Grafisk repr\u00e6sentation af beskedstr\u00f8mmen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/8ce3ab37542f2a7f8e7ac02a737c5f88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I <code>rabbitmq<\/code> der findes et koncept <strong>standard udveksler<\/strong>. Dette er <code>direkte udveksling<\/code> uden navn. Hvis den standard udveksler anvendes, vil beskeden blive ruteret til en k\u00f8 med navnet lig med <strong>routing-n\u00f8glen for beskeden<\/strong>. <\/p>\n<p><\/p>\n<h4 id=\"topic-exchange\"><em>Emneudveksling<\/em><\/h4>\n<p><\/p>\n<p><code>Emneudveksling<\/code> \u2013 p\u00e5 samme m\u00e5de <code>direkte udveksling<\/code> giver mulighed for selektiv routing ved at sammenligne routing-n\u00f8glen. Men i dette tilf\u00e6lde angives n\u00f8glen <strong>ved hj\u00e6lp af et m\u00f8nster<\/strong>. N\u00e5r man opretter et m\u00f8nster bruges <code>0<\/code> to eller flere ord (bogstaver <code>AZ<\/code> og <code>az<\/code> og cifre <code>0-9<\/code>), adskilt med prikker, samt tegn <code>*<\/code> og <code>#<\/code>. <\/p>\n<p><\/p>\n<ul>\n<li><code>*<\/code> \u2014 kan erstattes af pr\u00e6cist <code>1<\/code> \u2018replica\u2019 (for eksempel blev funktionen snd_ctl_add_slave() \u00e6ndret til snd_ctl_add_replica()), hvilket f\u00f8rte til <\/li>\n<li><code>#<\/code> \u2014 kan erstattes af <code>0<\/code> eller flere ord <\/li>\n<\/ul>\n<p><\/p>\n<p>Grafisk repr\u00e6sentation af beskedstr\u00f8mmen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/a0ce48b291a3003eabbe61b3dfa5a4e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fra version <code>RabbitMQ 2.4.0<\/code> blev routingalgoritmen til <code>emneudveksling<\/code> hurtigere op til <code>145<\/code> mange gange. De opn\u00e5ede dette ved at implementere tilgangen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/blog\/2011\/03\/28\/very-fast-and-scalable-topic-routing-part-2\/\">trie implementation<\/a><\/noindex>, som indeb\u00e6rer at repr\u00e6sentere m\u00f8nstre som en tr\u00e6struktur. For eksempel m\u00f8nstre <code>a.b.c<\/code>, <code>a.*.b.c<\/code>, <code>a.#.c<\/code> og <code>b.b.c<\/code> vil blive repr\u00e6senteret med f\u00f8lgende struktur:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/56ef5809fec9eb6c1b50a362b89dd05a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Matchning mod m\u00f8nstret sker fra roden og bev\u00e6ger sig oppefra og nedad.<\/p>\n<p><\/p>\n<p>Egenskaber:<\/p>\n<p><\/p>\n<ul>\n<li>Anvendelse af denne udveksler kan v\u00e6re <strong>et godt valg for mulig fremtidig udvikling af applikationen<\/strong>, da m\u00f8nstre altid kan tilpasses, s\u00e5 beskeden offentligg\u00f8res p\u00e5 samme m\u00e5de som <code>direkte udveksling<\/code> eller <code>fanout exchange<\/code><\/li>\n<li>m\u00f8nstre, der bruger <code>*<\/code> <strong>meget hurtigere<\/strong>, end m\u00f8nstre, der bruger <code>#<\/code>. <\/li>\n<li><code>emneudveksling<\/code> langsommere <code>direkte udveksling<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"fanout-exchange\"><em>Fanout Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Fanout exchange<\/code> \u2013 <strong>leverer alle beskeder til alle k\u00f8er<\/strong> selv hvis en routing-n\u00f8gle er angivet i beskeden.<\/p>\n<p><\/p>\n<p>Egenskaber:<\/p>\n<p><\/p>\n<ul>\n<li><code>RabbitMQ<\/code> <strong>fungerer ikke med routingn\u00f8gler og skabeloner<\/strong> der positivt p\u00e5virker ydeevnen. Dette er den hurtigste <code>exchange<\/code>;<\/li>\n<li>alle forbrugere skal v\u00e6re i stand til at behandle alle meddelelser;<\/li>\n<\/ul>\n<p><\/p>\n<p>Grafisk repr\u00e6sentation af beskedstr\u00f8mmen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/575d86093f151016aef8058fc7d92907.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h4 id=\"headers-exchange\"><em>Headers Exchange<\/em><\/h4>\n<p><\/p>\n<p><code>Headers exchange<\/code> \u2014 dirigerer meddelelser til relaterede k\u00f8er baseret p\u00e5 sammenligning af par (n\u00f8gle, v\u00e6rdi) egenskab <code>headers<\/code> bindinger og tilsvarende egenskab for meddelelsen. <code>headers<\/code> repr\u00e6senterer <code>Dictionary<\/code>. <\/p>\n<p><\/p>\n<p>Hvis der tilf\u00f8jes en s\u00e6rlig n\u00f8gle til ordbogen <code>x-match<\/code> med v\u00e6rdien <code>any<\/code>, s\u00e5 dirigeres meddelelsen ved delvis overensstemmelse af par (n\u00f8gle, v\u00e6rdi). Denne opf\u00f8rsel svarer til operatoren <code>eller<\/code>. <\/p>\n<p><\/p>\n<pre><code class=\"cs\">var bindingArguments = new Dictinary();\nbindingArguments.add(\"x-match\", \"any\");<\/code><\/pre>\n<p><\/p>\n<p>Som standard indeholder n\u00f8glen <code>x-match<\/code> v\u00e6rdien <code>alle<\/code>. Det betyder, at meddelelsen dirigeres ved fuld overensstemmelse af par (n\u00f8gle, v\u00e6rdi). Denne opf\u00f8rsel svarer til operatoren <code>og<\/code>.<\/p>\n<p><\/p>\n<p>Grafisk repr\u00e6sentation af beskedstr\u00f8mmen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/e9a02a0df88cb2c0538b97cec9002bf4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egenskaber:<\/p>\n<p><\/p>\n<ul>\n<li>ydelser<\/li>\n<li>yderligere beregningsomkostninger. Alle par (n\u00f8gle, v\u00e6rdi) af attributten <code>headers<\/code> skal sorteres efter n\u00f8gle navn f\u00f8r beregning af routingv\u00e6rdierne for meddelelsen. <strong>Langsommere end andre typer af exchange<\/strong>.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"consistent-hashing-exchange\"><em>Consistent-Hashing Exchange<\/em><\/h4>\n<p><\/p>\n<p>Denne exchange er en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rabbitmq\/rabbitmq-consistent-hash-exchange\">plugin<\/a><\/noindex> og <strong>ikke indbygget<\/strong> i <code>RabbitMQ<\/code>.<\/p>\n<p><\/p>\n<p><code>Consistent-hashing exchange<\/code> (exchange med konsistent hashing) \u2013 bruges, n\u00e5r der er flere k\u00f8er, der er potentielle modtagere af meddelelsen, og n\u00e5r det er n\u00f8dvendigt at balancere belastningen mellem dem. Forbindelsen mellem meddelelsen og k\u00f8en sker ud fra v\u00e6gten (en betinget strengv\u00e6rdi fra <code>0 - n<\/code>). <\/p>\n<p><\/p>\n<p>\u00c6kvivalent v\u00e6gt af k\u00f8erne \u2013 angiver, at der i hver k\u00f8 vil komme <strong>omtrent det samme antal<\/strong> meddelelser (hver meddelelse vil kun blive placeret i \u00e9n k\u00f8). <strong>Der er ingen fuld garanti for j\u00e6vn fordeling af meddelelser<\/strong>. <\/p>\n<p><\/p>\n<p>Grafisk repr\u00e6sentation af beskedstr\u00f8mmen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/dd22749cad463fe86619a98276554e10.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><code>Hash<\/code> beregnes baseret p\u00e5 routingn\u00f8glen eller egenskaben <code>headers<\/code> af meddelelsen. Hvis alle publicerede meddelelser havde forskellige routingn\u00f8gler eller <code>headers<\/code>, s\u00e5 vil fordelingen finde sted efter v\u00e6gt. Ellers vil routingn\u00f8glen eller <code>headers<\/code>.<\/p>\n<p><\/p>\n<p><strong>Skal hj\u00e6lpe, n\u00e5r forbrugerens b\u00e5ndbredde kr\u00e6ver en v\u00e6kst, der er h\u00f8jere end l\u00f8sningen med flere forbrugere, der bruger \u00e9n k\u00f8.<\/strong><\/p>\n<p><\/p>\n<h4 id=\"kombinirovanie-obmennikov-e2e\"><em>Kombinering af exchanges (E2E)<\/em><\/h4>\n<p><\/p>\n<p>Adf\u00e6rd af alle exchanges kan kombineres ved hj\u00e6lp af forbindelsen <strong>Exchange-to-Exchange<\/strong> (kombinering af exchanges er ikke en del af specifikationen <code>AMQP<\/code>. Dette er en udvidelse af protokollen fra <code>RabbitMQ<\/code>).<\/p>\n<p><\/p>\n<p>Grafisk repr\u00e6sentation af beskedstr\u00f8mmen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/41ea01a0f43f2dd195fa4f34f7fc176c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takket v\u00e6re <code>E2E<\/code> Vi kan finde den rette skalerbare konfiguration, som im\u00f8dekommer b\u00e5de nuv\u00e6rende og voksende krav.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange\"><em>Oprettelse af Exchange<\/em><\/h4>\n<p><\/p>\n<p>Oprettelsen af en udveksling sker ved hj\u00e6lp af synkron <code>RPC<\/code> anmodning til serveren. Anmodningen udf\u00f8res ved hj\u00e6lp af metoden <code>Exchange.Declare<\/code>, der kaldes med parametre:<\/p>\n<p><\/p>\n<ul>\n<li>navn p\u00e5 udvekslingen<\/li>\n<li>type af udveksling<\/li>\n<li>andre parametre<\/li>\n<\/ul>\n<p><\/p>\n<p>Eksempel p\u00e5 oprettelse <code>exchange<\/code> ved hj\u00e6lp af <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/dotnet.html\">RabbitMQ.Client<\/a><\/noindex>:<\/p>\n<p><\/p>\n<pre><code class=\"cs\">\/\/...\nchannel.ExchangeDeclare(\n    exchange: &quot;my_exchange&quot;,\n    type: &quot;direct&quot;,\n    durable: &quot;false&quot;,\n    autoDelete: &quot;false&quot;,\n    arguments: null\n);\n\/\/...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>exchange<\/code> \u2014 navnet p\u00e5 udvekslingen, vi \u00f8nsker at oprette. Navnet skal v\u00e6re unikt<\/li>\n<li><code>type<\/code> \u2014 type af udveksling<\/li>\n<li><code>holdbar<\/code> \u2014 hvis du angiver <code>true<\/code>, s\u00e5 <code>exchange<\/code> vil v\u00e6re vedvarende. Den vil blive gemt p\u00e5 disken og kan overleve genstart af serveren\/broker. Hvis v\u00e6rdien <code>false<\/code>, s\u00e5 <code>exchange<\/code> er midlertidig og vil blive slettet, n\u00e5r serveren\/broker genstartes<\/li>\n<li><code>autoDelete<\/code> \u2014 automatisk sletning. <code>Exchange<\/code> vil blive slettet, n\u00e5r alle relaterede k\u00f8er slettes<\/li>\n<li><code>arguments<\/code> \u2014 valgfrie argumenter. Oftest angives <code>alternative exchange<\/code> (<strong>alternativ udveksling<\/strong>). Hvis meddelelsen ikke kan passere den oprindelige rute, kan den sendes til en alternativ udveksling for omdirigering ad en anden rute.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/6a352e92f94dadf58ba24de453806133.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvis oprettelsen <code>exchange<\/code> <strong>er muligt<\/strong>, vil serveren sende en synkron <code>RPC<\/code> @cassowary714 <code>Exchange.DeclareOk<\/code>. Hvis oprettelsen <strong>ikke er muligt<\/strong> (anmodningen blev n\u00e6gtet <code>Exchange.Declare<\/code>), s\u00e5 <strong>vil kanalen blive lukket<\/strong> af serveren ved hj\u00e6lp af en asynkron kommando <code>Channel.Close<\/code> og klienten vil modtage en undtagelse <noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/releases\/rabbitmq-dotnet-client\/v3.6.10\/rabbitmq-dotnet-client-3.6.10-client-htmldoc\/html\/type-RabbitMQ.Client.Exceptions.OperationInterruptedException.html\">OperationInterruptedException<\/a><\/noindex>, som vil indeholde en fejlkode og en beskrivelse af fejlen. <\/p>\n<p><\/p>\n<p>Udvekslingen skal v\u00e6re oprettet, f\u00f8r der publiceres meddelelser. Hvis du publicerer en meddelelse i en ikke-eksisterende udveksling \u2014 <code>RabbitMQ<\/code> vil den blive stilf\u00e6rdigt slettet.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-exchange-cherez-graficheskiy-interfeys\"><em>Oprettelse af Exchange via grafikgr\u00e6nsefladen<\/em><\/h4>\n<p><\/p>\n<p>G\u00e5 til administrationspanelet <code>RabbitMQ<\/code> som bruger <code>guest<\/code> (brugernavn: <code>guest<\/code> og adgangskode: <code>guest<\/code>). Bem\u00e6rk, at brugeren <code>guest<\/code> kun kan oprette forbindelse fra localhost. Nu g\u00e5r vi til fanen <code>Exchanges<\/code> og klikker p\u00e5 <code>Tilf\u00f8j en ny udveksling<\/code>. Udfyld indstillingerne:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. Del 2. Vi ser p\u00e5 Exchanges\" src=\"\/wp-content\/uploads\/2020\/02\/c4fd31b8cdb8182690ec8c01ccd2a460.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De fleste af egenskaberne er beskrevet ovenfor. Her skal vi bem\u00e6rke, at hvis du angiver <code>Intern<\/code>, kan udvekslingen kun bruges til <code>E2E<\/code>. <code>Producer<\/code> vil ikke kunne sende meddelelser til en s\u00e5dan udveksling.<\/p>\n<p><\/p>\n<h3 id=\"zaklyuchenie\">Konklusion<\/h3>\n<p><\/p>\n<p>N\u00e5r du udvikler systemet, er det praktisk at beskrive topologien <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\">af omdirigering<\/a><\/noindex> ved hj\u00e6lp af et graf. Men f\u00f8r du begynder at bygge grafen, er det vigtigt at fremh\u00e6ve ruter med h\u00f8j trafik, da de kr\u00e6ver <strong>en h\u00f8jere b\u00e5ndbredde<\/strong> (ydelse). Derefter kan trafik klassificeres. Og f\u00f8rst derefter kan du begynde at bygge.<\/p>\n<p><\/p>\n<p>Hvis der i den byggede graf eksisterer <strong>et endeligt antal<\/strong> routen\u00f8gler, s\u00e5 b\u00f8r du se mod flere <code>fanout exchange<\/code>, som er 1:1 forbundet med ruten\u00f8glen. Husk, at <code>fanout exchange<\/code> den hurtigste.<\/p>\n<p><\/p>\n<p>Hvis antallet af ruter <strong>tendens imod uendeligheden<\/strong>, b\u00f8r du tage hensyn til <code>emneudveksling<\/code> eller, hvis m\u00f8nsteret ikke er n\u00f8dvendigt, kan du v\u00e6lge <code>direct exchange<\/code>, da den er hurtigere <code>emneudveksling<\/code>.<\/p>\n<p><\/p>\n<p>Kombinationer af forskellige <code>exchange<\/code> b\u00f8r hj\u00e6lpe med at finde den rigtige <strong>skalerbare konfiguration<\/strong>, som opfylder b\u00e5de nuv\u00e6rende og voksende systemkrav.<\/p>\n<p><\/p>\n<p>Antal <code>exchange<\/code> og ventetider b\u00f8r v\u00e6re minimale i forhold til antallet af ruter.<\/p>\n<p><\/p>\n<p>I den n\u00e6ste artikel vil vi begynde at se n\u00e6rmere p\u00e5 Queues og Bindings.<\/p>\n<p><\/p>\n<h3 id=\"ssylki\">Links<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">Projektets hjemmeside RabbitMQ<\/a><\/noindex><\/li>\n<\/ul>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439. \u041e\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 (bindings) \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e. Exchange \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Erlang-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c. \u0418\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 exchange \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043a\u043e\u0434\u043e\u043c, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438) \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69621","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47RabbitMQ. \u0427\u0430\u0441\u0442\u044c 2. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Exchanges | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-20T23:56:53+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:48+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47RabbitMQ. Del 2. Vi ser n\u00e6rmere p\u00e5 Exchanges | ProHoster","description":"Exchange - en udvekslingsplatform eller udvekslingspunkt. Beskeder sendes til den. Exchange fordeler beskeden til en eller flere k\u00f8er.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47RabbitMQ. \u0427\u0430\u0441\u0442\u044c 2. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Exchanges | ProHoster","og:description":"Exchange \u2014 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. \u0412 \u043d\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. Exchange \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439.","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/rabbitmq-chast-2-razbiraemsya-s-exchanges","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-20T23:56:53+00:00","article:modified_time":"2020-03-03T13:14:48+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69621","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:31:26","updated":"2022-09-28 03:24:29","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/69621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=69621"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/69621\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/69622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=69621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=69621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=69621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}