2009-08-24 6 views
4

私はErlangと彗星のチャットをしています。私は、メッセージの転送に1つの接続(長いポーリング)を使用します。しかし、あなたが知っているように、長いポーリング接続は常時接続し続けることはできません。新しいメッセージが到着するかタイムアウトに達するたびに、メッセージが途切れて再びサーバーに接続されます。接続が再接続される前にメッセージが送信された場合、チャットの整合性を保つことは問題です。Erlang(Cometチャット)のメッセージキューモデルですか?

また、ユーザーがComet-chatで複数のウィンドウを開くと、すべてのチャットメッセージが同期している必要があります。つまり、長いポーリング接続を多数持つことができます。したがって、すべてのメッセージを時間通りに配信することは困難です。

接続ごとにメッセージキューを作成する必要がありますか?またはこれを解決する他の良い方法は?

+0

多くのブラウザは、サーバーごとに最大2つの接続をアクティブにするように構成されています。これは、すべてのサブスクリプションが通過する1つの長いポーリング通信チャネルを持つのがよい理由です。 – Christian

答えて

1

私の場合、1人のプロセス/メッセージキューを1人のチャットに接続する(1つのチャットウィンドウを複数持つこともできます)のが最も簡単な方法です。チャットウィンドウアプリケーションの最後のメッセージのタイムスタンプを保持し、このタイムスタンプの後に再接続するとメッセージを要求します。メッセージキュープロセスは、妥当な期間だけメッセージを保持する必要があります。このシナリオでは、再接続はすべてクライアントに依存します。別のシナリオでは、サーバーからハートビートのいくつかの並べ替えを送信することができますが、それは私の信頼性が低いようです。切断の他の理由でタイムアウトよりも問題を解決していません。サーバー側のキューイングには、クライアントごと、ユーザーごと、チャットルームごとに1つのキューがあります。

+0

あなたの答えをありがとう。そして、この方法も今私が使っているものです。ちょっとした問題が1つしかありません。遅延メッセージは、次回のロングポーリング接続が確立された後(または新しい着信メッセージとともに)に送信されるため、わずかな遅延が発生します。 –

+0

また、ハートビートメッセージを使用して、切断を回避することもできますが、一貫性のためにメッセージに依存することはできません。 –

関連する問題