2012年10月

白山羊さんと黒山羊さんのお手紙(通信について)

MQ(メッセージキューイング)を考えていたときの妄想です。通信について考えてみました。

通信もそうですが、ITの世界で一番難しいのがデジタル世界を飛び出して物理(アナログ)の世界に入る時です。デジタルの世界では、ある変数に値を入れれば間違いなく入りますが、物理の世界はそうはいきません。通信で送ったつもりでも送られていないなんてことはいくらでもあります。そのためにackを返すんですが少し考えてみます。

通信は電話ではなく手紙の世界に近いです。電話はお互いに同時に話せます。結構凄いことで、同時に話せるので相手に伝わったかを確認しながら話せます。でも手紙の世界はそうはいきません。届いたよーと返事を出してもらってはじめて無事に届いたことがわかります。この届いたよーがいわゆるackです。

でもここでふと疑問に思ったのです。届いたよーという返事を出した人は届いたかがわからないのです。ならばもう一度届いたよーと送ってもらえば済むのですが、今度は確認の届いたよーが届いたかがわかりません。そんなことをやっていると無限に続きます。



話がややこしくなるので以下のように定義します。はじめに白山羊さんから黒山羊さんに手紙を出します。

一回目 白山羊→黒山羊
この手紙を「出すよー」とします。

二回目 黒山羊→白山羊
この手紙を「届いたよー」とします。

三回目 白山羊→黒山羊
この手紙を「こっちも届いたよー」とします。

四回目 黒山羊→白山羊
この手紙を「もうやめようよ!」とします。

手紙のやり取りは永遠に続くので、二人が確実に伝えたいのは一つ目の出すよーの手紙であるとします。

普通に考えると確実に伝えるためには、白山羊さんが出すよーを送り、黒山羊さんが届いたよーを送れば成立する気がします。でも二人の間で確実に届いたことを伝えるには不十分です。というのは、黒山羊さんが相手に届いたかどうかがわからないからです。白山羊さんも黒山羊も神経質で心配性ならモヤモヤしてしまいます。(一般的には他のレイヤーでも制御できるのでここで終わると思いますが、エンジニアあうふはこだわって考えます。)



そこでもう一度手紙を送ります。今度は白山羊さんからこっちも届いたよーを送ります。すると、ここではじめて一番はじめの手紙を双方受け取れたことがわかります。

では今度は途中に邪魔が入ったケース
を考えてみます。出すよーの手紙をシマウマさんが食べてしまうと、白山羊さんは届いたよーが返ってこないので、何かあったんだ!と思ってもう一度手紙を出せます。

届いたよーの手紙をシマウマさんが食べてしまうと、白山羊さんは返ってこないのでやはり何かあったんだ!と思ってもう一度手紙を出せます。また、黒山羊さんもこっちも届いたよーが返ってこないので、もう一度手紙を出せます。

では、こっちも届いたよーをシマウマさんが食べてしまうと、黒山羊さんは手紙が何かあったんだ!と思ってもう一度手紙を出せます。一方、白山羊さんは自分は確認の、こっちも届いたよーを出したし、お互いに届いたことがわかっているのでしばらく待ちます。

最後に、もうやめようよ!は白山羊さんにも黒山羊さんにも必要ない手紙です。黒山羊さんも返事が確実に伝えられたらことがわかっているからです。逆にいうと本当にお互いが確認するにはこのように三回のやり取りが必要になります。



さて、手紙が届かない時の、何かあったんだ!、と思う待ちの時間がシステムの通信では大切です。ここの時間が長すぎても駄目ですし、短すぎても駄目です。長すぎると時々シマウマさんが登場すると手紙のやり取りが長くかかりすぎます。逆に短すぎると手紙を書くのに手間取って時間がかかっただけなのに、何かあったんだ!と誤解してしまいます。そうすると制御がさらにややこしくなります。

あと難しいのは終わりの設計です。最後は黒山羊さんが、こっちも届いたよーをもらって終わるので、黒山羊さんは無事に終わって満足です。問題は白山羊さんです。白山羊さんは自分の出した手紙が届いたかわかりません。例えば、白山羊がこっちも届いたよーを出して満足して家から出かけてしまうと、運悪くシマウマさんが登場し、黒山羊さんがもう一度手紙を送っても白山羊さんはいません。つまり、相手に届いたと思われる時間までは家にいる必要があります。問題はいつまで家にいればいいかです。ここが難しい。もしかしたら台風が来て届くのがいつもよりも遅くなるかもしれません。とはいえ、永遠に待つ訳にもいかないので時間を決めます。

この時間は、
黒山羊さんが何かあったんだ!と気付く時間+黒山羊さんが手紙を書く時間+黒山羊さん→白山羊の送る時間+余裕
です。

この余裕が難しいですが、そこは設計者のノウハウとカンになります。



長くなりましたが、システムには設計通りにできていても、このようなタイミング(待ち時間)の問題でトラブルになることがあります。しかも一度タイミング問題が出ても大抵は再現させられず、お蔵入りになります。あんまり簡単にタイミング問題かぁと諦めるのも駄目ですが、賢く諦めるのもまた大切です。

最後に、MQまで書こうと思ったけど大変なんでオシマイです。あと、2、3相コミットも面倒なんで省略(笑)まぁ別の次元の話ですし。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。