{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/hello-opossum","result":{"data":{"markdownRemark":{"id":"8a5bf06b-1e83-5199-9103-7c89d9e489e6","html":"<p>マイクロサービスなどで利用されるサーキットブレーカと言えば、最近は Envoy (Istio) が最も有名です。</p>\n<p>Envoy は別プロセスのプロキシ (コンテナのサイドカー) として導入してサーキットブレーカとして利用可能ですが、サーキットブレーカには各種言語のライブラリとして導入可能なものもあります。</p>\n<p>Node.js ライブラリ形式のサーキットブレーカである opossum をさわってみたので、その概要や感想をまとめます。</p>\n<h2 id=\"opossum-について\" style=\"position:relative;\"><a href=\"#opossum-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" aria-label=\"opossum について permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>opossum について</h2>\n<p><a href=\"https://www.npmjs.com/package/opossum\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">opossum</a> は Node.js のサーキットブレーカライブラリです。</p>\n<p>マイクロサービスにおけるサーキットブレーカと言えば外部サービスとの通信で利用するイメージが強いですが、opossum は任意の処理に対してサーキットブレーカを挿入することができます。</p>\n<p>使い方は非常に簡単で、失敗する可能性のある関数を CircuitBreaker クラスの引数に渡すだけです。</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">function</span> <span class=\"token function\">asyncFunctionThatCouldFail</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token operator\">:</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  timeout<span class=\"token operator\">:</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n  errorThresholdPercentage<span class=\"token operator\">:</span> <span class=\"token number\">50</span><span class=\"token punctuation\">,</span>\n  resetTimeout<span class=\"token operator\">:</span> <span class=\"token number\">30000</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> breaker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CircuitBreaker</span><span class=\"token punctuation\">(</span>asyncFunctionThatCouldFail<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nbreaker<span class=\"token punctuation\">.</span><span class=\"token function\">fire</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span>error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><a href=\"https://www.npmjs.com/package/opossum\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">npm の opossum のページ</a> を眺めれば、なんとなく使えてしまうと思います。</p>\n<h2 id=\"サンプルコードの実装\" style=\"position:relative;\"><a href=\"#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9F%E8%A3%85\" aria-label=\"サンプルコードの実装 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>サンプルコードの実装</h2>\n<p>実際にサーキットブレーカが動作する様子を見るため、TypeScript でコードを書いてみました。</p>\n<p>※ ここには主要な処理を抜粋して掲載するので、コードの全体については <a href=\"https://github.com/os1ma/circuit-breaker-samples/tree/main/opossum\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub のこちら</a> を参照ください。</p>\n<p>まずはテスト用に、await で指定した時間待てる wait 関数と、指定した時間遅延する slowEcho 関数を用意しました。</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">function</span> <span class=\"token function\">wait</span><span class=\"token punctuation\">(</span>second<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\"><span class=\"token builtin\">Promise</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">,</span> second <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">slowEcho</span><span class=\"token punctuation\">(</span>message<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> waitSecond<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">wait</span><span class=\"token punctuation\">(</span>waitSecond<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> message\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>続いて、サーキットブレーカの設定を定義します。</p>\n<p>オプションは色々ありますが、以下の例では</p>\n<ul>\n<li>エラーと判断するタイムアウトの時間</li>\n<li>何 % がエラーになったらサーキットブレーカを開くか</li>\n<li>サーキットブレーカが開いた場合、何秒後に再度利用可能になるか</li>\n</ul>\n<p>を設定しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">const</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  timeout<span class=\"token operator\">:</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n  errorThresholdPercentage<span class=\"token operator\">:</span> <span class=\"token number\">50</span><span class=\"token punctuation\">,</span>\n  resetTimeout<span class=\"token operator\">:</span> <span class=\"token number\">3000</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>サーキットブレーカを設定します。</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">const</span> breaker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CircuitBreaker</span><span class=\"token punctuation\">(</span>slowEcho<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n\nbreaker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'timeout'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span><span class=\"token string\">'timeout'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nbreaker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'open'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span><span class=\"token string\">'open'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nbreaker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'halfOpen'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span><span class=\"token string\">'halfOpen'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\nbreaker<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'close'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span><span class=\"token string\">'close'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>動作を見てみるため、breaker.on を使い、いくつかのイベントでログ出力も設定しました。</p>\n<p>あとは関数の実行の遅延が 0, 1, 2, … 秒となるように呼び出す処理を書きます。</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// [0, 1, 2, ...]</span>\n<span class=\"token keyword\">const</span> waitSeconds <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span><span class=\"token function\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> waitSeconds<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> waitSecond <span class=\"token operator\">=</span> waitSeconds<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n  <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">waitSecond = </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>waitSecond<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n\n\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> echoMessage <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> breaker<span class=\"token punctuation\">.</span><span class=\"token function\">fire</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Hello!'</span><span class=\"token punctuation\">,</span> waitSecond<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span>echoMessage<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">logWithTime</span><span class=\"token punctuation\">(</span><span class=\"token string\">'error catched!!!'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"実行結果\" style=\"position:relative;\"><a href=\"#%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C\" aria-label=\"実行結果 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>実行結果</h2>\n<p>実装したコードを実行してみると、以下のようになりました。</p>\n<p>※ ”#” 移行は実行結果についての説明です。</p>\n<div class=\"gatsby-highlight\" data-language=\"console\"><pre class=\"language-console\"><code class=\"language-console\">$ ts-node index.ts\n[20:50:42] waitSecond = 0\n[20:50:42] Hello!\n[20:50:42] waitSecond = 1\n[20:50:43] Hello!\n[20:50:43] waitSecond = 2\n[20:50:45] Hello!\n[20:50:45] waitSecond = 3\n[20:50:48] timeout\n[20:50:48] error catched!!! # 3 秒遅延させた処理は、タイムアウトでエラーとなっています\n[20:50:48] waitSecond = 4\n[20:50:51] timeout\n[20:50:51] error catched!!! # 4 秒遅延させた処理も、3 秒たった時点でタイムアウトでエラーとなっています\n[20:50:51] waitSecond = 5\n[20:50:54] timeout\n[20:50:54] open             # エラーが 50% になったため、この時点でサーキットブレーカが開きました\n[20:50:54] error catched!!! # 5 秒遅延させた処理も、3 秒たった時点でタイムアウトでエラーとなっています\n[20:50:54] waitSecond = 6\n[20:50:54] error catched!!! # 以後の処理は 3 秒待つこともなく、即座にエラーになっています\n[20:50:54] waitSecond = 7\n[20:50:54] error catched!!!\n[20:50:54] waitSecond = 8\n[20:50:54] error catched!!!\n[20:50:54] waitSecond = 9\n[20:50:54] error catched!!!</code></pre></div>\n<p>サーキットブレーカが動作しているのを確認できました。</p>\n<h2 id=\"その他のサーキットブレーカのライブラリについて\" style=\"position:relative;\"><a href=\"#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%B5%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88%E3%83%96%E3%83%AC%E3%83%BC%E3%82%AB%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" aria-label=\"その他のサーキットブレーカのライブラリについて permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>その他のサーキットブレーカのライブラリについて</h2>\n<p>今回は opossum を試しましたが、他にも npm には</p>\n<ul>\n<li><a href=\"https://www.npmjs.com/package/hystrixjs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">hystrixjs</a></li>\n<li><a href=\"https://www.npmjs.com/package/brakes\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">brakes</a></li>\n</ul>\n<p>といったサーキットブレーカのライブラリがありました。</p>\n<p>ただ、これらはすでにメンテナンスされていません。</p>\n<p>また、Netflixy 製のサーキットブレーカの Java ライブラリ <a href=\"https://github.com/Netflix/Hystrix\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Hystrix</a> もすでに活発な開発は行っておらず、<a href=\"https://github.com/resilience4j/resilience4j\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">resilience4j</a> のようなアクティブなライブラリを利用することを推奨しているようです。</p>\n<p>※ ちなみに、今回 opossum をさわってみたのは、書籍『<a href=\"https://amzn.to/3fKpD5q\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">マイクロサービスパターン</a>』で Hystrix が紹介されていて気になったのがきっかけです。</p>\n<p><a href=\"https://www.amazon.co.jp/dp/B086JJNDKS?&linkCode=li1&tag=oshimayuki0d-22&linkId=3fd6ae00da06517c46bcfe3f5719ddae&language=ja_JP&ref_=as_li_ss_il\" target=\"_blank\"><img border=\"0\" src=\"//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B086JJNDKS&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=oshimayuki0d-22&language=ja_JP\" ></a><img src=\"https://ir-jp.amazon-adsystem.com/e/ir?t=oshimayuki0d-22&amp;language=ja_JP&amp;l=li1&amp;o=9&amp;a=B086JJNDKS\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\"></p>\n<h2 id=\"envoy-などとの比較\" style=\"position:relative;\"><a href=\"#envoy-%E3%81%AA%E3%81%A9%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83\" aria-label=\"envoy などとの比較 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Envoy などとの比較</h2>\n<p>ライブラリ形式のサーキットブレーカが少なく、かつメンテナンスされていないケースが多い理由の 1 つは、Envoy (Istio) を利用した別プロセスのプロキシによるサーキットブレーカが主流になっているためだと思います。</p>\n<p>Kubernetes などを使い、<strong>Envoy などをサイドカーとして導入すれば、1 つ 1 つのアプリケーションにサーキットブレーカを仕込む手間がかかりません</strong>。</p>\n<p>これは<strong>複数の言語で実装されるマイクロサービスの場合には特に大きなメリット</strong>になります。</p>\n<p>一方、今回ライブラリ形式のサーキットブレーカをさわってみて、Envoy などを導入するよりも簡単だなと感じました。</p>\n<p><strong>Istio などのサービスメッシュの導入は、事例は増えているものの、気軽に手を出せるものではない</strong>と思います。</p>\n<p><strong>簡易的にサーキットブレーカを導入したい場合などは、opossum などのライブラリ形式のサーキットブレーカも良い選択かもしれない</strong>と感じました。</p>","fields":{"slug":"/posts/hello-opossum","tagSlugs":["/tag/microservices/"],"autoRecommendPosts":["typescript-books","microservices-books","it-trends-2021","refactoring-rearchitecting-books"]},"frontmatter":{"date":"2022-01-21T12:01:19.682Z","description":"マイクロサービスなどで利用されるサーキットブレーカと言えば、最近は Envoy (Istio) が最も有名です。\nEnvoy は別プロセスのプロキシ (コンテナのサイドカー) として導入してサーキットブレーカとして利用可能ですが、サーキットブレーカには各種言語のライブラリとして導入可能なものもあります。\nNode.js ライブラリ形式のサーキットブレーカである opossum をさわってみたので、その概要や感想をまとめます。","tags":["microservices"],"title":"Node.js のサーキットブレーカ opossum をさわってみた","socialImage":null,"recommendPosts":null}}},"pageContext":{"slug":"/posts/hello-opossum"}},"staticQueryHashes":["251939775","3942705351","401334301"]}