2016-04-02 3 views
1

チャットアプリケーションを実装するためにejabberdオープンソースサーバーを使用しました。メッセージの配信と受信に成功しましたが、配信確認と読み取り確認が失われることがあります。ejabberdはオフラインチャットをスプールテーブルに保存する方法

接続クローズ・セッション・スタンザがクライアントによってejabberdサーバーに送信された場合、さらなるメッセージが確実にスプール・テーブルに保管されていることを確認してください。クライアント・ネットワークに問題があり、クライアントがサーバーにクローズ・セッション・スタンザを送信せずに切断されたというシナリオを考えてみましょう。サーバーはクライアントがまだオンラインで、スプールテーブルにメッセージを格納していないとみなします。

しかし、クライアントがオンラインになると、すべての保留中のメッセージがクライアントに送信されます(スプールに加えて、サーバーがクライアントをオンラインにしていると思われるメッセージもあります)。

ejabberdはスプールテーブルではなくオフラインメッセージをどこに保存しますか?

答えて

3

セッションを適切に閉じないと、サーバーのカーネルTCP/IP構成によっては、サーバーが接続を検出する意志を失っている可能性があります。その場合、ejabberdはTCP接続が有効ではないことを通知されず、そのTCP接続でメッセージを送信します。サーバーはTCPスタックにそれらをバッファします。 ejabberdの観点からは、これらのメッセージは送信されているため、オフラインストレージに格納する必要はありません。 ejabberdは、特定のユーザーに対してセッションが開かれていないときにオフライン記憶域にメッセージを格納しますが、その場合はオープンセッションが存在します。

ejabberdコミュニティバージョンのメッセージに高いレベルの信頼性を追加するには、確認応答と場合によってはpingを実装する必要があります。 XEP-0198: Stream Managementを実装し、おそらくサーバからXMPP Pingを有効にして接続損失を検出することができます。

+0

ストリームが予期せず閉じられ、再開されなかった(タイムアウトが発生した)場合を考えてみましょう。いつか新しい接続が行われた後、サーバーに格納されているデータをバッファリングすることがあります。クライアントに転送されるか、これを克服するためにいくつかのejabberdモジュールを実装する必要がありますか? –

+0

ストリームの管理/ pingがメッセージの信頼性に使用されていた場合、セッションが終了すると、メッセージはオフラインストレージに保存されます。 –

+0

ストリーム管理の再開に最適なタイムアウト値は何ですか?現在は120秒を維持していますが、一部のスタンザはクライアントで失われています。 ejabberdログでは、9つのスタンザ(例のような)がクライアントによって確認応答されなかったことが表示されます。 24 * 60 * 60に増やすべきですか? –