
イベントドリブンな世界は苦手
これまでのお話を伺っていると、SOAはとても素晴らしいもののように思えてきました。こりゃあ、もうこれから作るシステムは全部SOAにせにゃいかんと思ったくらいです。ところで、SOAには何か欠点はあるんでしょうか?
残念ながらいっぱいあるよ。大きなものだけでも二つある。まず、イベントドリブンな世界には適用できない。イベントドリブンという言葉には色々と定義があるんだけど、ここでは「ひとつの処理が次から次へとバトンリレーのように連鎖していく」イメージだね。

コンシューマがサービスにリクエストを投げて、そこからリプライをもらうのがSOAの基本形だったよね。ところが、リクエストを受け取ったサービスが別のシステムに処理を投げて終わってしまうようだと、いつまでもコンシューマのもとにリプライが返ってこない。そういったシステムにはそもそもSOAは使えません。
リプライが戻ってこないと、なぜSOAが使えないのでしょうか?
SOAっていうのは、一定のプロセスを終始ひとつのコンシューマが管理するわけだよね。最初は、在庫確認サービスを呼んで、次に納期確認サービスを呼んで、という具合に、コンシューマが色々なサービスと対話しながら仕事を進めていくわけです。
ところが、イベントドリブンの世界では、処理の主体は次々と変わっていきます。ひとつのイベントが発生すると、ある処理が呼び出され、それがさらに別の処理を呼び出して、、、ドミノ倒しのように次々と勝手に処理がキックされていく。コンシューマは処理を呼び出したら最後、何の応答ももらえず、処理がどうなったかも分かりません。

なるほど。コンシューマが出る幕はなくなっちゃいますね。
そういうことだね。サービスとコンシューマがそれぞれ独立している関係のことを「疎結合」といいます。サービスとコンシューマはメッセージだけでコミュニケーションをとっていて、互いの内部構造に首を突っ込んだりしない。一方、イベントドリブンの世界では、モジュールたちはお互いの動作について一切関知しない。これを非結合といいます。非結合な世界にはSOAは向きません。これが欠点の一つ目。