[英]How to optimize $interval for real time notifications in Angularjs?
[英]Rails - Sinatra real time notifications
我正在尝试构建一个实时通知模块,该模块的功能类似于Facebook的实时通知,例如,如果用户请求另一个用户的友谊,则将推送通知发送到第二个我受到以下约束的地方:1-通知是发送给特定用户的所有浏览器实例2-用户需要登录才能订阅通知3-由于性能问题不要使用池化4-显然需要安全
我进行了快速研究,发现我拥有的选项是Web套接字或服务器发送的事件。 服务器发送的事件可以自动重新连接,非常适合我需要的功能,因此我决定使用它。
我构建了一个sinatra事件驱动的服务器,在该服务器上,每当一个用户请求另一个用户的友谊时,通知都应该通过该服务器推送给第二个用户,但是似乎有一些问题使我的解决方案使我确信我走错了方向。
如何将事件源绑定到特定用户,同时维护安全性。 当且仅当用户登录时,才可以创建事件源的正确方法是什么?
我还需要一般有用的准则来解决此任务
通常,您不需要“完全实时”,可以使用setTimeout(simulate_realtime,5000); 每5秒检查一次服务器上是否有新数据。
您还可以检出将在Rails 5中使用的https://github.com/rails/actioncable ,该工具将于今年秋天发布。 您可以打赌,这是将添加到导轨中的下一个主要组件。
可能您需要eventmachine( https://github.com/eventmachine/eventmachine/tree/master/examples/guides/getting_started )。 看聊天例子
我与服务器一起发送了用于自动重新连接和使用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.