2013-02-21 63 views
2

假設我們有幾個客戶端使用Channel API連接到App Engine。每個客戶端都會發送消息,這些消息應根據某些規則傳播給其他客戶端。棘手的部分是客戶端可能不是同一個App Engine實例。跨App Engine實例推送數據

有什麼辦法來數據從一個實例到其他?

(是的,我知道的Memcache,但這將需要某種輪詢。)

回答

3

你在這裏問兩個問題。

a。你可以在不使用輪詢的情況下將數據從一個實例推送到另一個實例。答案一般不是。

b。一個客戶端可以將消息發送到可以傳播到其他客戶端的服務器嗎?是的,並且這不需要將消息傳播到其他服務器端實例。

將Channel API看作一項服務。客戶端連接到Channel API服務;他們沒有連接到任何特定的實例。因此任何實例都可以向任何客戶端發送消息。

  1. 您需要將客戶端的通道令牌存儲在數據存儲區中,以某種方式進行查詢以符合您的規則。
  2. 您的客戶端發出一個HTTP請求,將消息發送到您的服務器。
  3. 服務器上的處理程序查詢它需要將消息傳播到(從memcache或數據存儲)的通道標記。
  4. 服務器上的處理程序將消息發送給所有客戶端。

如果目標客戶端列表非常大,則可能需要執行操作可以運行時間更長的任務隊列中的步驟3/4。

+0

謝謝!你的答案是唯一一個考慮廣播行爲的人(加上我低估了Channel API)。你有經驗在真實生活中做這個嗎?您提出可能存在性能問題,這會導致多少客戶端可以最多延遲幾秒的時間交付?你知道ChannelService.sendMessage是否同步運行嗎? – 2013-02-21 22:54:08

+0

該消息是異步發送的。但是,AFAIK沒有批處理,GAE RPC調用都需要一些有限的時間,所以您需要多次循環並調用sendMessage。如果您要發送的號碼很大,則可能需要離線進行。我會做一些真正的性能測試,看看它是否真的有必要。 – dragonx 2013-02-21 23:09:46

0

不要緊,什麼實例的客戶端連接,這是從你被API隱藏。

客戶端只能通過標準HTTP命令「回覆」消息,他們實際上並沒有任何方式直接通過通道API進行響應。

因此,服務器A1上的客戶端A想要向服務器B1上的客戶端B發送消息。

客戶端A發佈到處理程序。這可能是實例A1或B1。無論服務器客戶端B通過Channel API連接到服務器,服務器現在將消息傳遞給客戶端B都無關緊要。

真實的一點是,根本沒有App Engine實例具有任何數據。因此,連接到哪個實例並不重要,它可能是第99個實例或第一個啓動實例。所以你必須設計你的應用程序,以便它與正在使用的實例無關。

  1. 客戶端通過HTTP向服務器發送消息。

  2. 服務器通過通道API向N個客戶端發送消息。

0

通道API不會建立固定的前端 - 實例 - 客戶端連接。如果前端實例知道通道ID,則可以將消息推送到通道。

你需要做的是傳遞消息的跨渠道。

  1. 用戶一個常發送消息給服務器(例如,經由GET)
  2. 服務器查找第二用戶的信道ID並且推動在其他方向上的消息
  3. 重複過程:第二用戶的第一用戶。
相關問題