← 開発ノート一覧に戻る
Wavelength 2026-08-31

「即時反映」を実装したら、直すたびに違う場所が壊れた話

Wavelengthは友達のグループで曲を共有し合うアプリで、それまでは数秒おきに「何か変わってないか」を問い合わせる方式で最新状態を表示していた。これを、変化が起きた瞬間にだけ即座に届く方式へ切り替えることにした。仕組み自体は珍しいものではなく、実装もすんなり終わった。ところが切り替えた直後から、直しても直しても別の場所が壊れる、という状態が3回続いた。

まず、リアクションが送れなくなった

実装した直後、曲へのリアクションを送ろうとすると失敗するようになった。原因を探るのに一番早いのは、アプリの外から、データベースに対して直接同じ操作をしてみることだ。試してみると、データベース自身がエラーを返してきた。「その条件では、どの行を上書きすればいいか判断できない」という趣旨のメッセージだった。

原因は、少し前に追加していた「同じ組み合わせは1件までしか許さない」というルールにあった。ただしこのルールには「ある条件を満たす行にだけ適用する」という限定が付いていた。データベースは、こういう条件付きのルールを、日常的な「同じものがあれば上書き、無ければ新規作成」という判断材料としては使ってくれない、という仕様だった。ルールから条件を外して直した。

直したら、今度はメンバーが一人も表示されなくなった

次に着手したのは、必要な人にだけ情報が届くようにする作業だった。「そのグループのメンバーである人だけが、そのグループの情報を読める」という制限を追加した瞬間、グループ画面が誰もいないかのように空っぽになった。

これもデータベースに直接問い合わせて再現させると、「無限に循環している」という趣旨のエラーが返ってきた。原因は、「この人はメンバーかどうか」を判定するルールが、判定対象のテーブル自身をもう一度見に行く作りになっていたことだった。判定のために自分自身を見て、その判定のためにまた自分自身を見て、というループが終わらなくなっていた。判定処理だけを独立した部品として切り出し、そこを経由させる形に直したことで解決した。

追加や既読は届くのに、取り消しだけ届かない

一通り直り、動作確認も済ませたつもりだったが、後日「曲を送るのはすぐ届くのに、リアクションを取り消した時だけ反映されない」と指摘された。追加は即座に届くのに、消す操作だけ届かない。

調べていくと、行を削除する時にどの情報が一緒に送られるかという設定に行き着いた。通常、行が削除されると「消えた行の背番号」だけが記録され、それ以外の中身までは記録されない。ところが今回の「必要な人にだけ届ける」仕組みは、その中身(具体的にはどのグループに属する行か)を見て振り分けを行う作りだった。削除の時だけ、振り分けに必要な情報自体が最初から欠けていたので、届けようがなかったわけだ。削除時にも全項目を記録するよう設定を変えて解決した。

持ち帰ったこと