{"id":54987,"date":"2020-01-09T00:00:00","date_gmt":"2020-01-08T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery"},"modified":"2020-02-18T14:03:03","modified_gmt":"2020-02-18T11:03:03","slug":"istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery","title":{"rendered":"Istio Circuit Breaker: disabling faulty containers","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>The holidays are over, and we're back with our second post in the Istio Service Mesh series.<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/6d65a62468d0f17570cb8b92e03ceb71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nToday's topic is Circuit Breaker, which translates to 'automatic switch' in Russian, colloquially known as 'protection switch'. However, in Istio, this switch does not disable a shorted or overloaded circuit but rather faulty containers.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>How this is supposed to work in an ideal world<\/h3>\n<p>\nWhen microservices are managed by Kubernetes, for example, within the OpenShift platform, they automatically scale up and down depending on the load. Since microservices run in pods, multiple instances of a containerized microservice can exist at a single endpoint, and Kubernetes will route requests and balance the load among them. Ideally, all of this should work seamlessly.<\/p>\n<p>We must remember that microservices are small and ephemeral. The ephemerality, which here means the ease of coming into existence and disappearing, is often underestimated. The birth and death of each microservice instance in a pod is quite expected; OpenShift and Kubernetes handle this well, and everything works wonderfully \u2013 but again, only in theory.<\/p>\n<h3>How this really works<\/h3>\n<p>\nNow imagine that a specific instance of a microservice, that is, a container, has failed: either it isn\u2019t responding (error 503), or, even worse, it responds but too slowly. In other words, it\u2019s glitching or not answering requests, but it hasn\u2019t been removed from the pool. What should be done in this case? Retry? Remove it from the routing schema? And what does 'too slow' mean \u2013 how do we quantify that, and who makes that determination? Maybe just give it a break and try later? If so, how much later?<\/p>\n<h3>What is Pool Ejection in Istio<\/h3>\n<p>\nThis is where Istio comes to the rescue with its Circuit Breaker mechanisms, which temporarily remove faulty containers from the resource pool for routing and load balancing, implementing the Pool Ejection procedure.<\/p>\n<p>Using an outlier detection strategy, Istio detects skewed pods that deviate from the norm and removes them from the resource pool for a defined period known as the 'sleep window'. <\/p>\n<p>To illustrate how this works in Kubernetes on the OpenShift platform, let's start with a screenshot of the functioning microservices from the example in the repository. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/redhat-developer-demos\/istio-tutorial\">Red Hat Developer Demos<\/a><\/noindex>Here we have two pods, v1 and v2, each running one container. When Istio routing rules are not in use, Kubernetes defaults to evenly balanced round-robin routing.<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/6bd750250a84fdbd2f3e1fcfe0c2d9fd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Preparing for failure<\/h3>\n<p>\nBefore performing Pool Ejection, we need to create an Istio routing rule. Let's say we want to distribute requests between the pods with a 50\/50 ratio. Additionally, we will increase the number of v2 containers from one to two, as follows:<\/p>\n<pre><code class=\"plaintext\">oc scale deployment recommendation-v2 --replicas=2 -n tutorial\n<\/code><\/pre>\n<p>\nNow we set the routing rule so that traffic is distributed between the pods in a 50\/50 ratio.<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/e40af0e8d94fc5ae0d8dcdd6105d34eb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHere is how the result of this rule looks:<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/70e4a251f33828b4c1ac688921e5545a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOne might argue that this screenshot shows not 50\/50, but rather 14:9, but over time the situation will balance out.<\/p>\n<h3>Inducing failure<\/h3>\n<p>\nNow we will take one of the two v2 containers out of service so that we have one healthy v1 container, one healthy v2 container, and one unhealthy v2 container. <\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/c376ed242d5659c6953e8cd4821222ab.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Fixing failure<\/h3>\n<p>\nSo, we have an unhealthy container, and it's time for Pool Ejection. With a very simple config, we will exclude this faulty container from any routing schemes for 15 seconds, hoping that it will return to a healthy state (either by restarting or restoring performance). Here\u2019s what this config looks like and the results of its operation:<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/1f7261c7907d12002249642dbc2be054.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/cb9378b82e533d4b6dd312928294b3a1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs seen, the unhealthy v2 container is no longer used for routing requests since it was removed from the pool. However, after 15 seconds, it will automatically return to the pool. In fact, we've just demonstrated how Pool Ejection works.<\/p>\n<h3>Starting to build architecture<\/h3>\n<p>\nPool Ejection, combined with Istio's monitoring capabilities, allows us to start establishing a framework for automatically replacing unhealthy containers, reducing or even eliminating downtime and failures.<br \/>\n\u2003<br \/>\nNASA has a famous motto \u2013 Failure Is Not an Option, attributed to the Flight Director. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D1%80%D0%B0%D0%BD%D1%86,_%D0%94%D0%B6%D0%B8%D0%BD\">Gene Kranz<\/a><\/noindex>In English, it can be translated as \"Failure is not an option,\" meaning that everything can be made to work if there is enough willpower. However, in real life, failures are not just occurrences, they are inevitable, everywhere and in everything. So how do we deal with them in the case of microservices? In our opinion, it is better to rely not on willpower, but on the capabilities of containers. <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">Kubernetes<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/openshift\/overview\/\">Red Hat OpenShift<\/a><\/noindex>, and <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/service-mesh\/\">Istio<\/a><\/noindex>.<\/p>\n<p>As we mentioned earlier, Istio successfully implements the well-established physical world concept of circuit breakers. Just as an electrical circuit breaker disconnects a problematic section of the circuit, the software Circuit Breaker in Istio breaks the connection between the stream of requests and the problematic container when something is wrong with the endpoint, for example, when the server crashes or starts to lag.<\/p>\n<p>Moreover, in the second case, problems only multiply, since the delays of one container not only cause cascading delays in the services that depend on it, consequently lowering the overall system performance, but also generate repeat requests to an already slow service, which only exacerbates the situation.<\/p>\n<h3>Circuit Breaker in theory<\/h3>\n<p>\nThe Circuit Breaker is a proxy that controls the flow of requests to the endpoint. When this endpoint stops working or \u2013 depending on the settings \u2013 starts to lag, the proxy breaks the connection with the container. After that, traffic is redirected to other containers, simply for load balancing. The connection remains open for a specified sleep window, say two minutes, and then transitions to a half-open state. An attempt to send the next request determines the further state of the connection. If everything is OK with the service, the connection returns to a working state and becomes closed again. If there is still an issue with the service, the connection breaks again, and the sleep window resets. Here's what a simplified state transition diagram of the Circuit Breaker looks like:<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/7ba3e945451cbcaf797f9706c8dacb3c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIt is important to note that all this occurs at a systemic architecture level, so at some point you will need to teach your applications to work with the Circuit Breaker, for example, by providing a default value in response or, if possible, ignoring the existence of the service. This is achieved using the bulkhead pattern, but it is beyond the scope of this article.<\/p>\n<h3>Circuit Breaker in practice<\/h3>\n<p>\nAs an example, we will run two versions of our recommendation microservice on OpenShift. Version 1 will function properly, while in v2 we will introduce a delay to simulate server slowness. The results will be viewed using the tool <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/JoeDog\/siege\">siege<\/a><\/noindex>:<\/p>\n<pre><code class=\"plaintext\">siege -r 2 -c 20 -v customer-tutorial.$(minishift ip).nip.io\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/0660814fd5d7ebc9d9a3fa9f95fbae3c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEverything seems to be working, but at what cost? At first glance, we have 100% availability, but take a closer look \u2013 the maximum transaction duration is a full 12 seconds. This is clearly a bottleneck that needs to be addressed.<\/p>\n<p>To do this, we will use Istio to exclude calls to slow containers. Here is what the corresponding config looks like using the Circuit Breaker:<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/bb7349d199dad89964d824ae1194c3fc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThe last line with the parameter httpMaxRequestsPerConnection signals that the connection should be broken when attempting to create another \u2013 second \u2013 connection in addition to the existing one. Since our container simulates a slowing service, such situations will occur periodically, and then Istio will return a 503 error, while this is what siege will show:<\/p>\n<p><img decoding=\"async\" alt=\"Istio Circuit Breaker: disabling faulty containers\" src=\"\/wp-content\/uploads\/2020\/01\/2bb6f4fb3669bd4ea6214b98bcfa22ac.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Okay, we have a Circuit Breaker, what next?<\/h3>\n<p>\nSo, we have implemented automatic disconnection without touching the original code of the services themselves. By using the Circuit Breaker and the Pool Ejection procedure described above, we can remove slowing containers from the resource pool until they return to normal, and check their status at a specified interval \u2013 in our example, this is two minutes (the sleepWindow parameter).<\/p>\n<p>Note that the application's ability to respond to a 503 error is still set at the level of its original code. There are many strategies for working with Circuit Breaker that are applied depending on the situation.<\/p>\n<p><b>In the next post:<\/b> we will discuss tracing and monitoring, which are already built-in or easily added to Istio, as well as how to intentionally introduce errors into the system.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/483262\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c, \u0438 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0438\u043c \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0441\u0442\u043e\u043c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u043e Istio Service Mesh. \u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u044f\u044f \u0442\u0435\u043c\u0430 \u2013 Circuit Breaker, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c\u00bb, \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0435\u0447\u0438\u0438 \u2013 \u00ab\u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0437\u0430\u0449\u0438\u0442\u044b\u00bb. \u0422\u043e\u043b\u044c\u043a\u043e \u0432 Istio \u044d\u0442\u043e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043d\u0435 \u043a\u043e\u0440\u043e\u0442\u043d\u0443\u0432\u0448\u0443\u044e \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0446\u0435\u043f\u044c, \u0430 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b. \u041a\u0430\u043a \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u041a\u043e\u0433\u0434\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-54987","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c, \u0438 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0438\u043c \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0441\u0442\u043e\u043c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u043e Istio Service Mesh.\" \/>\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\/en\/blog\/administrirovanie\/istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\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\udd47Istio Circuit Breaker: \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c, \u0438 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0438\u043c \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0441\u0442\u043e\u043c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u043e Istio Service Mesh.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery\" \/>\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-01-08T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:03+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\udd47Istio Circuit Breaker: disabling faulty containers | ProHoster","description":"The holidays are over, and we're back with our second post in the Istio Service Mesh series.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\udd47Istio Circuit Breaker: \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b | ProHoster","og:description":"\u041f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c, \u0438 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0438\u043c \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0441\u0442\u043e\u043c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u043e Istio Service Mesh.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/istio-circuit-breaker-otklyuchaem-neispravnye-kontejnery","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-01-08T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54987","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":"2026-01-24 13:26:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:54:34","updated":"2026-01-24 13:26:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/54987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=54987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/54987\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=54987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=54987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=54987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}