{"id":176,"date":"2023-04-22T09:47:08","date_gmt":"2023-04-22T09:47:08","guid":{"rendered":"https:\/\/ajaykumar.co.in\/?p=176"},"modified":"2025-03-24T15:37:53","modified_gmt":"2025-03-24T15:37:53","slug":"design-for-resiliency-bulkhead-design-pattern","status":"publish","type":"post","link":"https:\/\/ajaykumar.co.in\/?p=176","title":{"rendered":"Design for Resiliency &#8211; Bulkhead Design Pattern"},"content":{"rendered":"\n<p>Welcome to the blog on the <strong>Bulkhead Design Pattern<\/strong>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Introduction<\/h3>\n\n\n\n<p>Historically IT was supposed to be a backend operation and it was assumed that business can run without it. And it was never assumed to be a mission-critical part of the business apart from a few industries like airlines, medical, etc. With the latest <strong>COVID pandemic<\/strong> when entire humankind was facing the challenge of survival, IT became <strong>mission-critical<\/strong> for many day-to-day operations. Starting from grocery delivery to working in a remote environment.<\/p>\n\n\n\n<p>As IT systems became mission-critical, <strong>resiliency<\/strong> became one of the critical factors for the success of the IT systems. Resiliency refers to the ability of a system to function correctly in the face of unexpected events. These unexpected events should be planned as part of Architecture so that if it happens in an actual production environment, we know how to handle these. Various resiliency patterns are available to be used when we are building a robust application. As part of this blog, we will explore <strong>Bulkead Design Pattern<\/strong>.<\/p>\n\n\n\n<p>The bulkhead pattern has come from the <strong>shipbuilding<\/strong> industry.&nbsp;While building the ships, there are partitions or walls created in the hull. These partitions help in protecting the ship by containing the damage to a limited area. If any one of these partitions is flooded because of leakage, the damage is limited within this partition and it doesn&#8217;t let the ship sink.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Compartments_and_watertight_subdivision_of_a_ships_hull_Seamans_Pocket-Book_1943_cropped.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"475\" height=\"290\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Compartments_and_watertight_subdivision_of_a_ships_hull_Seamans_Pocket-Book_1943_cropped.jpg\" alt=\"\" class=\"wp-image-188\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Compartments_and_watertight_subdivision_of_a_ships_hull_Seamans_Pocket-Book_1943_cropped.jpg 475w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Compartments_and_watertight_subdivision_of_a_ships_hull_Seamans_Pocket-Book_1943_cropped-300x183.jpg 300w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/a><figcaption><a href=\"https:\/\/en.wikipedia.org\/wiki\/Bulkhead_%28partition%29\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Bulkhead_%28partition%29\">https:\/\/en.wikipedia.org\/wiki\/Bulkhead_%28partition%29<\/a><\/figcaption><\/figure>\n\n\n\n<p>The bulkhead resiliency pattern helps in a similar way to contain the impact of a faulty operation within a limited area. This helps other parts of the application to operate normally when one of the areas is impacted by faulty code or faulty dependencies.<\/p>\n\n\n\n<p>Let&#8217;s start understanding this entire concept using one example. I have developed this example in ASP.Net Core WebAPI, this concept is not limited and restricted to ASP.Net technology. You can use other technical stacks and also implement the same concept.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code Base<\/h3>\n\n\n\n<p>The code base used in this blog is posted under GitHub and you can download it from there. <\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/akumaramar\/bulkhead\">https:\/\/github.com\/akumaramar\/bulkhead<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tools Used<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><a href=\"https:\/\/code.visualstudio.com\/\" data-type=\"URL\" data-id=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a><\/strong> &#8211; Code Editor<\/li><li><strong><a href=\"https:\/\/k6.io\/\" data-type=\"URL\" data-id=\"https:\/\/k6.io\/\">K6<\/a><\/strong> &#8211; Developer Performance Testing Tool<\/li><li><strong><a href=\"https:\/\/github.com\/App-vNext\/Polly\" data-type=\"URL\" data-id=\"https:\/\/github.com\/App-vNext\/Polly\">Polly<\/a><\/strong> &#8211; Library for resiliency<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The flow of Application<\/h3>\n\n\n\n<p>The SampleAPI application is composed of four controllers. These controllers have the below functionality.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>FaultyController <\/strong>\u2013 This controller uses the code which engages the CPU for a certain time and spikes it as it requires a lot of computation.<\/li><li>SumController \u2013 This Controller provides a simple sum of two numbers.<\/li><li>SubController \u2013 This Controller provides a simple subtraction of two numbers.<\/li><li><strong>HelloController <\/strong>\u2013 This Controller provides a hello to sent request.<\/li><\/ul>\n\n\n\n<p>As the first step, we need to open the SampleAPI application in Visual Studio Code. Then you can start running the application with F5. Once the application is up and running, you can open the Swagger to check all these APIs to understand how they are behaving.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"473\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1-1024x473.png\" alt=\"\" class=\"wp-image-228\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1-1024x473.png 1024w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1-300x139.png 300w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1-768x355.png 768w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1-1536x710.png 1536w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1-750x347.png 750w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/Swagger-1.png 1808w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Swagger<\/figcaption><\/figure>\n\n\n\n<p>You can see the below diagram to understand the expected behavior and how the host machines and ThreadPool would be engaged in serving the operation. In a healthy situation, all the requests should be split across available ThreadPool to handle all the requests.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/HealthySituation.png\"><img loading=\"lazy\" decoding=\"async\" width=\"753\" height=\"444\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/HealthySituation.png\" alt=\"\" class=\"wp-image-231\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/HealthySituation.png 753w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/HealthySituation-300x177.png 300w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/HealthySituation-750x442.png 750w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \/><\/a><\/figure>\n\n\n\n<p>As more requests will arrive at the application, it should get distributed and the application should work as expected. However, this doesn\u2019t happen in the current situation as we have one interesting code written in FualtyController. This code engages the CPU by using a Square root operation starting from 100K. This operation runs for around 2 seconds. During this period the CPU is fully engaged in this computational operation. Below is the code block and you can refer to the FualtyCode function.<\/p>\n\n\n\n<pre title=\"FaultyController\" class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">namespace TodoApi.Controllers\n{\n    [Route(&quot;api\/[controller]&quot;)]\n    [ApiController]\n    public class FaultyController : ControllerBase\n    {\n        [HttpGet(Name = &quot;GetFaulty&quot;)]\n        public String GetAllData(String name){\n\n            return FaultyCode();\n        }\n        \n        \/\/ This code causes the CPU to spike a lot\n        private string FaultyCode(){\n\n            DateTime timeAfterFiveSec = DateTime.Now.AddSeconds(2);\n            \/\/ perform a computationally intensive task\n            while (DateTime.Now &lt; timeAfterFiveSec)\n            {\n                double result = 0;\n                for (int i = 1; i &lt; 100000; i++)\n                {\n                    result += Math.Sqrt(i);\n                }\n            }\n            return &quot;Time&#039;s up!&quot;;\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>Let us simulate the load on this entire application using the K6 load runner. This is a very nice tool that you can use in the development environment to simulate user load. We are going to load the FaultyController with 100 users for 30 seconds and check how our CPU is behaving. The sample code to generate the load is kept under the K6Load folder. It has a code base for loading all routes of the application. Below is the codebase for the load Faulty endpoint.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript line-numbers\">import http from &quot;k6\/http&quot;;\nimport { check } from &quot;k6&quot;;\n\nexport default function() {\n    let res = http.get(&quot;http:\/\/localhost:5143\/api\/Faulty?name=Hello&quot;);\n    check(res, {\n      &quot;status is 200&quot;: (r) =&gt; r.status === 200\n    });\n  }<\/code><\/pre>\n\n\n\n<p>You can see we are making a request to \u201c\/Fauty\u201d and checking for a response if we are getting 200 also not. Below is a sample command line you can use to run the load for this.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"132\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1-1024x132.png\" alt=\"\" class=\"wp-image-232\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1-1024x132.png 1024w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1-300x39.png 300w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1-768x99.png 768w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1-750x97.png 750w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/LoadRunner-1.png 1145w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>As you will start running the load at this endpoint, you can see how your CPU is spiking high for <strong>dotnet.exe<\/strong>. The spike will continue for the 30s.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManager-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"959\" height=\"564\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManager-1.png\" alt=\"\" class=\"wp-image-236\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManager-1.png 959w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManager-1-300x176.png 300w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManager-1-768x452.png 768w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManager-1-750x441.png 750w\" sizes=\"auto, (max-width: 959px) 100vw, 959px\" \/><\/a><\/figure>\n\n\n\n<p>During this period if you try to check the response time of other endpoints (use other files in the K6Load folder and then run it through the command line), you will find a significant degradation in overall response time along with failure rate. What is happening here is that the ThreadPool on the server is getting occupied with Faulty requests and there is bandwidth to handle general requests. This situation is really bad for your production environment as it can bring down your entire application.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/UnHealthySituation.png\"><img loading=\"lazy\" decoding=\"async\" width=\"721\" height=\"442\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/UnHealthySituation.png\" alt=\"\" class=\"wp-image-237\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/UnHealthySituation.png 721w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/UnHealthySituation-300x184.png 300w\" sizes=\"auto, (max-width: 721px) 100vw, 721px\" \/><\/a><\/figure>\n\n\n\n<p>To build resiliency in the application we need to restrict how many threads can be occupied by Faulty calls. The bulkhead design pattern will come to the rescue during this situation. Below is the sample syntax of Bulkhead using the Polly library.<\/p>\n\n\n\n<pre title=\"Bulkhead Policy\" class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">BulkheadPolicy bulkhead = Policy\n  .Bulkhead(int maxParallelization\n           [, int maxQueuingActions]\n           [, Action&lt;Context&gt; onBulkheadRejected]);\n\nBulkheadPolicy bulkhead = Policy\n  .BulkheadAsync(int maxParallelization\n                [, int maxQueuingActions]\n                [, Func&lt;Context, Task&gt; onBulkheadRejectedAsync]);\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>maxParallelization <\/strong>\u2013 This variable controls how many parallel requests would be served for this policy.<\/li><li><strong>maxQueuingActions<\/strong> \u2013 This variable controls how many requests would be queued when the current threshold is reached to accept the number of requests.<\/li><\/ul>\n\n\n\n<p>We will be using the above policy to change our FaultyController to control the number of requests it can handle and also how many to queue. Below is the updated code with this Bulkhead resiliency.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">using Microsoft.AspNetCore.Mvc;\nusing Polly;\nusing Polly.Bulkhead;\nusing System.Diagnostics;\n\nnamespace TodoApi.Controllers\n{\n    [Route(&quot;api\/[controller]&quot;)]\n    [ApiController]\n    public class FaultyController : ControllerBase\n    {\n        \/\/ Policy of the Bulhead\n        private static BulkheadPolicy bulkHeadPolicy = Policy\n            .Bulkhead(2, 2, context =&gt; {\n                Debug.WriteLine(&quot;More than 2 parallel calls are rejected&quot;);\n            });\n\n        [HttpGet(Name = &quot;GetFaulty&quot;)]\n        public String GetAllData(String name){\n\n            \/\/ Wrap the code under the policy\n            return bulkHeadPolicy.ExecuteAndCapture(() =&gt; FaultyCode()).Result;\n        }\n        \n        \/\/ This code causes the CPU to spike a lot\n        private string FaultyCode(){\n\n            DateTime timeAfterFiveSec = DateTime.Now.AddSeconds(2);\n            \/\/ perform a computationally intensive task\n            while (DateTime.Now &lt; timeAfterFiveSec)\n            {\n                double result = 0;\n                for (int i = 1; i &lt; 100000; i++)\n                {\n                    result += Math.Sqrt(i);\n                }\n            }\n            return &quot;Time&#039;s up!&quot;;\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>You can refer to line #13 where we are adding a policy to accept only 2 parallel requests and also wait for only 2 in the queue. If there are more than this number of requests, you will see in line # 15 we are saying that \u201cMore than 2 parallel calls are rejected\u201d.<\/p>\n\n\n\n<p>Let\u2019s run this code and see how the CPU is behaving. This can be achieved by using the K6 command as mentioned above. You can see how the CPU is not going beyond a certain level and it is available to handle other requests.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManagerUpdated-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"953\" height=\"501\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManagerUpdated-1.png\" alt=\"\" class=\"wp-image-244\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManagerUpdated-1.png 953w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManagerUpdated-1-300x158.png 300w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManagerUpdated-1-768x404.png 768w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/TaskManagerUpdated-1-750x394.png 750w\" sizes=\"auto, (max-width: 953px) 100vw, 953px\" \/><\/a><\/figure>\n\n\n\n<p>And if you try to simulate other loads, it will reach to below situation where only 2 parallel requests are being served for Faulty and other requests continue to be handled without any disturbance. The below diagram is the representation of that situation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/RestrictedSituation.png\"><img loading=\"lazy\" decoding=\"async\" width=\"787\" height=\"448\" src=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/RestrictedSituation.png\" alt=\"\" class=\"wp-image-245\" srcset=\"https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/RestrictedSituation.png 787w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/RestrictedSituation-300x171.png 300w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/RestrictedSituation-768x437.png 768w, https:\/\/ajaykumar.co.in\/wp-content\/uploads\/2023\/04\/RestrictedSituation-750x427.png 750w\" sizes=\"auto, (max-width: 787px) 100vw, 787px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>The resiliency is important aspect of design. We need to consider that from day one of the development. Bulkhead can help you to compartmentalize the issue and let it spread across your entire deployment.<\/p>\n\n\n\n<p>Happy Designing Resilient Systems. Feel free to reach out to me.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to the blog on the Bulkhead Design Pattern. Introduction Historically IT was supposed to be a backend operation and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":188,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[5],"tags":[],"class_list":["post-176","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/posts\/176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=176"}],"version-history":[{"count":58,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/posts\/176\/revisions"}],"predecessor-version":[{"id":248,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/posts\/176\/revisions\/248"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=\/wp\/v2\/media\/188"}],"wp:attachment":[{"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ajaykumar.co.in\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}