2

サーバー側イベントのサポートを CppCMS に追加する予定です。通信レベルで何をすべきかの技術的な部分を理解しています。クライアントは長いポーリング XmlHTTPRequest を送信し、応答を待ちます。サーバーは接続を受け入れ、サーバー側のイベントが発生してクライアントに応答を送信するまで応答しません。クライアントは手順を繰り返します。

ただし、これはほとんどの Web 開発者にとって「低すぎる」レベルです。イベントの管理方法、接続の管理方法など、多くの質問があります。

私は2つの可能なモデルについて考えました:

  1. 定義されたいくつかの名前付きイベントとサーバー側があります。たとえば、「チャット ルーム 134 番の新しいメッセージ」です。リクエストが受け入れられると、サーバー側アプリケーションはルーム (DB など) 内のメッセージをチェックし、クライアントへの新しいメッセージがない場合は、イベントにサブスクライブして待機します。

    他のクライアントがサーバーにデータを投稿すると、「チャット ルーム 134 番の新しいメッセージ」イベントですべてのアプリケーションに通知し、それらが起動してこれらのメッセージをクライアントに送信します。

    このモデルは依然として「低レベル」モデルのように見えますが、すべての通知メソッドが隠されています。

  2. もう 1 つのオプションは、いくつかの名前付きキューを定義することです。これにより、各クライアントはサーバーへの接続時にそのようなキューを作成し、新しいメッセージを待ちます。あるクライアントが「Chat Room no 134」に新しいメッセージを投稿すると、サーバー側では、この「Chat Room no 134」に接続されているすべてのキューにメッセージがブロードキャストされ、メッセージがクライアントに配信されます。

    しかし、次のような多くの疑問が生じます。

    • 単一ページのレベルでキューとセッション レベルを管理するにはどうすればよいですか?
    • キューを削除してタイムアウトを作成するにはどうすればよいですか?
    • 複数の「ウィンドウ」が同じキューにサブスクライブするとどうなりますか?
  3. サーバー側のイベントとユーザー側のイベントを結び付ける永続オブジェクトをサーバー側に作成します。リダイレクトされた個別の XHR リクエストを介して通信する場合があります。

    そのため、クライアント (JavaScript) はイベントを登録し、ページが再構築されるまで、XHR およびサーバー側でディスパッチされたイベント通知でイベントを待機します。

では、サーバー側のプッシュ テクノロジの背後にある最も一般的で推奨される API モデルは何ですか?

ありがとう

編集:3番目のオプションを追加

4

3 に答える 3

3

XMPPを介した一般的なパブリッシュ/サブスクライブ プロトコルを定義するXMPP PubSubを確認してください。BOSH と呼ばれる XMPP 拡張もあります(下位レベルのプロトコルの詳細はXEP-0124で個別に文書化されています)。これは、HTTP クライアントがロングポーリング (つまり、comet) を使用して XMPP サーバーにバインドできるようにするメカニズムを定義します。これら 2 つの仕様を組み合わせることで、comet を使用した Web アプリの堅牢なイベント サブスクリプション モデルが得られます。最終的に XMPP/BOSH を使用しない場合でも、仕様には、この種のシステムを構築する方法に関する貴重な洞察が含まれています。

XMPP と BOSH を使用することになった場合に役立つツールをいくつか紹介します。

  • StropheJS : BOSH を話すクライアント側 XMPP クライアントを作成するためのライブラリ。
  • Idavoll : XMPP サーバー用の一般的なパブリッシュ/サブスクライブ サービス コンポーネント。
  • Punjab : BOSH HTTP クライアントと XMPP サーバーの間で一種の「変換プロキシ」として機能する BOSH 接続マネージャー。

確かに、これは非常に重いソリューションであり、特定のアプリケーションには適していない可能性がありますが、これらの標準には多くの考慮が払われているため、役立つ場合があります。

于 2009-08-11T23:39:51.377 に答える
3

Bayeuxを試してみてください。最初のモデルと非常によく似ています。クライアントはチャネル「chatroom/new-message/134」にサブスクライブします。新しいメッセージがある場合、サーバーはサブスクライバーにブロードキャストします。

ワイルドカード チャネル名を使用して、複数のルーム「chatroom/new-message/*」をサブスクライブできます (末尾のみ)。

于 2009-08-10T14:45:29.470 に答える
0

すべてのアプリケーションに適合する一般的なソリューションはありません。一般的なパターンについて知りたい場合は、Event-Driven Architectures をご覧ください。

私が一度参加したプレゼンテーションのスライドがオンラインにいくつかあります(これはトピックの非常に高度なビューです)。

于 2009-08-10T15:44:46.770 に答える