見出し画像

マイクロサービスにおける予期せぬ失敗の対処

タイトルがかなり抽象的でタイトルだけで何を書いているか伝えられる自信はないですがどのように変えれば良いかわからないです。

・自分自身記事を通して共有をしていますがまだ完全な解決策は出ていないです自分なりの現時点で思っていることを書いています。

何を書くか

マイクローサービスを使っている時って当然ではありますが複数のリクエストによってはサービスを複数通ったりDBを操作したりといったことがあります。

↓その一例です。

画像1

その処理の流れ自体はイメージしやすいとは思うのですが例えば途中で予期せぬ失敗をした場合どのようにすれば良いかはしっかり考えておかないとサービス全体の整合性が取れなくなる場合が存在します(全てではないです)。もちろん起きないことが理想ですがそのようにも行かないので対策しておきましょう。そこで今回はマイクロサービスで処理が途中で失敗した場合の対処を考えてみたいと思います。

また予期せぬ失敗なのでプログラマーが意図的に出したエラーはここには含みません。

そもそもどのような場合に意図せぬ失敗が起きるか

まずマイクロサービスで途中で失敗するのがどのような時かなのですが今のところ一つ思いついています。

外部サービスが落ちたなどで通信エラーが起きた場合→例えばfirebaseを利用している場合にfirebase側でユーザー登録ができたがクラウドが落ちたなどの問題でそのユーザーが自分のDBに登録できなかった・クラウドに問題はないがなんだかしらの通信エラーが起きてしまった など

対策

冒頭に書いてある通り自分自身まだ考え中なのですが今のところは

再度同じリクエストを送る

失敗していなかったところまでロールバック

の2つを思いついていて今のところその両方を組み合わせることによってある程度対策できると考えています。

再度クリエストを送るという解決手段はそれこそ通信エラーに関して限定かもしれないですが一度送って正常なステータス(望んだステータス)でないなら再送するといった内容です。通信エラーであれば2回送れば正常に動いているのであれば対処できると考えています。

失敗していなかったところまでロールバックに関しては失敗をした時にエラーを返してブラウザ側に戻った時にその操作が失敗したといった報告をした上でなかったことにするといった解決策です。この場合サーバー側のエラーであっても正常なステータスが帰ってこないことから失敗を判断できますし通信エラーにも対応できます。

これらの両方を組み合わせた場合失敗時の説明としては1回目失敗→再送(リクエスト2回目送信)→失敗ならロールバックといった流れです。ここまですれば予期せぬ問題が起きても大丈夫な気がします。

まとめ

今回は予期せぬエラーに絞り込みましたがそうでないただのエラーであってもマイクロサービスの場合対処が複雑になりがちな気がします。もう少しマイクロサービスに詳しくなったらこの対処法もわかると思うので時間がある時に知識を増やそうと思います。

この記事が気に入ったらサポートをしてみませんか?