【问题标题】:ROR Push Notification EngineROR 推送通知引擎
【发布时间】:2014-05-13 16:58:33
【问题描述】:

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

后端: 该应用程序的后端是在 Ruby on Rails 中作为 Web 服务开发的

具有推送通知的设备 iPhone、Android、Pebble(智能手表)、Web 应用程序

当前解决方案: 目前,我们正在考虑为通知制作一个后端数据库表。 Rails 中的工人类将在 1 分钟后运行,并将所有通知推送到存储在数据库中的设备。从 webservice 方法中,我们将数据插入到通知表中。

对于推送通知,我们不想使用 UrbanShip 之类的服务。我们只会使用 Ruby Gems 来实现它们。目前,我们做了一个基于 GCM gem 的 Android 推送通知小演示。

问题:我的解决方法是否正确?或者这种问题有没有更好的解决方案。

编辑:

我认为我之前对问题的描述有点混乱。

最终我们将在 Ruby 中使用 GEMS 来发送推送通知。例如,对于 iOS,我们将使用 Houston 或 Grocer gem,对于 Android GCM。

问题:我们需要一些用于存储通知的数据库表,以便 GEMS(如上所述)可以使用它们将通知发送给用户。现在,要填充数据库表,我们需要在某处编写逻辑,以便我们可以在表中插入通知。

例如,假设当用户首次在应用程序中注册时,我们会向他发送通知。现在,要做到这一点,我们需要编写用于在注册函数中添加通知的代码。

喜欢

public void Register()
{
   //Registration logic

   //Add a notification in the notification table
}

现在,这是一个问题,因为我们需要在所有需要发送通知的函数中添加通知逻辑。 ROR 或一般情况下还有其他好的解决方案吗? 一些设计模式?

【问题讨论】:

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


    【解决方案1】:

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

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

    1. 为 APNS 妥善处理已关闭的连接 - 在许多情况下,Apple 可能会关闭与其服务器的连接,您的推送通知库必须正确处理此问题,否则数以千计的后续通知可能无法传递

    2. 与 Apple 的反馈服务通信 - Apple 要求您轮询其端点之一以获取停止向其发送通知的设备列表。如果您不这样做,您可能会受到速率限制。

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

    在 Ruby 之外,最好的推送通知库似乎是 PushSharp (C#) 和 Node-Apn(仅限 NodeJS,iOS)

    最后,听起来您有特定的需求需要您自己做这件事。但对于其他人,我强烈建议您使用 3rd 方服务。可靠地大量发送推送通知是困难的,并且有许多第三方服务可以以低成本为您完成。例如,UrbanAirship、Parse 和 OneSignal(我的服务)都是很棒的第三方解决方案。

    更新以解决修改后的问题:

    最好的设计模式是拥有第二个守护进程或 Cron Job 来处理消息传递。尝试在 Ruby on Rails 应用程序中执行此操作是不切实际的。

    RoR 应用程序可以像您描述的那样将行作为队列插入到通知表中。然后守护进程或 cron 作业可以从队列中获取通知并传递它们。

    如果您使用 RPush,这就是它遵循的模式。它带有一个 Gem 可以加载到您的 Rails 应用程序中,将通知插入数据库队列,以及一个您在服务器上持续运行的守护程序,它会定期检查要发送的新通知并传递任何排队的通知。

    【讨论】:

    • 我认为我的问题有点令人困惑。我已经更新了我的问题。
    • @Gdeglin 我可以将推送通知发送到我的 android 设备,但我的 onNotification 事件不会触发,除非应用程序在前台。我读到设置参数 content-available = 1 应该会触发 onNotification 事件,即使应用程序处于后台或单击通知时也是如此。我该怎么做?
    【解决方案2】:

    我想知道这个问题是否仍然悬而未决,或者您已经有了解决方案,但我想提出我最近发布的这个 gem:https://github.com/calonso/ruby-push-notifications

    它使用起来非常简单,足够灵活,可以适应您的架构和工作!

    目前只是 gem 本身,但我正在围绕它构建一个完整的 Rails 插件,其中包含所有表结构和内容。你可以在这里看到一些正在进行的工作:https://github.com/calonso/rails-push-notifications

    【讨论】:

      【解决方案3】:

      article 描述了一种在 Rails 后端处理推送通知的非常简单但相当全面的方法。

      简而言之:

      1. 实现Device 模型以及一些控制器操作,以在您的数据库中记录用户的设备令牌。
      2. 创建一个Notification 模型,在文章中它是一个 Redis 列表,但如果您不想使用 Redis,也可以使用 ActiveRecord。
      3. 创建一个后台工作程序,该工作程序正在主动运行传入通知并将它们作为推送通知发送。文章提到grocerGCM分别发送到iOS和Android,但你也可以使用其他有用的gem,如rpushhouston等。

      让一个单独的工作人员处理通知是个好主意,因为您不希望不断打开和关闭与 Apple 和 Google 的服务器的连接而冒着获得locked out 的风险,因为这可能看起来像是拒绝服务攻击(取决于您的通知频率)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        相关资源
        最近更新 更多