{"id":257,"date":"2018-04-17T15:06:12","date_gmt":"2018-04-17T14:06:12","guid":{"rendered":"https:\/\/www.cogin.com\/blog\/?p=257"},"modified":"2018-04-26T10:35:14","modified_gmt":"2018-04-26T09:35:14","slug":"introduction-to-rabbitmq-for-msmq-users-part-1","status":"publish","type":"post","link":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/","title":{"rendered":"Introduction to RabbitMQ for MSMQ users, part 1"},"content":{"rendered":"<p>This series of blog posts, similar to previous posts about Azure Service Bus, is intended for those who already have some MSMQ experience and would like to know more about RabbitMQ. It\u2019s based on my own experiences when I learned about RabbitMQ, what was familiar and what not, and what looked familiar but surprised me in one way or the other. Since I assume you worked with MSMQ before, I won\u2019t explain common queuing concepts. Idea is to get you up to speed quickly without wasting time on things you already know.<\/p>\n<h2>Introduction<\/h2>\n<p>RabbitMQ is an open source message broker, which can be installed on different operating systems, not only on Windows like MSMQ. It\u2019s written in Erlang, and thus require that you install Erlang runtime first. That\u2019s all covered in installation guide:<\/p>\n<p><a href=\"https:\/\/www.rabbitmq.com\/download.html\">https:\/\/www.rabbitmq.com\/download.html<\/a><\/p>\n<p>RabbitMQ supports plugins, and a\u00a0lot of functionality is implemented that way. For instance, if you want to do any kind of management (including connecting from QueueExplorer), you have to enable Management plugin:<\/p>\n<p><a href=\"https:\/\/www.rabbitmq.com\/management.html\">https:\/\/www.rabbitmq.com\/management.html<\/a><\/p>\n<p>Once enabled, it offers browser-based management interface. That plugin is already included in RabbitMQ installation, just disabled by default.<\/p>\n<h2>Exchanges &#8211; a post office for RabbitMQ<\/h2>\n<p>While RabbitMQ has queues which are similar to MSMQ, they have one striking difference &#8211; you cannot send messages directly to them! Instead, you always send a message to an <strong>exchange<\/strong>, and then exchange passes it to destination queue (or queues).<\/p>\n<figure id=\"attachment_271\" class=\"thumbnail wp-caption alignnone\" style=\"width: 531px\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-271 size-full\" src=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png\" alt=\"\" width=\"521\" height=\"58\" srcset=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png 521w, https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange-300x33.png 300w\" sizes=\"auto, (max-width: 521px) 100vw, 521px\" \/><figcaption class=\"caption wp-caption-text\">RabbitMQ simple exchange<\/figcaption><\/figure>\n<p>Exchange doesn\u2019t store messages at all, it just passes them immediately to one or more configured destinations.\u00a0Key thing to notice here is \u201cone or more\u201d. It\u2019s possible to configure exchange to send a single message to multiple destination queues! During that, each destination queue gets <strong>its own copy<\/strong> of message. With this, RabbitMQ supports \u201cpublish\/subscribe\u201d pattern out of the box meaning each subscriber receives and consumes same messages, but each\u00a0on\u00a0its own pace.<\/p>\n<figure id=\"attachment_272\" class=\"thumbnail wp-caption alignnone\" style=\"width: 627px\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-272 size-full\" src=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Complex-Exchanges.png\" alt=\"\" width=\"617\" height=\"191\" srcset=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Complex-Exchanges.png 617w, https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Complex-Exchanges-300x93.png 300w\" sizes=\"auto, (max-width: 617px) 100vw, 617px\" \/><figcaption class=\"caption wp-caption-text\">RabbitMQ complex exchange<\/figcaption><\/figure>\n<p>Apart from queues, destination can be another exchange, so message can go through multiple intermediate steps (i.e. exchanges) until it ends up in actual queue. Also, you can choose which messages are passed to which destinations, depending on message\u2019s content &#8211; e.g. exchange could accept two different messages, and pass first one to queue1, and second one to queue2.<\/p>\n<p>This configurable connection between exchanges and queues is called <strong>binding<\/strong>. Since bindings in RabbitMQ are configurable at run time, you can adapt how messages flow through your system without changing sending or receiving applications.<\/p>\n<h2>Virtual hosts<\/h2>\n<figure id=\"attachment_273\" class=\"thumbnail wp-caption alignnone\" style=\"width: 229px\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-273\" src=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-VHosts.png\" alt=\"RabbitMQ VHosts\" width=\"219\" height=\"275\" \/><figcaption class=\"caption wp-caption-text\">RabbitMQ Virtual Hosts<\/figcaption><\/figure>\n<p>RabbitMQ can run multiple \u201cVirtual hosts\u201d on the\u00a0same server. Virtual host is like a separate standalone instance &#8211; it has its own set of queues, exchanges, bindings, users, permissions, etc. That\u2019s an easy way to separate and isolate different applications, without having to run multiple brokers. For instance application with permissions on one virtual host can\u2019t send or receive messages on another one, you can have queues with same names on different virtual hosts, etc. But virtual hosts are not physically isolated &#8211; they can affect performance of each other.<\/p>\n<h2>RabbitMQ messages<\/h2>\n<p>On the first glance RabbitMQ messages are similar to MSMQ &#8211; there\u2019s Message Id, Body, as well as a bunch of other parameters. However, there are some major differences &#8211; by default RabbitMQ doesn&#8217;t fill most of these fields. For instance, Message Id is just a field where you can put anything &#8211; and RabbitMQ won&#8217;t fill it by itself if it&#8217;s empty! Because of that there are no guarantees of unique IDs, there could be even completely identical messages and system doesn\u2019t perform any duplicate detection at all. RabbitMQ doesn\u2019t even autofill \u201cSend time\u201d field.<\/p>\n<p>Also, there\u2019s no Label like in MSMQ, but we can argue that \u201cMessage Id\u201d is a substitute since it\u2019s a field filled by user. There\u2019s also no limit for body size, which could be convenient in some cases.<\/p>\n<p>What RabbitMQ does have and MSMQ doesn\u2019t are message headers. Each message has a key-value store where you can put your custom data. That data can later be used for exchange routing, so that different messages go to different destinations. Or you can just access that data directly from your receiving app instead of parsing it from body, like you would have to do in MSMQ.<\/p>\n<figure id=\"attachment_148\" class=\"thumbnail wp-caption alignnone\" style=\"width: 402px\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-148\" src=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/MessageCustomProperties.png\" alt=\"\" width=\"392\" height=\"193\" srcset=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/MessageCustomProperties.png 392w, https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/MessageCustomProperties-300x148.png 300w\" sizes=\"auto, (max-width: 392px) 100vw, 392px\" \/><figcaption class=\"caption wp-caption-text\">Message header values<\/figcaption><\/figure>\n<h2>Machine to machine communication<\/h2>\n<p>One of MSMQ premises is that MSMQ service must be installed on all machines which use it. Even if your application is sending message to a remote machine, it only ever communicates with local MSMQ. That local communication on same machine is typically very reliable. After that point, it&#8217;s MSMQ&#8217;s responsibility to connect to remote machine and deliver messages over network, possibly retry sending if there are communication issues or destination is down, etc. Pending messages are stored in MSMQ outgoing queues until they are delivered (or expire). Therefore, as soon as message is received locally, your app is free to do whatever it wants, can be shut down, restarted, etc.<\/p>\n<p>RabbitMQ doesn&#8217;t generally work that way &#8211; you don&#8217;t have to run broker on machine where messages are sent or consumed. Therefore this communication between your application and RabbitMQ server could be a weak point, if going over network. There are no separate processes or local queues to keep outgoing messages in case of problems. It&#8217;s up to your application to handle network issues, either to stop creating and sending messages (effectively to stop working from user point of view), or to keep pending messages in some custom local storage.<\/p>\n<p>Of course, nothing stops you from installing RabbitMQ instances on machines where applications are run. However, if you want local RabbitMQ to pass messages to remote one it&#8217;s not as simple as just putting\u00a0a different machine for destination address like it&#8217;s in MSMQ.<\/p>\n<p>We&#8217;ll talk more about distributed aspects in one of following posts, but <a href=\"https:\/\/www.cogin.com\/blog\/rabbitmq\/rabbitmq-exchanges-rabbitmq-for-msmq-users-part-2\/\">next post<\/a> will dive more into exchanges.<\/p>\n<p><a href=\"https:\/\/www.cogin.com\/articles\/Introduction-to-RabbitMQ-for-MSMQ-users.php\">Links to all 6 parts<\/a>\u00a0of this series.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This series of blog posts, similar to previous posts about Azure Service Bus, is intended for those who already have some MSMQ experience and would like to know more about RabbitMQ. It\u2019s based on my own experiences when I learned about RabbitMQ, what was familiar and what not, and what looked familiar but surprised me [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":271,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,12],"tags":[5,13],"class_list":["post-257","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-msmq","category-rabbitmq","tag-msmq","tag-rabbitmq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introduction to RabbitMQ for MSMQ users, part 1<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introduction to RabbitMQ for MSMQ users, part 1\" \/>\n<meta property=\"og:description\" content=\"This series of blog posts, similar to previous posts about Azure Service Bus, is intended for those who already have some MSMQ experience and would like to know more about RabbitMQ. It\u2019s based on my own experiences when I learned about RabbitMQ, what was familiar and what not, and what looked familiar but surprised me [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"Cogin blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-17T14:06:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-04-26T09:35:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png\" \/>\n\t<meta property=\"og:image:width\" content=\"521\" \/>\n\t<meta property=\"og:image:height\" content=\"58\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dejan Grujic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dejan Grujic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/\",\"url\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/\",\"name\":\"Introduction to RabbitMQ for MSMQ users, part 1\",\"isPartOf\":{\"@id\":\"https:\/\/www.cogin.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png\",\"datePublished\":\"2018-04-17T14:06:12+00:00\",\"dateModified\":\"2018-04-26T09:35:14+00:00\",\"author\":{\"@id\":\"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/e0c4fd92043868daa052d5978d69ed22\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#primaryimage\",\"url\":\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png\",\"contentUrl\":\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png\",\"width\":521,\"height\":58},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.cogin.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introduction to RabbitMQ for MSMQ users, part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.cogin.com\/blog\/#website\",\"url\":\"https:\/\/www.cogin.com\/blog\/\",\"name\":\"Cogin blog\",\"description\":\"Queuing tools and articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.cogin.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/e0c4fd92043868daa052d5978d69ed22\",\"name\":\"Dejan Grujic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e0bf2f4ab23ef7c6f2784ae50708b926?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e0bf2f4ab23ef7c6f2784ae50708b926?s=96&d=mm&r=g\",\"caption\":\"Dejan Grujic\"},\"sameAs\":[\"http:\/\/www.cogin.com\"],\"url\":\"https:\/\/www.cogin.com\/blog\/author\/gruja\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Introduction to RabbitMQ for MSMQ users, part 1","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/","og_locale":"en_US","og_type":"article","og_title":"Introduction to RabbitMQ for MSMQ users, part 1","og_description":"This series of blog posts, similar to previous posts about Azure Service Bus, is intended for those who already have some MSMQ experience and would like to know more about RabbitMQ. It\u2019s based on my own experiences when I learned about RabbitMQ, what was familiar and what not, and what looked familiar but surprised me [&hellip;]","og_url":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/","og_site_name":"Cogin blog","article_published_time":"2018-04-17T14:06:12+00:00","article_modified_time":"2018-04-26T09:35:14+00:00","og_image":[{"width":521,"height":58,"url":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png","type":"image\/png"}],"author":"Dejan Grujic","twitter_misc":{"Written by":"Dejan Grujic","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/","url":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/","name":"Introduction to RabbitMQ for MSMQ users, part 1","isPartOf":{"@id":"https:\/\/www.cogin.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#primaryimage"},"image":{"@id":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png","datePublished":"2018-04-17T14:06:12+00:00","dateModified":"2018-04-26T09:35:14+00:00","author":{"@id":"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/e0c4fd92043868daa052d5978d69ed22"},"breadcrumb":{"@id":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#primaryimage","url":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png","contentUrl":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2018\/04\/RabbitMQ-Simple-Exchange.png","width":521,"height":58},{"@type":"BreadcrumbList","@id":"https:\/\/www.cogin.com\/blog\/rabbitmq\/introduction-to-rabbitmq-for-msmq-users-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.cogin.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introduction to RabbitMQ for MSMQ users, part 1"}]},{"@type":"WebSite","@id":"https:\/\/www.cogin.com\/blog\/#website","url":"https:\/\/www.cogin.com\/blog\/","name":"Cogin blog","description":"Queuing tools and articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.cogin.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/e0c4fd92043868daa052d5978d69ed22","name":"Dejan Grujic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e0bf2f4ab23ef7c6f2784ae50708b926?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e0bf2f4ab23ef7c6f2784ae50708b926?s=96&d=mm&r=g","caption":"Dejan Grujic"},"sameAs":["http:\/\/www.cogin.com"],"url":"https:\/\/www.cogin.com\/blog\/author\/gruja\/"}]}},"_links":{"self":[{"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/posts\/257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/comments?post=257"}],"version-history":[{"count":7,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/posts\/257\/revisions"}],"predecessor-version":[{"id":345,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/posts\/257\/revisions\/345"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/media\/271"}],"wp:attachment":[{"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/media?parent=257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/categories?post=257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/tags?post=257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}