Bis*_*ark 3 ruby-on-rails real-time observers server-sent-events
我想知道如何在我的网站上实时推送内容..我已经研究了一段时间,我意识到有很多方法可以完成这项工作.
首先考虑一些问题:我有一个带有一些社交功能的Rails 3应用程序.我想要实现的功能之一是在创建新活动时通知我的用户.我的第一种方法是实现SSE和一个控制器,在最后一次加载的活动之后在DB中搜索新的注册表.
这可以工作,但这需要太多的数据库查询,我只需要在创建新活动时将活动推送到所有活动用户(与该活动相关),而无需进行数据库查询.
我的第二种方法是创建一个指向控制器的路由,一个观察者捕获何时创建一个新活动,稍后将创建的当前活动传递给控制器,最后通过SSE渲染活动部分.
这是我的问题..如何将观察者与控制器连接并将其传递给要呈现的当前活动?在那里,我可以使用其他控制器类型,如金属控制器甚至抽象控制器类型?
在这一点上,我意识到这可能是另一种做这项工作的方法.如果我能找到一种方法来做到这一点而不必用另一种语言或框架开发它真的很好..我认为应该有一个宝石这可以让实时应用程序更容易..你怎么看?我是正确的方式或我应该做什么来实现这一目标?非常感谢!!
为了通过您的网站或网络应用程序安全可靠地向您的用户推送实时更新,正如您所说,有许多可用选项,并且还有许多细微差别需要考虑. 这有一颗宝石! 我将通过为您的Rails 3.0+应用程序和网站提供简单的入门指南来帮助您入门.首先,您需要运行gem install pubnub哪个是名为PubNub的实时组件,它允许您直接向目标用户或您网站和应用程序上的一组用户发送通知.这允许您仅定位那些在线并且有兴趣从您的Rails服务器接收通知的人.您可以将此视为高效的服务器发送事件,不需要在服务器上进行DB Lookup或其他资源密集型操作.
gem install pubnub
Run Code Online (Sandbox Code Playgroud)
require 'pubnub'
Run Code Online (Sandbox Code Playgroud)
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
)
Run Code Online (Sandbox Code Playgroud)
现在从你的Rails应用程序pubnub准备好类,你可以发送任何类型的JSON数据类型,包括字符串,数字,数组和字典/对象:
以下代码将向您显示将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 }
)
Run Code Online (Sandbox Code Playgroud)
此过程非常适用于性能和安全性考虑因素,从不需要数据库查询; 使您免于锤击数据库服务器和其他资源密集型操作.在Rails应用程序中使用PubNub GEM时,可以将此过程视为SSE(服务器发送事件).
使用PubNub GEM,您实际上是将服务器中的事件直接发送到用户的浏览器/应用程序.它消除了客户端定期AJAX请求的需要.这是因为您只在新信息可用时向您的用户发送数据.您还可以考虑使用更多PubNub实时网络功能,如Presence和Storage/Playback,访问主页以了解有关Ruby功能的更多详细信息.如果在集成到Rails代码期间需要,还可以使用Developers Dev Console进行调试.
接下来,您需要设置您的应用程序以通过运行init并传入来接收Server-Sent Events
<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>
Run Code Online (Sandbox Code Playgroud)
请注意,您可能对高级订阅连接选项和事件感兴趣.
注意"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服务器直接考虑到Native iOS应用程序和Native Android应用程序.如果您有任何问题,请在此论坛上与他们联系.
| 归档时间: |
|
| 查看次数: |
2737 次 |
| 最近记录: |