我最近被分配了一个开发通知引擎的任务。对于通知,我们将使用推送通知。我正在为引擎寻找最佳解决方案,因为将来我们还必须将应用程序扩展到其他设备。以下是项目的一些细节
后端: 应用程序的后端在Ruby on Rails中作为webservices开发
将推送通知的设备 iPhone,Android,Pebble(智能手表),Web应用程序
当前解决方案: 目前,我们正在考虑为通知制作后端数据库表。 Rails中的工作类将在1分钟后运行,它会将所有通知推送到存储在数据库中的设备。从webservice方法,我们将在通知表中插入数据。
对于推送通知,我们不想使用UrbanShip等服务。我们只会使用Ruby Gems来实现它们。目前,我们基于GCM gem进行了一个小型演示,用于Android推送识别。
问题:我对解决方案的态度是否正确?或者是否有更好的解决方案来解决这类问题。
修改
我认为我之前对此问题的描述有点令人困惑。
最终我们将使用Ruby中的GEMS发送推送通知。例如,对于iOS,我们将使用Houston或Grocer gem和Android GCM。
问题:我们需要一些数据库表来存储通知,以便GEMS(如上所述)可以使用它们向用户发送通知。现在,为了填充数据库表,我们需要在某处编写逻辑,以便我们可以在表中插入通知。
例如,假设当用户首次在应用程序中注册时,我们会向他发送通知。现在,为此,我们需要编写用于在Register函数中添加通知的代码。
像
public void Register()
{
//Registration logic
//Add a notification in the notification table
}
现在,这是一个问题,因为我们需要在需要发送通知的所有函数中添加通知逻辑。在ROR或一般情况下还有其他好的解决方案吗? 一些设计模式?
答案 0 :(得分:12)
我花了相当多的时间来研究基于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作业来处理邮件传递。尝试在Ruby on Rails应用程序中执行此操作是不切实际的。
RoR应用程序可以将行作为您描述的队列插入Notification表中。然后守护进程或cron作业可以从队列中获取通知并传递它们。
如果你使用RPush,这就是它遵循的模式。它附带了一个Gem,可以加载到Rails应用程序中,将通知插入到数据库队列中,以及一个在服务器上运行的守护程序,它定期检查要发送的新通知并传递排队的任何内容。
答案 1 :(得分:1)
我想知道这个问题是否仍然存在,或者您已经有了解决方案,但我想提出我最近发布的这个宝石:https://github.com/calonso/ruby-push-notifications
使用起来非常简单,足够灵活,适合您的架构和工作!
目前只是宝石本身,但我正在努力构建一个完整的Rails插件,包含所有表格结构和内容。您可以在此处查看正在进行的一些工作:https://github.com/calonso/rails-push-notifications
答案 2 :(得分:1)
这个article描述了一种非常简单但相当全面的方法来处理Rails后端的推送通知。
简而言之:
Device
模型以及一些控制器操作,以在数据库中记录用户的设备令牌。 Notification
模型,在文章中是Redis列表,但如果您不想使用Redis,也可以使用ActiveRecord。拥有单独的工作人员处理通知是一个好主意,因为您不希望持续打开和关闭与Apple和Google服务器的连接,并有可能获得locked out,因为它可能看起来像拒绝服务攻击(取决于通知的频率)。