3

我想知道如何在我的网站中实时推送内容。我研究了一段时间,我意识到有很多方法可以完成这项工作。

首先要考虑一些事项:我有一个带有一些社交功能的 Rails 3 应用程序。我想要实现的功能之一是在创建新活动时通知我的用户。我的第一种方法是实现SSE和一个控制器,该控制器在上次加载活动后在数据库中搜索新注册表。

这可以工作,但是当我需要在创建新活动时将活动推送给所有活动用户(与该活动相关)时,这需要太多数据库查询,而无需进行数据库查询。

我的第二种方法是创建一个指向控制器的路由和一个观察者,以便在创建新活动时捕获,然后将创建的当前活动传递给控制器​​,最后通过 SSE 呈现活动部分。

我的问题来了..如何将观察者与控制器连接起来并将当前要渲染的活动传递给它?在那里,我可以使用另一种控制器类型,例如金属控制器甚至抽象控制器吗?

在这一点上,我意识到这可能是完成这项工作的另一种方法。如果我能找到一种方法来做到这一点而不必用另一种语言或框架开发它,那就太好了。我认为这应该有一个宝石这可以更轻松地完成实时应用程序.. 你觉得呢?我走在正确的道路上,或者我应该做些什么来实现这一目标?非常感谢!!

4

2 回答 2

5

Rails 3.0+ 使用 PubNub 实时推送内容

正如您所说,为了在您的网站或 Web 应用程序上使用某些社交功能安全可靠地向您的用户推送实时更新,有许多可用选项和许多细微差别也需要考虑。 这有一个宝石! 我将通过在此处为您的 Rails 3.0+ 应用程序和网站提供简单的入门指南来帮助您入门。首先,您需要运行gem install pubnub称为 PubNub 的实时组件,它允许您直接向目标用户或网站和应用程序上的一组用户发送通知。这允许您只针对那些在线并有兴趣从您的 Rails 服务器接收通知的人。您可以将其视为高效的服务器发送事件,不需要在您的服务器上进行数据库查找或其他资源密集型操作。

Ruby GEM 安装

gem install pubnub

需要 PubNub GEM

require 'pubnub'

初始化 PubNub 类

pubnub = Pubnub.new(
    :publish_key   => 'demo', # publish_key only required if publishing.
    :subscribe_key => 'demo', # required always
    :secret_key    => nil,    # optional - message signing
    :cipher_key    => nil,    # optional - AES 256 Crypto
    :ssl           => true    # optional - SSL 2048bit
)

从 Rails 3.0+ 向 Web 应用程序发送消息

现在从准备好类的 Rails 应用程序中pubnub,您可以发送任何类型的 JSON 数据类型,包括字符串、数字、数组和字典/对象:

  • 一个“字符串”
  • 123 号
  • 一个数组 [ 1, 2, 3 ]
  • 一个对象 { :a => "苹果" }

以下代码将向您展示将消息从 Rails 应用程序直接传递到用户正在运行的浏览器或 Web 应用程序的过程。当您需要直接从服务器发送数据时,本质上就是将数据发送给您的用户。该pubnub.publish(...)函数会将您发送的消息序列化为 JSON,以便传输到您的移动和 Web 应用程序。

## Broadcast or Unicast to Browser App User(s)
pubnub.publish(
    :channel  => "event_feed_channel",
    :message  => { :event => "update", :from => "Jay", :feed => "New Updates!" },
    :callback => lambda { |info| puts info }
)

此过程非常适合性能和安全考虑,并且从不需要数据库查询;使您免于对数据库服务器和其他资源密集型操作进行重击。当您在 Rails 应用程序中使用 PubNub GEM 时, 您可以将此过程视为SSE(服务器发送事件) 。

使用 PubNub GEM,您实际上是将事件从服务器直接发送到用户的浏览器/应用程序。它消除了对客户端定期 AJAX 请求的需要。这是因为您仅在有新信息可用时才向用户发送数据。您还可以考虑使用更多 PubNub 实时网络功能,例如 Presence 和 Storage/Playback,方法是访问主页以了解有关 Ruby 功能的更多详细信息。如果需要,还可以在集成到 Rails 代码期间使用 Developers Dev Console进行调试。

设置浏览器以接收服务器发送的事件

接下来,您需要通过运行 init 并传入

<script src=http://cdn.pubnub.com/pubnub-3.4.2.min.js ></script>
<script>(function(){

    // Class Setup
    var pubnub = PUBNUB.init({ subscribe_key : 'demo' });

    // Event Hook Setup
    pubnub.subscribe({
        channel : "event_feed_channel",
        message : function(m){ pubnub.events.fire( m.event, m ) }
    });

    // RECEIVE the "update" Server Broadcast Event in the Browser
    pubnub.events.bind( "update", function(message) {
        console.log( "update a <div> with received event: ", m );
    } );

})();</script>

请注意,您可能对高级订阅连接选项和事件感兴趣。

注意"update"事件与ruby​​ 代码:event => "update"中的消息值是如何相同的。这意味着该事件将根据您提供的名称触发,您需要绑定该事件以触发代码以在您的 Web App 页面上执行。在此触发事件中,您将使用用户希望在其屏幕上实时看到的任何相关详细信息来更新用户界面。

还要注意:channel => "event_feed_channel"publish通道,它必须与subscribeJavaScript 客户端代码中的通道相同。

如果您想阅读 Ruby GEM 的源代码,可以通过GitHub PubNub 基于 Ruby 的 API获得。

这些是开始使用 Ruby 3.0+ 应用程序并将事件直接从服务器发送到最终用户的基础知识。请注意,这也适用于在 iOS Web 浏览器或 Android 浏览器上运行的移动应用程序。此机制还支持旧版本的 IE。此外,您可以选择考虑将服务器从 Rails 服务器直接发送到原生 iOS 应用程序和原生 Android 应用程序的事件。如果您有任何问题,请在此论坛上向他们提问。

于 2013-03-15T19:16:02.403 回答
0

我已经构建了一个实时 Rails gem和一个示例实时服务器 (node.js),它可以轻松实现实时消息传递,而无需付费的第三方,例如 Pusher 或 PubNub。它适用于 Rails 3+。

于 2014-07-23T02:56:48.120 回答