1. 一度は書いたRetry Pattern(動画の台本)
ス「解説役のスーだよ」
ミ「相槌役のミカゼです」
ス「今回はリトライパターンを紹介するよ」
ミ「はい」
ス「正直、大抵のソフトウェアエンジニアなら書いたことがあると思う。」
ミ「はい、それなら紹介はいらないのでは無いでしょうか」
ス「デザインパターンはよく使う実装にも名前が付いてるのもあるよって紹介したいの」
ミ「そうなのですね」
ス「オブジェクト指向じゃないのをまずは紹介したかったからね。解説入るよ」
ス「Retry パターンはシステムやアプリケーションの実行中に発生するエラーを処理するために使用される方法の1つ。このパターンではエラーが発生した場合に再試行(リトライ)することで、システムの可用性と信頼性を向上させることが出来るものだよ」
ミ「分からなくて目が回ります」
ス「通信に置き換えるとわかりやすくなるよ」
ス「アプリからデータを取得するためにサーバーに通信する。しかし、通信が失敗した。再度通信をする。失敗する。再度通信をする。失敗する。諦めてエラー処理。ざっくり言うとこういう流れ。この再度通信をするというのがリトライだね。特徴としてリトライする前に一定時間待たせることが重要だよ」
ミ「何故ですか?」
ス「通信が失敗したということはサーバーに負荷がかかって失敗した可能性があるからだよ。その状態で即座に通信を試みても失敗する可能性は高そうだからね。大抵はsleep関数的なものを使うよ」
ミ「それで万全なのですか?」
ス「万全じゃないよ。リトライの回数が無限だとサーバーに凄く負荷を掛けてしまう。これは良くない。」
ミ「なるほど。無限リトライ、sleepなしはある種の攻撃になってしまう可能性もあるんですね」
ス「そういう側面もあるね。リトライの回数やsleepは状況によって変わるから適切な回数、秒数を選択する必要があるよ」
ミ「目安のようなものは無いのですか?」
ス「何をしたいかによって変わるから、そこの見極めは自分、もしくはプロジェクトで考える必要があるよ」
ス「ソースが合ったほうが分かりやすいから用意するよ」
ここでIDEを出して日本語で実装を書く
#retry回数を決めておく。3回
#通信を行う
#失敗したらretryカウンターを増やす
#sleep時間を決める1秒
#再度通信を行う
上記を繰り返す
ス「ソースに置き換えるよ」
ス「ちちんぷいぷいほいっ」
その後にソースに置き換える
ス「これがシンプルなC#のときのみのパターン」
ミ「これはzenn.devにソース貼っておきますね。概要欄に忘れなければリンクを貼っておきます」
ス「豆知識。通信先のhttpbin.orgはHTTPリクエストとレスポンスのテストをするためのWebサービスだよ。JSONでレスポンスが返ってくるよ。」
ミ「次はUnityで使うのですね。」
ス「無理やり使おうと思ったけど同じようなものになるだけなので止めた」
ミ「使用する関数が変わるだけになりますからね」
ス「まとめにはいるよ。RetryPatternは至る所で使われるパターンだよ。通信で認証とかデータを取得するような場合は使うと良いよ。」
ミ「他は状況に応じて使えというスタイルですね。」
ス「うん、どこもかしこもRetryPatternを使うというのも変だし考えて使うのが大事。これはどんなことにも言えるんだけどね」
ミ「銀の弾丸は無いということですね」
ス「うん、そういうこと。さて、締めるよ」
ス・ミ「ご視聴ありがとうございました」
ス「またね」
ミ「貴方の1日が素晴らしきものでありますように」