2017-08-24 98 views
1

假設我有一個聊天應用程序,並且我正在給另一個用戶(用戶B)發送消息,我們的消息通常使用套接字接收,但是當用戶B下線時,他與套接字服務器斷開連接,但用戶A繼續發送文本他讓我的服務器向用戶B的設備發送用戶A發送的每條消息的推送通知。我的問題是,APNS將充當消息代理並將所有消息排隊,直到用戶B重新登錄並接收它們?還是我必須存儲在別處Apple推送通知可以用作消息隊列嗎?

回答

3

答案在Apple's documentation

蘋果推送通知服務容易發現包括服務質量(QoS)的組件,其執行一個存儲和轉發功能未被接收的消息。如果APN嘗試發送通知並且目標設備處於脫機狀態,則APN將在一段有限的時間內存儲通知,並在設備再次可用時發送通知。此組件僅存儲每個設備和每個應用的最新通知。如果設備處於脫機狀態,則發送針對該設備的通知請求會導致先前的請求被丟棄。如果設備長時間處於脫機狀態,則其在APN中存儲的所有通知都將被丟棄。

所以,不,你不能使用APN作爲消息代理。

您可以使用推送通知作爲信號來喚醒並與服務器端消息隊列同步。 RabbitMQ或Kafka可能是候選經紀人,MQTT看起來很有希望成爲協議。您將需要計算如何以及何時丟棄未成功傳送到設備的消息隊列的內容。

+0

在RabbitMq中存儲未接收到的消息是一種比將它們放入數據庫然後在用戶重新登錄時選擇它們更好的方法? –

+0

@RyanMurphy:取決於規模。使用數據庫的方法比消息隊列難以縮放。消息隊列傾向於具有定義好的關於「消費」消息的語義 - 如果向服務器發送請求(隨後從數據庫獲取消息),如果移動設備沒有收到回覆,會發生什麼情況?您需要建立某種確認,確認設備在移除它們之前實際得到了它們。實質上,你正在從數據庫中構建一個併發的MSG Q,而實際上並不那麼容易。 – marko