2017-08-24 131 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