繁体   English   中英

Rails-Sinatra实时通知

[英]Rails - Sinatra real time notifications

我正在尝试构建一个实时通知模块,该模块的功能类似于Facebook的实时通知,例如,如果用户请求另一个用户的友谊,则将推送通知发送到第二个我受到以下约束的地方:1-通知是发送给特定用户的所有浏览器实例2-用户需要登录才能订阅通知3-由于性能问题不要使用池化4-显然需要安全

我进行了快速研究,发现我拥有的选项是Web套接字或服务器发送的事件。 服务器发送的事件可以自动重新连接,非常适合我需要的功能,因此我决定使用它。

我构建了一个sinatra事件驱动的服务器,在该服务器上,每当一个用户请求另一个用户的友谊时,通知都应该通过该服务器推送给第二个用户,但是似乎有一些问题使我的解决方案使我确信我走错了方向。

如何将事件源绑定到特定用户,同时维护安全性。 当且仅当用户登录时,才可以创建事件源的正确方法是什么?

我还需要一般有用的准则来解决此任务

通常,您不需要“完全实时”,可以使用setTimeout(simulate_realtime,5000); 每5秒检查一次服务器上是否有新数据。

您还可以检出将在Rails 5中使用的https://github.com/rails/actioncable ,该工具将于今年秋天发布。 您可以打赌,这是将添加到导轨中的下一个主要组件。

我与服务器一起发送了用于自动重新连接和使用http的事件,并且没有特殊协议。 此外,我认为我真的不需要双向全双工连接,因为这毕竟不是聊天应用程序,所以我做了以下工作:

sinatra服务器侦听连接,并将接收到的特定连接与建立该连接的用户的ID相关联,因此我可以根据用户ID聚合连接,然后打开一些我试图处理的漏洞,稍后再讨论。

get '/connect/:user_id', provides: 'text/event-stream' do
    headers 'Access-Control-Allow-Origin' => "#{domainname.whatever.com}"
    stream :keep_open do |connection|
        connections << {'connection': connection, 'user_id': params[:user_id]}
        connection.callback {
            connections.select {|out| out[:connection]==connection} do |e| connections.delete e end 
        }
    end 
end

当触发通知的事件发生时,在执行事件逻辑之后,我将发布请求以及私钥,用户标识,时间的哈希函数发送到Sinatra通知服务器。 Sinatra服务器将重新计算哈希值,以确保它已通过我们的源发送。 然后,Sinatra服务器将通知推送到与通过事件源进行侦听的通知参数的“ to”字段中与用户ID关联的所有连接。

使用eventsource.onmessage进行DOM更改以显示收到的通知。

现在它正在很大地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM