假設我們有幾個客戶端使用Channel API連接到App Engine。每個客戶端都會發送消息,這些消息應根據某些規則傳播給其他客戶端。棘手的部分是客戶端可能不是同一個App Engine實例。跨App Engine實例推送數據
有什麼辦法來推數據從一個實例到其他?
(是的,我知道的Memcache,但這將需要某種輪詢。)
假設我們有幾個客戶端使用Channel API連接到App Engine。每個客戶端都會發送消息,這些消息應根據某些規則傳播給其他客戶端。棘手的部分是客戶端可能不是同一個App Engine實例。跨App Engine實例推送數據
有什麼辦法來推數據從一個實例到其他?
(是的,我知道的Memcache,但這將需要某種輪詢。)
你在這裏問兩個問題。
a。你可以在不使用輪詢的情況下將數據從一個實例推送到另一個實例。答案一般不是。
b。一個客戶端可以將消息發送到可以傳播到其他客戶端的服務器嗎?是的,並且這不需要將消息傳播到其他服務器端實例。
將Channel API看作一項服務。客戶端連接到Channel API服務;他們沒有連接到任何特定的實例。因此任何實例都可以向任何客戶端發送消息。
如果目標客戶端列表非常大,則可能需要執行操作可以運行時間更長的任務隊列中的步驟3/4。
不要緊,什麼實例的客戶端連接,這是從你被API隱藏。
客戶端只能通過標準HTTP命令「回覆」消息,他們實際上並沒有任何方式直接通過通道API進行響應。
因此,服務器A1上的客戶端A想要向服務器B1上的客戶端B發送消息。
客戶端A發佈到處理程序。這可能是實例A1或B1。無論服務器客戶端B通過Channel API連接到服務器,服務器現在將消息傳遞給客戶端B都無關緊要。
真實的一點是,根本沒有App Engine實例具有任何數據。因此,連接到哪個實例並不重要,它可能是第99個實例或第一個啓動實例。所以你必須設計你的應用程序,以便它與正在使用的實例無關。
客戶端通過HTTP向服務器發送消息。
服務器通過通道API向N個客戶端發送消息。
通道API不會建立固定的前端 - 實例 - 客戶端連接。如果前端實例知道通道ID,則可以將消息推送到通道。
你需要做的是傳遞消息的跨渠道。
謝謝!你的答案是唯一一個考慮廣播行爲的人(加上我低估了Channel API)。你有經驗在真實生活中做這個嗎?您提出可能存在性能問題,這會導致多少客戶端可以最多延遲幾秒的時間交付?你知道ChannelService.sendMessage是否同步運行嗎? – 2013-02-21 22:54:08
該消息是異步發送的。但是,AFAIK沒有批處理,GAE RPC調用都需要一些有限的時間,所以您需要多次循環並調用sendMessage。如果您要發送的號碼很大,則可能需要離線進行。我會做一些真正的性能測試,看看它是否真的有必要。 – dragonx 2013-02-21 23:09:46