2012-02-10 7 views
1

私たちはCometD 2を使用して、中央データプロバイダとデータを消費するいくつかのバックエンド間の接続を実現しています。今まで、バックエンドの1つが短時間失敗すると、その間に投稿されたすべてのメッセージは失われています。 CometDの「拡張機能の確認」について聞きました。サーバー側のメッセージリストを作成し、クライアントのうちの1人がオンラインに戻ったと報告するとメッセージを配信します。いくつかの質問があります:Jetty/ASP.NETでCometDの肯定応答拡張機能を実装する

1)これは複数のクライアントでも機能しますか?

2)文書は(http://cometd.org/documentation/2.x/cometd-ext/ack)言う:切断ブラウザがmaxInterval(デフォルトの10秒を超えるために切断された場合「)ことに注意してください、クライアントはタイムアウトし、未確認のキューは破棄されます。 - >これは、クライアントがmaxInterval内に復元しない場合でも、メッセージが失われることを意味しますか?

したがって、 2.1)maxIntervalはどれくらいですか?どのような結果をそれを高い価値に設定する必要がありますか?

2.2)少なくとも数分のフェールアウトのための安全なメカニズムが必要です。これは可能ですか?選択肢はありますか?

3)実際にクライアントとcometDサーバーの両方で2つの拡張を追加するだけでよいですか?私たちはサーバー用にJettyを、クライアント用に.NET Oyatelを使用しています。誰かがこれにいくつかの経験を持っていますか?

このような質問のおかげで申し訳ありませんが、残念ながら、CometDプロジェクトは実際にはよく文書化されていません。私は本当にすべての答えに感謝します。

乾杯、 クリス

答えて

1

1)これは、いくつかのクライアント

で動作しますはい、それはありません。クライアントごとに1つのメッセージキューが割り当てられます(AcknowledgedMessagesClientExtensionを参照)。

2)これは、クライアントがmaxInterval内で復元しない場合でも、メッセージが失われることを意味しますか?

はい、あります。クライアントがmaxIntervalミリ秒間サーバーに到達できない場合、サーバーはそのクライアントに関連付けられているすべての状態を破棄します。

2.1)maxIntervalはどれくらいですか?どのような結果をそれを高い価値に設定する必要がありますか?

maxIntervalは、Cometd servletのサーブレットパラメータです。これは内部的に長い値として扱われるため、その最大値はLong.MAX_VALUEです。

設定例:

<init-param> 
    <!-- The max period of time, in milliseconds, that the server will wait for 
     a new long poll from a client before that client is considered invalid 
     and is removed --> 
    <param-name>maxInterval</param-name> 
    <param-value>10000</param-value> 
</init-param> 

高い値に設定するには、サーバーが(クライアントがサーバとの接触を停止した時点から)クライアントに関連付けられている状態を捨てる前に長く待つことを意味します。

これには2つの問題があります。第1に、サーバのメモリ要件が潜在的に高くなります(サービスの拒否も簡単になる可能性があります)。次に、maxIntervalが期限切れになる前にRemoveListenerがサーバー上で呼び出されないため、「一時的に到達できない」と「切断された」とを区別する追加のロジックを実装する必要が生じる場合があります。

2.2)少なくとも数分のフェイル・アウトに対して安全なメカニズムが必要です。これは可能ですか?選択肢はありますか?

はい、maxIntervalを数分間設定することは可能です。

代わりに、すべてのハンドシェイクでサーバー側の状態を復元することもできます。これは、 "/ meta/handshake"にリスナーを追加し、 "/ service /"チャネルにメッセージを公開する(サーバーだけがメッセージを受け取るようにする)か、または "ext"ハンドシェイクメッセージのプロパティ。クライアントに有効な状態のみを復元させるように注意してください(必要な場合はサーバーに署名してください)。

3)本当にクライアントとcometDサーバーの両方で2つの拡張を追加するだけでよいですか?私はあなたがOyatelでそれを行うだろうか分からない

bayeux.addExtension(new AcknowledgedMessagesExtension()); 

:サーバー上

のような何かをするのに十分です。 Javascriptでは、simply include the extension(dojo.requireまたはjQueryのスクリプトが含まれています)で十分です。 AckExtensionとクライアントがサーバーに接続すると

、次のようなメッセージは、(私の桟橋コンソールログから)記録されます。

[qtp959713667-32] INFO org.cometd.server.ext.AcknowledgedMessagesExtension - Enabled message acknowledgement for client 51vkuhps5qgsuaxhehzfg6yw92 

別のノートでは、それは明らかではないかもしれませんので、 :ack拡張機能は、サーバーからクライアントへの配信ではなく、サーバーへの配信保証のみを提供します。つまり、クライアントからサーバーにメッセージをパブリッシュすると、サーバーに到達せずに失われてしまうことがあります。

メッセージがサーバーに送信されると、ack拡張機能はその時点で接続されているすべての受信者が確実にメッセージを受信するようにします(maxIntervalミリ秒で到達できない場合)。

「/ meta/unsuccessful」の通知をリッスンしてメッセージを再送信すると、クライアント側で再試行するのは比較的簡単です(元のメッセージはmessage.requestとしてハンドラに渡されます)。

関連する問題