AWS上のカスタムクライアントでのMessage Busの使用について、少しお手伝いください :)

まず、Discourse の推奨設定は十分に理解していますが、現時点では私の制御外にあるのが実情です。

本題に入ります。私のクライアントは、Discourse をバックエンドとして使用するカスタム React フロントエンドを構築しました。私はプロジェクトを問題のある状態で引き継ぎ、以前の開発者が ActionCable を Discourse に無理やり組み込もうとしていたことがわかりました。Discourse にはすでにリアルタイム機能のために Message Bus が搭載されているため、それを使用すべきだと考えました。

ローカル環境では成功しました。Message Bus は「そのまま機能」し、Discourse のデフォルトの Message Bus チャンネルすべてにサブスクライブでき、さらに独自のチャンネルも作成できました。

問題が発生しているのはリモート環境です。AWS EC2 インスタンスにデプロイしており、ALB の背後にあり、環境構築は自社で行っています。Docker 方式を採用したかったのですが、クライアントはこのプロジェクトの段階で変更を行うための予算と時間を確保できなかったためです :sadpanda:

主な症状は、Message Bus がひどく遅延することです。リアルタイム性はほとんど感じられませんが、Message Bus の設定はローカルでは正常に動作しているため、設定に問題があるわけではありません。つまり、別の要因が原因であるはずです。

Discourse のデフォルト nginx 設定をほぼそのまま使用しています。当初はこれが問題だと考え、Message Bus 用の nginx 設定が不足していたため追加しましたが、それでも解決しませんでした。

Chrome のネットワークタブを確認したところ、明らかに問題があることがわかりました。/poll リクエストが 25 秒間待機し、その後数ミリ秒でコンテンツをダウンロードしているのです。ローカル環境や meta サイトで動作しているように、待機時間が短く、ダウンロード時間が長いはずなのに、その逆になっています。

これが AWS ALB の問題である可能性も認識していますが、どこから手をつけてよいか全く見当がつきません。@sam 氏に何か問題の原因がわかるか、あるいは方向性を示唆できるかお伺いしたいです。

いつもの通り、あらゆるご支援を心より感謝いたします!

メッセージバスがALBと連携して動作しており、実際にはMetaはAWS上でホストされています。

私の推測では、あなたのスタックのどこかでリクエストのバッファリングが有効になっており、それによってリクエストが長時間保持されている可能性があります。

最も可能性が高いのは、NGINXのproxy_bufferingoffではなくonに設定されていることです。

こんにちは @sam さん

ご提案ありがとうございます。ネットワークペインの問題が解決したようです。つまり、リクエストが完了すると、ダウンロード済みのコンテンツが 25 秒、待機時間が 35 ミリ秒として表示されるようになりました。

ただし、メッセージは受信された時点で即座に処理されると認識していました。しかし、私たちのアプリは、ポーリングが完了するまで受信したメッセージを処理しないようです。

ロングポーリングとチャンクエンコーディングは有効になっており、バックエンドとして Discourse を使用しているため、Discourse 側で何かを設定する必要はないと考えています。

ご意見をお聞かせください。よろしくお願いいたします。