最近,我被分配了开发通知引擎的任务。对于通知,我们将使用推送通知。我正在寻找引擎的最佳解决方案,因为将来我们还必须将应用程序扩展到其他设备。以下是该项目的一些细节
后端:
该应用程序的后端是在Ruby on Rails中作为Web服务开发的
具有推送通知的设备
iPhone,Android,Pebble(智能手表),Web应用程序
当前解决方案:
当前,我们正在考虑为通知创建后端数据库表。 Rails中的worker类将在1分钟后运行,并将所有通知推送到存储在数据库中的设备。通过webservice方法,我们会将数据插入通知表中。
为了推送通知,我们不想使用UrbanShip之类的服务。我们将仅使用Ruby Gems实现它们。当前,我们针对Android推送通知制作了一个基于GCM gem的小型演示。
问题:我的解决方法正确吗?还是有更好的解决方案来解决此类问题。
编辑:
我认为我以前对该问题的描述有些混乱。
最终,我们将在Ruby中使用GEMS发送推送通知。例如,对于iOS,我们将使用Houston或Grocer gem,对于Android GCM。
问题:我们需要一些数据库表来存储通知,以便GEMS(上述)可以使用它们将通知发送给用户。现在,要填充数据库表,我们需要在某处编写逻辑,以便可以在表中插入通知。
例如,假设用户首次在应用程序中注册时,我们会向他发送通知。现在,要做到这一点,我们需要编写代码以在Register函数中添加通知。
喜欢
public void Register()
{
//Registration logic
//Add a notification in the notification table
}
现在,这是一个问题,因为我们需要在所有需要发送通知的功能中添加通知逻辑。在ROR或总体上还有其他好的解决方案吗?
一些设计模式?
最佳答案
我花了很多时间研究基于Ruby的推送通知解决方案。最好的是RPush https://github.com/rpush/rpush。 RPush在这一点上已经过了很好的测试(我们使用它来发送数百万条通知),并且很好地处理了许多困难情况。我不建议您从头开始构建自己的应用程序,因为存在许多潜在的陷阱和边缘情况。 RPush不支持Pebble或Web App通知,但可以扩展为支持。
如果您决定探索其他替代方法,请确保它们:
优雅地为APNS处理关闭的连接-在许多情况下,Apple可能会关闭与其服务器的连接,并且您的推送通知库必须正确处理此问题,否则成千上万的后续通知可能无法传递
与Apple的反馈服务进行通信-Apple要求您轮询其端点之一以获取停止向其发送通知的设备列表。如果您不这样做,您将获得限速。
可以按照您的要求足够快的速度发送通知。
在Ruby之外,最好的推送通知库似乎是PushSharp(C#)和Node-Apn(仅NodeJS,仅iOS)
最后,听起来您有特定的需求,需要您自己执行此操作。但对于其他人,我强烈建议您使用第三方服务。可靠地发送大量推送通知非常困难,并且有许多第三方服务可以低成本为您完成推送通知。例如,UrbanAirship,Parse和OneSignal(我的服务)都是出色的第三方解决方案。
更新以解决修订后的问题:
最好的设计模式是拥有第二个守护进程或Cron Job来处理消息传递。尝试在Ruby on Rails应用程序中执行此操作是不切实际的。
RoR应用程序可以像您描述的那样将行作为队列插入Notification表中。然后,守护进程或cron作业可以从队列中获取通知并传递通知。
如果使用RPush,则遵循以下模式。它既包含要加载到将通知插入数据库队列的Rails应用程序中的Gem,又包含您一直在服务器上运行的守护程序,该守护程序会定期检查是否有新通知要发送并传递排队的通知。