この記事を読んでまず思ったのは、「これ、地味だけど本番ではかなり嫌なやつだな」ということだった。
MCP server 自体のロジックが壊れているわけではなく、replica を増やした瞬間にだけ「session not found」が出る。こういう不具合は、単体テストやローカル環境ではまず見えない。だからこそ厄介だし、運用している側からすると一番気持ち悪いタイプの障害だと思う。
特に引っかかったのは、原因がかなり素朴だという点だった。session を local memory に置いているのに、load balancer は毎回どの replica に振るかを気にしない。言われてみれば当然なのに、実際にはその「当然」を見落としてしまう。しかも SSE のように接続が長生きする transport だと、session はクライアントと server の間にある抽象的なものではなく、かなり物理的に「この replica にぶら下がっている状態」になる。そこを別 replica に投げられたら、そりゃ見つからない。
もう一つ面白かったのは、解決策がわりと王道で、だからこそ納得感があったことだ。
local memory をやめて shared session store に寄せる。Redis のような共有ストアに session を置けば、どの replica が request を受けても引ける。MCP の仕様そのものが distributed session store を面倒見てくれるわけではない、という指摘も筋が通っていると思う。仕様は「session がある」ことまでは定めても、「どう永続化するか」は実装側の仕事、という切り分けだ。
ただ、ここで少し気になったのは、SSE の response をどの replica の stream に返すかまで考えないといけない点だ。shared store だけで終わらず、pub/sub で response を流し戻す話が出てくる。つまり、session を shared にしただけでは足りなくて、接続の出口のほうもちゃんと跨いで面倒を見る必要がある。ここが「ただ state を外に出せばいい」より一段面倒で、でも実運用ではむしろそこが本丸なんだろうなと思った。