No Silver Bus
gRPCは好きになれなかった。
マイクロサービス間の通信は、結局のところ最適解を見つけられないままここまで来てしまった気がする。RESTは冗長だし、gRPCはProtobufの管理が煩わしい。メッセージキューを挟めば非同期の複雑さがついてくる。Kinesisにイベントを流してLambdaで取り出す構成を組んだこともあるが、ベンダーロックインの気持ち悪さがつねにあった。
でも本当に厄介なのは通信方式ではない。トランザクションだ。
データベースがACIDを保証するために何をしているか。WAL、MVCC、2フェーズコミット、デッドロック検出。数十年かけて磨き上げられた処理がカーネルに近い層で動いている。ディスクのfsyncひとつのタイミングまで制御して、ようやく一貫性が成り立つ。
それをHTTPの上で、ネットワークの不確実性を抱えたまま、サービスをまたいで再現しようとしている。Sagaパターン、補償トランザクション、結果整合性。どれも「完全な一貫性は諦める」という前提から出発している。データベースが物理層に近いところで命がけで守っているものを、アプリケーション層のリトライとイベントで再現しようとしている。そもそも無理があるんじゃないかとわたしは思っている。
トランザクションをまたぐようなサービス分離をするなという意見もある。でもドメイン単位で切ったらそうなるのは避けられない。注文と在庫と決済が別サービスになるECなんて典型だ。
銀の弾丸はまだ見つかっていない。