ROR推送通知引擎

时间:2014-05-13 16:58:34

标签: ruby-on-rails rubygems push-notification apple-push-notifications android-notifications

我最近被分配了一个开发通知引擎的任务。对于通知,我们将使用推送通知。我正在为引擎寻找最佳解决方案,因为将来我们还必须将应用程序扩展到其他设备。以下是项目的一些细节

后端: 应用程序的后端在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或一般情况下还有其他好的解决方案吗? 一些设计模式?

3 个答案:

答案 0 :(得分:12)

我花了相当多的时间来研究基于Ruby的推送通知解决方案。最好的是RPush https://github.com/rpush/rpush。 RPush在这一点上经过了很好的测试(我们使用它来发送数百万个通知),并且很好地处理了许多困难的边缘情况。我不建议从头开始建立自己的,因为有太多潜在的陷阱和边缘情况。 RPush不支持Pebble或Web App通知,但可以进行扩展。

如果您决定探索其他替代方案,请确保:

  1. 为APNS正常处理已关闭的连接 - 在许多情况下,Apple可能会关闭与其服务器的连接,并且您的推送通知库必须正确处理此操作,否则数千个后续通知可能无法发送

  2. 与Apple的反馈服务进行通信 - Apple要求您轮询其中一个端点,以获取停止向其发送通知的设备列表。如果您没有这样做,您可以获得费率限制。

  3. 可以根据您的要求以足够快的速度发送通知。

  4. 在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后端的推送通知。

简而言之:

  1. 实施Device模型以及一些控制器操作,以在数据库中记录用户的设备令牌。
  2. 创建一个Notification模型,在文章中是Redis列表,但如果您不想使用Redis,也可以使用ActiveRecord。
  3. 创建一个主动运行传入通知并将其作为推送通知发送的后台工作程序。文章提到grocerGCM分别将它们发送到iOS和Android,但您也可以使用其他有用的宝石,例如rpushhouston等。
  4. 拥有单独的工作人员处理通知是一个好主意,因为您不希望持续打开和关闭与Apple和Google服务器的连接,并有可能获得locked out,因为它可能看起来像拒绝服务攻击(取决于通知的频率)。