「キューの迷宮ってダジャレかい?」
「韻を踏んでいると言ってくれたまえ」
「やはりダジャレなんだ」
「本題はある!」
「何だよ」
「YamatoDriveでは遅延実行のために以下のような仕組みでキューを使っている」
- 遅延実行させる機能のためにキューを用意している
- キューに格納するメッセージは、バージョンに依存する場合がある
- 互換性の無いメッセージが存在すると困るので、バージョン番号ごとにキューを作ってバージョンを混ぜないようにしている
- それだと過去のバージョンのキューが全部残ってしまい無駄なので、自分自身以外のバージョンのキューは削除して除去する初期化処理が入っている
「それで、これがどうなんだ?」
「実はこの仕掛けは破綻する場合がある」
「どういうとき?」
「プロダクションとステージング等で別バージョンのインスタンスが同時に起動すると、別バージョンのインスタンスが起動した時点でキューが回収されてしまって、動作が継続できなくなる」
「なんてことだ」
「しかし、消さないという選択肢も無い」
「なんで?」
「非同期で複数バージョンが混在している場合、いつ本当に利用が終了して回収して良いのかが明確に分からないからだ」
「凄く悩ましい」
「メッセージにバージョンを仕込んで、バージョンが一致したメッセージだけ処理するようにすればいいじゃん」
「そうすると、そのバージョンのメッセージを処理するインスタンスが存在しないといつまでも処理されないメッセージが残り続ける」
「じゃ、バージョンが一致しないメッセージは削除する」
「それだと、処理できるインスタンスがあるのにメッセージが握りつぶされてしまう場合が発生する」
「ダメじゃん」
「どう攻めればいいか、とても悩ましい」
オマケ §
「でもさ。それって非同期キューの問題で、Windows Azureとはあまり関係ないんじゃ?」
「そうかもしれない」