2009-08-02 71 views
2

我很想將服務器端事件的支持添加到CppCMS。我瞭解在通信級別上做什麼的技術部分:客戶端發送長輪詢XmlHTTPRequest並等待響應, 服務器接受連接,並在服務器端事件發生之前不響應,並向客戶端發送 響應。客戶端重複該過程。服務器推送技術(COMET)的API模型

但是,這對大多數Web開發人員來說太「低」了。有很多問題:我如何管理事件,如何管理連接等等。

我想到了兩個可能的模式:

  1. 有 例如定義了一些命名事件和服務器端,「在聊天室沒有134新信息」; 當請求接受服務器端應用程序檢查房間中的消息 (例如在數據庫中)並且如果客戶端沒有新消息 它訂閱事件並在其上等待。

    當一些其他的客戶端數據發佈到服務器,它會通知上 的「聊天室新郵件沒有134」事件中的所有應用程序,他們醒來,發送這些消息 給客戶,等等。

    該模型仍然看起來很「低級」模型,但它隱藏了所有的 通知方法。

  2. 另一個選擇是定義一些命名隊列,因此每個客戶端在連接到服務器時創建這樣的隊列,並等待新消息。當某些客戶端 向「聊天室號134」發佈新消息時,在服務器端向連接到該「聊天室號134」的所有隊列廣播 ,並將該消息發送給客戶端 。

    但也有被上升許多問題:

    • 如何管理隊列和會話水平,單頁的水平?
    • 如何刪除隊列並在其上創建超時?
    • 如果多於一個「窗口」訂閱相同的隊列會發生什麼?
  3. 在服務器端創建一個持久對象,該對象在服務器端事件 和用戶端事件之間進行粘合。它可以通過重定向到的 不同的XHR請求進行通信。

    因此客戶端(JavaScript)註冊事件並使用XHR 和服務器端分派的事件通知等待它們,直到頁面重建。

所以,我想知道,什麼是最流行的,並建議背後的服務器端推送技術 API模式?

感謝

編輯:增加了第三個選項

回答

3

您應該查看XMPP PubSub,它定義了XMPP上的通用發佈/訂閱協議。還有一個XMPP extension called BOSH(在XEP-0124中分別記錄了較低級別的協議詳細信息),它定義了一種允許HTTP客戶端使用長輪詢(即彗星)綁定到XMPP服務器的機制。結合這兩個規範爲您提供了一個強大的使用彗星的web應用的事件訂閱模型。即使你最終沒有使用XMPP/BOSH,規範也包含了一些關於如何構建這種系統的寶貴見解。

如果你最終使用XMPP和BOSH這裏有一些工具可能對你有用:

  • StropheJS:一種用於編寫說話BOSH客戶端XMPP客戶端庫。
  • Idavoll:XMPP服務器的通用發佈 - 訂閱服務組件。
  • Punjab:一個BOSH連接管理器,充當BOSH HTTP客戶端和您的XMPP服務器之間的一種「翻譯代理」。

無可否認,這是一個非常重量級的解決方案,它可能不適合您的特定應用,但是很多思想都被納入了這些標準,因此它們可能會有所幫助。

3

嘗試Bayeux,這是非常非常喜歡你的第一款車型。客戶端訂閱頻道「聊天室/新消息/ 134」。如果有新的消息,服務器將向訂戶廣播。

可以使用通配符頻道名稱即可訂閱多個房間「聊天室/新信息/ *」(僅落後)

+0

如果是這樣,它會更類似於第二個... – Artyom 2009-08-11 04:13:42

0

有適合所有的應用程序沒有通用的解決方案。如果您想了解一些常規模式,請參閱事件驅動架構

有一次slides線上從我參加過一次演示(這是一個相當高層次的話題)。