平家物語の一節から安定したシステムの心得を学ぶ
2022-12-14
azblob://2022/12/16/eyecatch/2022-12-14-learning-the-rules-of-the-system-from-the-tale-of-the-heike-000.jpg

唐突ですが・・・日々暮らしていて昔から普遍的なことだなと思うことが2つあります。

1つは諸行無常、形あるものは必ず壊れるということ。
実家で記録用DVDにデータを保存したものを日当たりの良い場所に置いていたら、2年ほどで読み込みできなくなりました。

2つ目は、通信は簡単ではないということ。
日本国内で郵便を出した場合に届かなかった経験はほとんどないと思いますが、とある国に送ったお手紙がいつまで経っても届かない経験をしたことがあります。

このような事態は現代のシステムでも発生しますが、どのような対策があるでしょうか?

多重化する

1台のサーバーでしか処理しない状態だと、壊れた時に処理が継続できないですよね?
複数のサーバーで処理するようにしたいです。
これはコンテナ技術になっても同じことです。
Azureのストレージアカウントなんかはデフォルトで3重化して保存してくれますね。

リトライの仕組みを用意する

アプリケーションが動いているコンピューティングリソースの外部(データベースや他サービスなど)とのコミュニケーションをする際は、リトライの仕組みを用意しましょう。
メモリ上の処理のようなアプリケーションが動いているコンピュータに閉じた世界と、通信ケーブルを経由して未知のリソースに到達する外部とのコミュニケーションをする世界では、処理の失敗のリスクが全然違います。
処理が失敗した際はエラーコード等を頼りに判断しリトライする仕組みをアプリケーションで実装する必要があります。

処理するデータ量が増えても安定した通信ができる仕組みを検討する

上記のことを踏まえると、データ量が増えても安定した通信ができるように備えるのは大変です。
例えばサーバーを自動スケールする仕組みを用意することで、アプリケーション的に処理できる上限を増やしていきます。
また、データベースが接続を受け付ける口は限りがあるので、データベースとの接続にプールを利用するなどして無闇に新しい接続を増やさないことを考えるのも大切です。

まとめ

上記のようなことを実現する場合役に立つのは、温故知新、先人の知恵を活用することです。
自前でリトライの仕組みを書く前に、ライブラリで実現できることは任せるとか、社内のGitHubのコードで良さそうなものはないかとか。
冒頭に唐突に書いた「諸行無常」というのは平家物語に出てくる言葉で仏教の考え方だそうです。これも温故知新ですね。
ただ、このように主張するのは簡単ですが実現するのは難しいです。日々勉強です。