{"id":184,"date":"2017-12-15T13:48:35","date_gmt":"2017-12-15T12:48:35","guid":{"rendered":"https:\/\/www.cogin.com\/blog\/?p=184"},"modified":"2017-12-15T14:21:11","modified_gmt":"2017-12-15T13:21:11","slug":"developers-perspective-azure-service-bus-msmq-users-part-5","status":"publish","type":"post","link":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/","title":{"rendered":"Developer\u2019s perspective &#8211; Azure Service Bus for MSMQ users, Part 5"},"content":{"rendered":"<p>For the last part of this short series, let\u2019s take a glance at some high-level differences between Azure Service Bus and MSMQ from developer&#8217;s point of view. We can&#8217;t cover much in a\u00a0single blog post and, so let&#8217;s just mention few things to get you started.<\/p>\n<h2>Story of two APIs<\/h2>\n<p>Actually, Azure Service Bus has a lot of APIs, if we count different libraries for multiple languages and runtimes, REST or AMQP protocols\u2026 However what we\u2019re interested in here are .Net APIs, since that\u2019s the platform of choice for most MSMQ developers.<\/p>\n<p>At the moment of writing (December 2017) there\u2019s a slight confusion because there are 3 separate NuGet packages you can use in your .Net project.<\/p>\n<ul>\n<li>Older API<br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/WindowsAzure.ServiceBus\/\">WindowsAzure.ServiceBus<\/a>, requires .Net 4.5.2. It&#8217;s comprehensive, contains stuff for using queues, topics, and subscriptions, but also for managing them (create, delete, etc).<\/li>\n<li>New API<br \/>\nIt consists of two NuGet packages, which require .Net Standard 2.0:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Azure.ServiceBus\/\">Microsoft.Azure.ServiceBus<\/a> &#8211; and contains only \u201cusage\u201d part of functionality, without management parts.<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Azure.Management.ServiceBus\/\">Microsoft.Azure.Management.ServiceBus<\/a> &#8211; management part of API. However, this library supports only logins using Azure Active Directory, not Shared Access Policies used by previous two libraries.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Microsoft recommendation is to go with new packages. However, if you need to manage queues, topics or subscriptions from your code, new management API still can\u2019t replace old WindowsAzure.ServiceBus library.<\/p>\n<h2>Access keys<\/h2>\n<p>You&#8217;ll need some access keys to work with Azure Service Bus from your app. You can create and take these keys, or connection strings, from Azure Portal.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-229\" src=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.png\" alt=\"\" width=\"250\" height=\"205\" \/><\/p>\n<p>These keys can be issued for the entire namespace, or just for queues or topics you want your app to access.<\/p>\n<h2>Message processing modes<\/h2>\n<p>Azure Service bus has two different modes of processing messages, \u201cReceive and Delete\u201d and \u201cPeek and Lock\u201d. First one, ReceiveAndDelete is similar to MSMQ\u2019s Receive operation &#8211; message is immediately removed from a queue.<\/p>\n<p>PeekAndLock is a bit different. As soon as you receive message using that mode, it will disappear from a queue and won\u2019t be visible to other receivers. But it won\u2019t be actually deleted yet. That part makes it different from MSMQ Peek operation. In Service Bus terminology message will be locked.<\/p>\n<p>If your processing succeeds, you\u2019ll perform \u201cComplete\u201d operation and only then message will be deleted from a queue. If on the other hand there\u2019s some problem, you\u2019ll execute \u201cAbandon\u201d operation and\u00a0message will be unlocked and other receivers will see it again. Also, if you neither Complete or Abandon, after certain timeout your lock will be released, same as if you performed Abandon.<\/p>\n<p>The important thing to remember is that if lock timeout expires or you manually Abandon operation &#8211; message&#8217;s Delivery Count will be increased by 1, and if it reaches 10 (default) message will be deadlettered. There are more details about DeliveryCount in <a href=\"https:\/\/www.cogin.com\/blog\/msmq\/messages-azure-service-bus-msmq-users-part-4\/\">previous post<\/a>.<\/p>\n<p>You also have an option to renew lock, i.e. increase time allocated for processing, or to immediately move message to deadletter queue, defer or schedule it for later.<\/p>\n<p>\u201cReceive and Delete\u201d and \u201cPeek and Lock\u201d are two modes of Receive operation. There\u2019s also a Peek operation, which shouldn\u2019t be confused with \u201cPeek and Lock\u201d mode for Receive. Peek works just as it did in MSMQ, returns messages without modifying queue whatsoever.<\/p>\n<h2>Batch operations<\/h2>\n<p>MSMQ applications always work with local Message Queueing service, located on that same machine. These operations are fast and latency is negligible. Even if you send a message to another machine you actually only talk to local MSMQ, which then puts messages in an outgoing queue and continues sending on its own pace. MSMQ will have significant latency only if you receive messages from a remote machine, and that\u2019s not generally recommended approach.<\/p>\n<p>Performance issues are quite different with Azure Service Bus with its distributed, online nature. \u00a0If you need to process or send many messages, latency will be a big factor. If for instance there\u2019s a 100ms latency between your application and Service Bus, it could happen that you won\u2019t be able to send or receive more than 10 messages per second! Yes, it can be quicker if you\u2019re using async methods and do stuff in parallel, but generally speaking, latency can kill your performance.<\/p>\n<p>Fortunately, Service Bus send and receive operations can work in batch mode &#8211; e.g. you can send or receive tens or hundred messages without roundtrips to a\u00a0server for each message. However, batch sending is not as straightforward as it could be &#8211; batch can\u2019t be larger than max message size, so you\u2019ll have to estimate the size of each message to make sure you don\u2019t go over that limit.<\/p>\n<h2>Transactions<\/h2>\n<p>Azure Service Bus supports transactions, except in Basic tier. These transactions are equivalent to internal transactions in MSMQ, i.e. they can only include operations from one message broker. There are no distributed transactions like in MSMQ, i.e. no way to integrate database calls with queue operations in single atomic \u201cdo all or do nothing\u201d operation. Here\u2019s what Clemens Vasters, a Team Lead of Azure Service Bus team at Microsoft:<\/p>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/clemensv\/2011\/10\/06\/achieving-transactional-behavior-with-messaging\/\">https:\/\/blogs.msdn.microsoft.com\/clemensv\/2011\/10\/06\/achieving-transactional-behavior-with-messaging\/<\/a><\/p>\n<h2>Where to go next<\/h2>\n<p>There\u2019s a lot more that can be discussed about Azure Service Bus but it would go out of the scope of this short series. I hope this helped you get a quick overview of what Azure Service Bus is and what can be done with it. At the end, here are some resources:<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/service-bus-messaging\/\">Service Bus Messaging Documentation<\/a>\u00a0&#8211; on Microsoft site.<\/p>\n<p><a href=\"https:\/\/weblogs.asp.net\/sfeldman\">Sean Feldman&#8217;s blog<\/a>\u00a0&#8211; Sean has a lot of interesting and useful stuff about Azure Service Bus on his blog.<\/p>\n<p><a href=\"\/mq\/\">QueueExplorer<\/a>\u00a0(yep, our own product) &#8211; the best way to work with Azure Service Bus during development, testing, or production usage.<\/p>\n<p><a href=\"\/articles\/Introduction-to-azure-service-bus-for-MSMQ-users.php\">Links to all 5 parts<\/a> of this series.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For the last part of this short series, let\u2019s take a glance at some high-level differences between Azure Service Bus and MSMQ from developer&#8217;s point of view. We can&#8217;t cover much in a\u00a0single blog post and, so let&#8217;s just mention few things to get you started. Story of two APIs Actually, Azure Service Bus has [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,2],"tags":[11,5],"class_list":["post-184","post","type-post","status-publish","format-standard","hentry","category-azure-service-bus","category-msmq","tag-azure-service-bus","tag-msmq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Developer\u2019s perspective - Azure Service Bus for MSMQ users, Part 5<\/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\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developer\u2019s perspective - Azure Service Bus for MSMQ users, Part 5\" \/>\n<meta property=\"og:description\" content=\"For the last part of this short series, let\u2019s take a glance at some high-level differences between Azure Service Bus and MSMQ from developer&#8217;s point of view. We can&#8217;t cover much in a\u00a0single blog post and, so let&#8217;s just mention few things to get you started. Story of two APIs Actually, Azure Service Bus has [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/\" \/>\n<meta property=\"og:site_name\" content=\"Cogin blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-15T12:48:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-12-15T13:21:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.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\":\"Article\",\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/\"},\"author\":{\"name\":\"Dejan Grujic\",\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/#\\\/schema\\\/person\\\/e0c4fd92043868daa052d5978d69ed22\"},\"headline\":\"Developer\u2019s perspective &#8211; Azure Service Bus for MSMQ users, Part 5\",\"datePublished\":\"2017-12-15T12:48:35+00:00\",\"dateModified\":\"2017-12-15T13:21:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/\"},\"wordCount\":1000,\"image\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/Shared-access-policies.png\",\"keywords\":[\"Azure Service Bus\",\"MSMQ\"],\"articleSection\":[\"Azure Service Bus\",\"MSMQ\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/\",\"url\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/\",\"name\":\"Developer\u2019s perspective - Azure Service Bus for MSMQ users, Part 5\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/Shared-access-policies.png\",\"datePublished\":\"2017-12-15T12:48:35+00:00\",\"dateModified\":\"2017-12-15T13:21:11+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/#\\\/schema\\\/person\\\/e0c4fd92043868daa052d5978d69ed22\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/Shared-access-policies.png\",\"contentUrl\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/Shared-access-policies.png\",\"width\":250,\"height\":205},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/azure-service-bus\\\/developers-perspective-azure-service-bus-msmq-users-part-5\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.cogin.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developer\u2019s perspective &#8211; Azure Service Bus for MSMQ users, Part 5\"}]},{\"@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:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7edfd9071a535694242755af2736da7972b73f5d026be6563586a9b0ff7829d0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7edfd9071a535694242755af2736da7972b73f5d026be6563586a9b0ff7829d0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7edfd9071a535694242755af2736da7972b73f5d026be6563586a9b0ff7829d0?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":"Developer\u2019s perspective - Azure Service Bus for MSMQ users, Part 5","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\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/","og_locale":"en_US","og_type":"article","og_title":"Developer\u2019s perspective - Azure Service Bus for MSMQ users, Part 5","og_description":"For the last part of this short series, let\u2019s take a glance at some high-level differences between Azure Service Bus and MSMQ from developer&#8217;s point of view. We can&#8217;t cover much in a\u00a0single blog post and, so let&#8217;s just mention few things to get you started. Story of two APIs Actually, Azure Service Bus has [&hellip;]","og_url":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/","og_site_name":"Cogin blog","article_published_time":"2017-12-15T12:48:35+00:00","article_modified_time":"2017-12-15T13:21:11+00:00","og_image":[{"url":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.png","type":"","width":"","height":""}],"author":"Dejan Grujic","twitter_misc":{"Written by":"Dejan Grujic","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#article","isPartOf":{"@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/"},"author":{"name":"Dejan Grujic","@id":"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/e0c4fd92043868daa052d5978d69ed22"},"headline":"Developer\u2019s perspective &#8211; Azure Service Bus for MSMQ users, Part 5","datePublished":"2017-12-15T12:48:35+00:00","dateModified":"2017-12-15T13:21:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/"},"wordCount":1000,"image":{"@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.png","keywords":["Azure Service Bus","MSMQ"],"articleSection":["Azure Service Bus","MSMQ"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/","url":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/","name":"Developer\u2019s perspective - Azure Service Bus for MSMQ users, Part 5","isPartOf":{"@id":"https:\/\/www.cogin.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#primaryimage"},"image":{"@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.png","datePublished":"2017-12-15T12:48:35+00:00","dateModified":"2017-12-15T13:21:11+00:00","author":{"@id":"https:\/\/www.cogin.com\/blog\/#\/schema\/person\/e0c4fd92043868daa052d5978d69ed22"},"breadcrumb":{"@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#primaryimage","url":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.png","contentUrl":"https:\/\/www.cogin.com\/blog\/wp-content\/uploads\/2017\/12\/Shared-access-policies.png","width":250,"height":205},{"@type":"BreadcrumbList","@id":"https:\/\/www.cogin.com\/blog\/azure-service-bus\/developers-perspective-azure-service-bus-msmq-users-part-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.cogin.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Developer\u2019s perspective &#8211; Azure Service Bus for MSMQ users, Part 5"}]},{"@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:\/\/secure.gravatar.com\/avatar\/7edfd9071a535694242755af2736da7972b73f5d026be6563586a9b0ff7829d0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7edfd9071a535694242755af2736da7972b73f5d026be6563586a9b0ff7829d0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7edfd9071a535694242755af2736da7972b73f5d026be6563586a9b0ff7829d0?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\/184","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=184"}],"version-history":[{"count":9,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"predecessor-version":[{"id":236,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/posts\/184\/revisions\/236"}],"wp:attachment":[{"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cogin.com\/blog\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}