{"id":73065,"date":"2020-03-06T20:42:13","date_gmt":"2020-03-06T17:42:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings"},"modified":"2020-03-06T20:42:13","modified_gmt":"2020-03-06T17:42:13","slug":"rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","title":{"rendered":"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><code>Fronta<\/code> (fronta) \u2014 d\u00e1tov\u00e1 \u0161trukt\u00fara na disku alebo v pam\u00e4ti, ktor\u00e1 uchov\u00e1va odkazy na spr\u00e1vy a poskytuje ich k\u00f3pie <code>consumers<\/code> (spotrebite\u013eom). <code>Fronta<\/code> predstavuje <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/reference_manual\/processes.html\">Erlang proces<\/a><\/noindex> so stavom (kde m\u00f4\u017eu by\u0165 vyrovn\u00e1van\u00e9 aj samotn\u00e9 spr\u00e1vy). 1 tis\u00edc front m\u00f4\u017ee zaberaj\u00fa pribli\u017ene 80Mb.<\/p>\n<p><\/p>\n<p><code>Binding<\/code> (viazanie) \u2014 pravidlo, ktor\u00e9 informuje v\u00fdmenn\u00edk, do ktorej fronty by mali spr\u00e1vy \u00eds\u0165.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"oglavlenie\">Obsah<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/488654\/\">RabbitMQ. \u010cas\u0165 1. \u00davod. Erlang, AMQP a RPC<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/489086\/\">RabbitMQ. \u010cas\u0165 2. Rozoberieme si Exchanges<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings<\/a><\/noindex><\/li>\n<li>RabbitMQ. \u010cas\u0165 4. Pochop\u00edme, \u010do s\u00fa spr\u00e1vy a r\u00e1mce<\/li>\n<li>RabbitMQ. \u010cas\u0165 5. V\u00fdkon publikovania a spotreby spr\u00e1v<\/li>\n<li>RabbitMQ. \u010cas\u0165 6. Preh\u013ead modulov Federation a Shovel<\/li>\n<li>RabbitMQ. \u010cas\u0165 7. Podrobne o Connection a Channel<\/li>\n<li>RabbitMQ. \u010cas\u0165 8. RabbitMQ v .NET<\/li>\n<li>RabbitMQ. \u010cas\u0165 9. Monitorovanie<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"vremennye-ocheredi\"><em>Do\u010dasn\u00e9 fronty<\/em><\/h4>\n<p><\/p>\n<p>Ak sa fronta vytvor\u00ed s nastaven\u00fdm parametrom <code>autoDelete<\/code>, potom tak\u00e1 fronta z\u00edskava schopnos\u0165 <strong>automaticky sa odstra\u0148ova\u0165<\/strong>. Tieto fronty sa zvy\u010dajne vytv\u00e1raj\u00fa v momente pripojenia prv\u00e9ho klienta a odstra\u0148uj\u00fa sa, ke\u010f sa v\u0161etci klienti odpoja. <\/p>\n<p><\/p>\n<p>Ak sa fronta vytvor\u00ed s nastaven\u00fdm parametrom <code>exkluz\u00edvne<\/code>, potom tak\u00e1 fronta <strong>umo\u017e\u0148uje pripoji\u0165 sa iba jedn\u00e9mu spotrebite\u013eovi<\/strong> a odstr\u00e1ni sa, ak sa kan\u00e1l uzavrie. Pokia\u013e kan\u00e1l nie je uzavret\u00fd, klient sa m\u00f4\u017ee odpoji\u0165\/pripoji\u0165, ale iba v r\u00e1mci toho ist\u00e9ho pripojenia. Ak je parameter <code>exkluz\u00edvne<\/code> nastaven\u00fd, potom parameter <code>autoDelete<\/code> nem\u00e1 \u017eiadny \u00fa\u010dinok.<\/p>\n<p><\/p>\n<p>Funkcie:<\/p>\n<p><\/p>\n<ul>\n<li>pri kr\u00e1tkodobom preru\u0161en\u00ed spojenia strat\u00edme spr\u00e1vy, ktor\u00e9 e\u0161te nestihli dorazi\u0165 k spotrebite\u013eovi<\/li>\n<li>m\u00f4\u017eeme za\u017ei\u0165 fenom\u00e9n <code>binding churn<\/code>. Fenom\u00e9n vznik\u00e1, ke\u010f po\u010det oper\u00e1ci\u00ed vytv\u00e1rania\/odstra\u0148ovania front a viazan\u00ed dosiahne ve\u013emi ve\u013ek\u00e9 hodnoty. V klastrovom re\u017eime sa tak\u00fdto tok oper\u00e1ci\u00ed roz\u0161\u00edri po v\u0161etk\u00fdch uzloch a sp\u00f4sob\u00ed ve\u013ek\u00e9 za\u0165a\u017eenie. Tento proces je mo\u017en\u00e9 optimalizova\u0165 pomocou kontroly po\u010dtu predplatn\u00fdch.<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"postoyannye-ocheredi\"><em>Trval\u00e9 fronty<\/em><\/h4>\n<p><\/p>\n<p>Ak sa fronta vytvor\u00ed s nastaven\u00fdm parametrom <code>durable<\/code>, potom tak\u00e1 fronta <strong>uchov\u00e1vaj\u00fa svoj stav<\/strong> a obnovuj\u00fa sa po re\u0161tarte servera\/brokera. T\u00e1to fronta bude existova\u0165 a\u017e do vyvolania pr\u00edkazu <code>Queue.Delete<\/code>. <\/p>\n<p><\/p>\n<h4 id=\"highly-available-ocheredi\"><em>Vysoko dostupn\u00e9 fronty<\/em><\/h4>\n<p><\/p>\n<p>Fronty HA vy\u017eaduj\u00fa klastrov\u00e9 prostredie RabbitMQ. V klastrovom re\u017eime bud\u00fa v\u0161etky inform\u00e1cie o v\u00fdmenn\u00edkoch, front\u00e1ch, viazaniach a spotrebite\u013eoch skop\u00edrovan\u00e9 na v\u0161etky uzly.<\/p>\n<p><\/p>\n<p>Ke\u010f je spr\u00e1va zverejnen\u00e1 do nejakej fronty HA, uchov\u00e1va sa na ka\u017edom uzle patriacom k front\u00e1m HA. Po tom, \u010do je spr\u00e1va spracovan\u00e1 na niektorom z uzlov, v\u0161etky k\u00f3pie tejto spr\u00e1vy bud\u00fa odstr\u00e1nen\u00e9 na ostatn\u00fdch uzloch. <\/p>\n<p><\/p>\n<p>Fronty HA m\u00f4\u017eu by\u0165 roz\u0161\u00edren\u00e9 na v\u0161etky uzly v ur\u010ditom klastri alebo iba na jednotliv\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/46d560ab33e686ddf9adb0b18b4bb0b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Funkcie:<\/p>\n<p><\/p>\n<ul>\n<li>pou\u017e\u00edvanie HA front vedie k penaliz\u00e1ci\u00e1m v oblasti v\u00fdkonu. Pri umiestnen\u00ed spr\u00e1vy do nejakej HA fronty alebo pri spracovan\u00ed spr\u00e1vy z HA fronty mus\u00ed RabbitMQ vykon\u00e1va\u0165 koordin\u00e1ciu medzi v\u0161etk\u00fdmi uzlami (2-3 uzly s\u00fa zvy\u010dajne dostato\u010dn\u00e9).<\/li>\n<\/ul>\n<p><\/p>\n<h4 id=\"sozdanie-ocheredi\"><em>Vytvorenie fronty<\/em><\/h4>\n<p><\/p>\n<p>Vytvorenie fronty sa uskuto\u010d\u0148uje pomocou synchroniz\u00e1cie. <code>RPC<\/code> \u017eiadania na server. \u017diados\u0165 sa uskuto\u010d\u0148uje pomocou met\u00f3dy <code>Queue.Declare<\/code>, vy\u017eaduje si parametre:<\/p>\n<p><\/p>\n<ul>\n<li>n\u00e1zov fronty<\/li>\n<li>in\u00e9 parametre<\/li>\n<\/ul>\n<p><\/p>\n<p>Pr\u00edklad vytvorenia fronty pomocou <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.QueueDeclare(\n    queue: &quot;my_queue&quot;,\n    durable: false,\n    exclusive: false,\n    autoDelete: false,\n    arguments: null\n);\n\/\/ ...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>queue<\/code> \u2014 n\u00e1zov fronty, ktor\u00fa chceme vytvori\u0165. N\u00e1zov mus\u00ed by\u0165 jedine\u010dn\u00fd a nem\u00f4\u017ee sa zhodova\u0165 so syst\u00e9mov\u00fdm n\u00e1zvom fronty.<\/li>\n<li><code>durable<\/code> \u2014 ak true, tak fronta bude <strong>uchov\u00e1va\u0165 svoj stav<\/strong> a obnov\u00ed sa po re\u0161tartovan\u00ed servera\/brokera.<\/li>\n<li><code>exkluz\u00edvne<\/code> \u2014 ak true, tak fronta umo\u017en\u00ed pripoji\u0165 sa len jedn\u00e9mu spotrebite\u013eovi.<\/li>\n<li><code>autoDelete<\/code> \u2014 ak true, tak fronta nadobudne schopnos\u0165 <strong>automaticky sa odstra\u0148ova\u0165<\/strong><\/li>\n<li><code>argumentoch<\/code> \u2014 volite\u013en\u00e9 argumenty. Ni\u017e\u0161ie si podrobnej\u0161ie vysvetl\u00edme.<\/li>\n<\/ul>\n<p><\/p>\n<h5 id=\"arguments\"><em>argumentoch<\/em><\/h5>\n<p><\/p>\n<ul>\n<li><code>x-message-ttl<\/code>(<code>x-message-time-to-live<\/code>) \u2014 umo\u017e\u0148uje nastavi\u0165 \u010das do vypr\u0161ania \u017eivotnosti spr\u00e1vy v milisekund\u00e1ch. Ak sa fronta vytvor\u00ed s nastavenou hodnotou argumentu <code>x-message-ttl<\/code>, tak\u00e1 fronta bude <strong>automaticky vylu\u010dova\u0165 spr\u00e1vy, ktor\u00fdm vypr\u0161al \u010das.<\/strong>Nastavenie hodnoty argumentu <code>x-message-ttl<\/code> ur\u010duje maxim\u00e1lny vek pre v\u0161etky spr\u00e1vy v danej fronte. Vytvorenie takej fronty <strong>umo\u017e\u0148uje zabr\u00e1ni\u0165 prij\u00edmaniu zastaran\u00fdch inform\u00e1ci\u00ed.<\/strong>To sa d\u00e1 vyu\u017ei\u0165 v syst\u00e9moch re\u00e1lneho \u010dasu. Ak m\u00e1 fronta, pre ktor\u00fa je nastaven\u00fd v\u00fdmenn\u00edk pre odmietnut\u00e9 spr\u00e1vy, nastaven\u00fa hodnotu argumentu <code>x-message-ttl<\/code>, tak odmietnut\u00e9 spr\u00e1vy v danej fronte <strong>za\u010dn\u00fa ma\u0165 \u017eivotnos\u0165.<\/strong>.<\/li>\n<li><code>x-expires<\/code> \u2014 nastavuje hodnotu v milisekund\u00e1ch, po ktorej d\u00f4jde k odstr\u00e1neniu fronty. Fronta m\u00f4\u017ee vy\u010derpa\u0165 svoju dobu platnosti iba v pr\u00edpade, \u017ee nem\u00e1 \u017eiadnych odberate\u013eov. Ak s\u00fa k fronte pripojen\u00ed odberatelia, m\u00f4\u017ee sa automaticky odstr\u00e1ni\u0165 iba vtedy, ke\u010f sa v\u0161etci odberatelia odpoja. <code>Basic.Cancel<\/code> alebo sa odpoja. Doba platnosti fronty m\u00f4\u017ee skon\u010di\u0165 iba v pr\u00edpade, \u017ee k nej nebol po\u017eiadavok <code>Basic.Get<\/code>. Inak sa aktu\u00e1lna hodnota nastavenia doby platnosti vynuluje a fronta sa u\u017e nebude automaticky odstra\u0148ova\u0165. Taktie\u017e <strong>nie s\u00fa z\u00e1ruky, ako r\u00fdchlo doch\u00e1dza k odstr\u00e1neniu fronty po uplynut\u00ed jej doby platnosti.<\/strong>.<\/li>\n<li><code>x-max-length<\/code> \u2014 ur\u010duje maxim\u00e1lny po\u010det spr\u00e1v v fronte. Ak po\u010det spr\u00e1v vo fronte za\u010dne prekra\u010dova\u0165 maxim\u00e1lny limit, za\u010dn\u00fa sa odstra\u0148ova\u0165 najstar\u0161ie<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/738f23dcfdd173a66be619032b46c5cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li><code>x-max-lenght-bytes<\/code> \u2014 ur\u010duje maxim\u00e1lne povolen\u00fa celkov\u00fa ve\u013ekos\u0165 payloadu spr\u00e1v vo fronte. Pri prekro\u010den\u00ed nastavenej hodnoty (do\u0161lo k preplneniu fronty pri \u010fal\u0161om publikovan\u00ed spr\u00e1vy) sa najstar\u0161ie spr\u00e1vy za\u010dn\u00fa odstr\u00e1ni\u0165<\/li>\n<li><code>x-overflow<\/code> \u2014 tento argument sa pou\u017e\u00edva na nastavenie spr\u00e1vania v pr\u00edpade preplnenia fronty. Dostupn\u00e9 s\u00fa dve hodnoty: <code>drop-head<\/code> (predvolen\u00e1 hodnota) a <code>reject-publish<\/code>. Ak zvol\u00edte <code>drop-head<\/code>, najstar\u0161ie spr\u00e1vy bud\u00fa odstr\u00e1nen\u00e9. Ak zvol\u00edte <code>reject-publish<\/code>, pr\u00edjem spr\u00e1v bude pozastaven\u00fd<\/li>\n<li><code>x-dead-letter-exchange<\/code> \u2014 ur\u010duje exchange, do ktor\u00e9ho s\u00fa smerovan\u00e9 odmietnut\u00e9 spr\u00e1vy, ktor\u00e9 neboli op\u00e4tovne zaraden\u00e9 do fronty<\/li>\n<li><code>x-dead-letter-routing-key<\/code> \u2014 ur\u010duje volite\u013en\u00fd k\u013e\u00fa\u010d pre smerovanie odmietnut\u00fdch spr\u00e1v<\/li>\n<li><code>x-max-priority<\/code> \u2014 umo\u017e\u0148uje triedenie pod\u013ea prior\u00edt vo fronte s maxim\u00e1lnou hodnotou priority 255 (RabbitMQ verzi\u00ed 3.5.0 a vy\u0161\u0161ej). \u010c\u00edslo uv\u00e1dza maxim\u00e1lnu prioritu, ktor\u00fa fronta bude podporova\u0165. Ak argument nie je nastaven\u00fd, fronta nebude podporova\u0165 prioritu spr\u00e1v<\/li>\n<li><code>x-queue-mode<\/code> \u2014 umo\u017e\u0148uje prepn\u00fa\u0165 frontu do <strong>leniv\u00e9ho re\u017eimu<\/strong>. V tomto re\u017eime bude \u010do najviac spr\u00e1v ulo\u017een\u00fdch na disku. Pou\u017e\u00edvanie opera\u010dnej pam\u00e4te bude minim\u00e1lne. V pr\u00edpade, \u017ee nie je nastaven\u00fd, fronta bude uchov\u00e1va\u0165 spr\u00e1vy v pam\u00e4ti, aby dod\u00e1vala spr\u00e1vy \u010do najr\u00fdchlej\u0161ie<\/li>\n<li><code>x-queue-master-locator<\/code> \u2014 ak m\u00e1me klaster, m\u00f4\u017eeme nastavi\u0165 hlavn\u00fd uzol fronty<\/li>\n<li><code>x-ha-policy<\/code> \u2014 pou\u017e\u00edva sa pri vytv\u00e1ran\u00ed HA front a ur\u010duje, ako sa spr\u00e1va bude \u0161\u00edri\u0165 medzi uzlami. Ak je nastaven\u00e1 hodnota <code>v\u0161etko<\/code>, spr\u00e1va sa ulo\u017e\u00ed na v\u0161etk\u00fdch uzloch. Ak je nastaven\u00e1 hodnota <code>nodes<\/code>, spr\u00e1va sa ulo\u017e\u00ed na konkr\u00e9tnych uzloch v klastri<\/li>\n<li><code>x-ha-nodes<\/code> \u2014 ur\u010duje uzly, ku ktor\u00fdm bude patri\u0165 dan\u00e1 fronta <code>HA<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/a8f660b6c0a43626e4025cf7769a4425.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak je vytv\u00e1ranie fronty <strong>mo\u017eno<\/strong>, server za\u0161le klientovi synchronn\u00e9 <code>RPC<\/code> odpovedi <code>Queue.DeclareOk<\/code>. Ak je vytv\u00e1ranie fronty <strong>ned\u00e1 vykona\u0165<\/strong> (nastal probl\u00e9m s po\u017eiadavkou <code>Queue.Declare<\/code>), potom <strong>kan\u00e1l sa zatvor\u00ed<\/strong> serverom prostredn\u00edctvom pr\u00edkazu <code>Channel.Close<\/code> a klient dostane v\u00fdnimku <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>, ktor\u00e1 bude obsahova\u0165 k\u00f3d chyby a jej opis. <\/p>\n<p><\/p>\n<p><strong>Opakovan\u00e9 vyvolanie<\/strong> <code>Queue.Declare<\/code> <strong>s identick\u00fdmi parametrami<\/strong> vr\u00e1ti u\u017eito\u010dn\u00e9 inform\u00e1cie o tejto fronte. Napr\u00edklad celkov\u00fd po\u010det spr\u00e1v \u010dakaj\u00facich v tejto fronte a celkov\u00fd po\u010det prihl\u00e1sen\u00fdch spotrebite\u013eov. <\/p>\n<p><\/p>\n<p>Vyvolanie <code>Queue.Declare<\/code> pod pou\u017e\u00edvate\u013esk\u00fdmi \u00fadajmi, ktor\u00fdm neboli pridelen\u00e9 potrebn\u00e9 pr\u00e1va <strong>uzavrie kan\u00e1l<\/strong> pomocou pr\u00edkazu <code>Channel.Close<\/code> a klient dostane v\u00fdnimku <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>, ktor\u00fd bude obsahova\u0165 chybov\u00fd k\u00f3d <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/HTTP\/Status\/403\">403<\/a><\/noindex> a jeho popis.<\/p>\n<p><\/p>\n<p>Akon\u00e1hle fronta vy\u010dk\u00e1va po dobu &gt;= 10 sek\u00fand, <strong>prejde do sp\u00e1nkov\u00e9ho re\u017eimu<\/strong>, sp\u00f4sobuj\u00fac GC vo fronte, \u010do vedie k zna\u010dn\u00e9mu zn\u00ed\u017eeniu pam\u00e4te potrebnej pre tento front.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-queue-cherez-graficheskiy-interfeys\"><em>Vytvorenie fronty cez grafick\u00e9 u\u017e\u00edvate\u013esk\u00e9 rozhran\u00ed<\/em><\/h4>\n<p><\/p>\n<p>Prihl\u00e1ste sa do ovl\u00e1dacieho panela <code>RabbitMQ<\/code> pod pou\u017e\u00edvate\u013eom <code>n\u00e1v\u0161tevn\u00edk<\/code> (username: <code>n\u00e1v\u0161tevn\u00edk<\/code> a password: <code>n\u00e1v\u0161tevn\u00edk<\/code>). V\u0161imnite si, \u017ee pou\u017e\u00edvate\u013e <code>n\u00e1v\u0161tevn\u00edk<\/code> sa m\u00f4\u017ee pripoji\u0165 iba z lok\u00e1lneho hostite\u013ea. Teraz prejdeme na kartu <code>Fronty<\/code> a klikneme na <code>Prida\u0165 nov\u00fa frontu<\/code>. Vypl\u0148te vlastnosti:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/ea77a406ad16f0871c7197e96a66818f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ke\u010f v\u0161etky potrebn\u00e9 \u00fadaje zad\u00e1me a klikneme na <code>Prida\u0165 fronty<\/code>, fronta sa objav\u00ed v celkovom zozname.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/8342e044a0d6c0a035a2c9f646035cad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kliknut\u00edm na n\u00e1zov fronty sa zobrazia jej podrobnosti. Tu m\u00f4\u017eeme nastavi\u0165 v\u00e4zbu medzi v\u00fdmenou a frontou, zobrazi\u0165 zoznam <code>consumers<\/code>, publikova\u0165\/z\u00edska\u0165 spr\u00e1vy, vymaza\u0165 frontu a zobrazi\u0165 \u0161tatistiku.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding\"><em>Vytvorenie v\u00e4zby<\/em><\/h4>\n<p><\/p>\n<p>Vytvorenie v\u00e4zby prebieha cez synchronn\u00e9 <code>RPC<\/code> \u017eiadania na server. \u017diados\u0165 sa uskuto\u010d\u0148uje pomocou met\u00f3dy <code>Queue.Bind<\/code>, vy\u017eaduje si parametre:<\/p>\n<p><\/p>\n<ul>\n<li>n\u00e1zov fronty<\/li>\n<li>n\u00e1zov v\u00fdmenn\u00e9ho bodu<\/li>\n<li>in\u00e9 parametre<\/li>\n<\/ul>\n<p><\/p>\n<p>Pr\u00edklad vytvorenia v\u00e4zby cez <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.QueueBind(\n    queue: queueName,\n    exchange: &quot;my_exchange&quot;,\n    routingKey: &quot;my_key&quot;,\n    arguments: null\n);\n\/\/...<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><code>queue<\/code> \u2014 n\u00e1zov fronty<\/li>\n<li><code>exchange<\/code> \u2014 n\u00e1zov v\u00fdmenn\u00edka<\/li>\n<li><code>routingKey<\/code> \u2014 k\u013e\u00fa\u010d smerovania<\/li>\n<li><code>argumentoch<\/code> \u2014 volite\u013en\u00e9 argumenty<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/9123186c94a822309b679f26c2e511ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak vytvorenie v\u00e4zby <strong>mo\u017eno<\/strong>, server za\u0161le klientovi synchronn\u00e9 <code>RPC<\/code> odpovedi <code>Queue.BindOk<\/code>.<\/p>\n<p><\/p>\n<h4 id=\"sozdanie-binding-cherez-graficheskiy-interfeys\"><em>Vytvorenie v\u00e4zby cez grafick\u00e9 u\u017e\u00edvate\u013esk\u00e9 rozhranie<\/em><\/h4>\n<p><\/p>\n<p>Prihl\u00e1ste sa do ovl\u00e1dacieho panela <code>RabbitMQ<\/code> pod pou\u017e\u00edvate\u013eom <code>n\u00e1v\u0161tevn\u00edk<\/code> (username: <code>n\u00e1v\u0161tevn\u00edk<\/code> a password: <code>n\u00e1v\u0161tevn\u00edk<\/code>). V\u0161imnite si, \u017ee pou\u017e\u00edvate\u013e <code>n\u00e1v\u0161tevn\u00edk<\/code> sa m\u00f4\u017ee pripoji\u0165 iba z lok\u00e1lneho hostite\u013ea. Teraz prejdeme na kartu <code>Fronty<\/code> a klikneme na frontu <code>my_queue<\/code>. Vypln\u00edme polia sekcie <code>viazania<\/code>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/7db6b42a4f29a1860aabe54ade0b6833.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ke\u010f v\u0161etky potrebn\u00e9 \u00fadaje zad\u00e1me a klikneme na <code>Pripoji\u0165<\/code>, v\u00e4zba sa zobraz\u00ed v celkovom zozname:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ. \u010cas\u0165 3. Pochopenie Queues a Bindings\" src=\"\/wp-content\/uploads\/2020\/03\/499eda8e8cb061e6feb75c471eb64b92.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"code\">K\u00f3d<\/h3>\n<p><\/p>\n<p>V tejto sekcii op\u00ed\u0161eme frontu a v\u00e4zbu k\u00f3dom v C#, akoby sme potrebovali vyvin\u00fa\u0165 kni\u017enicu. Mo\u017eno to bude u\u017eito\u010dn\u00e9 na pochopenie.<\/p>\n<p><\/p>\n<pre><code class=\"cs\">public interface IQueue\n    {        \n        string Name { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Ak nastav\u00edte true, fronta bude trval\u00e1. \n        \/\/     Bude ulo\u017een\u00e1 na disku a m\u00f4\u017ee \n        \/\/     pre\u017ei\u0165 re\u0161tart servera\/brokera. \n        \/\/     Ak je hodnota false, fronta je do\u010dasn\u00e1 a bude odstr\u00e1nen\u00e1, \n        \/\/     ke\u010f bude server\/broker re\u0161tartovan\u00fd\n        \/\/ &lt;\/summary&gt;\n        bool IsDurable { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Ak je hodnota true, \n        \/\/     tak\u00e1to fronta umo\u017en\u00ed pripoji\u0165 sa \n        \/\/     iba jedn\u00e9mu consumer-ovi\n        \/\/ &lt;\/summary&gt;\n        bool IsExclusive { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Automatick\u00e9 odstr\u00e1nenie. \n        \/\/     Fronta bude odstr\u00e1nen\u00e1, ke\u010f sa odpoja v\u0161etci klienti.\n        \/\/ &lt;\/summary&gt;\n        bool IsAutoDelete { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Volite\u013en\u00e9 argumenty\n        \/\/ &lt;\/summary&gt;\n        IDictionary&lt;string, object&gt; Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">verejn\u00e1 trieda Queue : IQueue\n    {\n        verejn\u00e1 Queue(\n             re\u0165azec name, \n             bool isDurable = true, \n             bool isExclusive = false, \n             bool isAutoDelete = false, \n             IDictionary arguments = null)\n        {\n            Name = name ??\n                vrhni nov\u00fd ArgumentNullException(name, $\"{name} nesmie by\u0165 null\");\n\n            IsDurable = isDurable;\n            IsExclusive = isExclusive;\n            IsAutoDelete = isAutoDelete;\n            Arguments = arguments ?? new Dictionary();\n        }\n\n        verejn\u00fd re\u0165azec Name { get; }\n        verejn\u00fd bool IsDurable { get; }\n        verejn\u00fd bool IsExclusive { get; }\n        verejn\u00fd bool IsAutoDelete { get; }\n        verejn\u00fd IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">verejn\u00e1 statick\u00e1 trieda QueueMode\n    {       \n        verejn\u00e1 kon\u0161tanta re\u0165azec Default = \"default\";\n        \/\/ <summary>\n        \/\/     Leniv\u00fd re\u017eim. Leniv\u00fd re\u017eim sp\u00f4sob\u00ed, \u017ee sa zachov\u00e1\n        \/\/     \u010do najviac spr\u00e1v na disku, aby sa zn\u00ed\u017eila\n        \/\/     spotreba opera\u010dnej pam\u00e4te\n        \/\/ <\/summary>\n        verejn\u00e1 kon\u0161tanta re\u0165azec Lazy = \"lazy\";\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public interface IBinding\n    {\n        \/\/ &lt;summary&gt;\n        \/\/     Burza, ktor\u00e1 bude viaza\u0165 spojenie\n        \/\/ &lt;\/summary&gt;\n        IExchange Exchange { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     K\u013e\u00fa\u010d smerovania\n        \/\/ &lt;\/summary&gt;\n        string RoutingKey { get; }\n\n        \/\/ &lt;summary&gt;\n        \/\/     Nepovinn\u00e9 argumenty\n        \/\/ &lt;\/summary&gt;\n        IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"cs\">public class Binding : IBinding\n    {\n        public Binding(\n             IExchange exchange, \n             string routingKey, \n             IDictionary arguments)\n        {\n            Exchange = exchange;\n            RoutingKey = routingKey;\n            Arguments = arguments;\n        }\n\n        public IExchange Exchange { get; }\n        public string RoutingKey { get; }\n        public IDictionary Arguments { get; }\n    }<\/code><\/pre>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490960\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c). Queue \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 Erlang-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (\u0433\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f). 1 \u0442\u044b\u0441\u044f\u0447\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 80Mb. Binding (\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430) \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u043d\u0438\u043a\u0443 \u0432 \u043a\u0430\u043a\u0443\u044e \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73065","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=\"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).\" \/>\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\/sk\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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 3. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Queues \u0438 Bindings | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings\" \/>\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-03-06T17:42:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-06T17:42:13+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. \u010cas\u0165 3. Pozrime sa na Queues a Bindings | ProHoster","description":"Queue (fronta) \u2014 \u0161trukt\u00fara d\u00e1t na disku alebo v opera\u010dnej pam\u00e4ti, ktor\u00e1 uchov\u00e1va odkazy na spr\u00e1vy a poskytuje ich k\u00f3pie consumers (spotrebite\u013eom).","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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 3. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 Queues \u0438 Bindings | ProHoster","og:description":"Queue (\u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0435\u0442 \u0438\u0445 \u043a\u043e\u043f\u0438\u0438 consumers (\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c).","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/rabbitmq-chast-3-razbiraemsya-s-queues-i-bindings","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-03-06T17:42:13+00:00","article:modified_time":"2020-03-06T17:42:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73065","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 18:41:06","updated":"2022-09-30 05:07:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/73065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=73065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/73065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/73066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=73065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=73065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=73065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}