我正在尝试构建一个实时通知模块,其功能与Facebook的实时通知类似,例如,如果用户请求另一个用户的友情,则推送通知被发送到第二个,其中我有以下约束: 1-通知将发送到特定用户的所有浏览器实例 2-用户需要登录才能订阅他的通知 3-由于性能问题,不要使用池 4-显然需要安全
我做了一个快速的研究,我发现我的选项是网络套接字或服务器发送的事件。服务器发送的事件处理自动重新连接,非常适合我需要的功能,所以我决定使用它。
我构建了一个sinatra事件驱动的服务器,每当用户请求另一个用户的友情时,通知应该通过它推送给第二个用户,但似乎有几个问题我的解决方案让我确信我要进入错误的方向。
如何将事件源绑定到特定用户,同时保持安全性。当且仅当用户登录时,我可以创建事件源的正确方法是什么。
我还需要一般有用的指导来解决这个问题
答案 0 :(得分:0)
通常你不需要“完全实时”,你可以使用setTimeout(simulate_realtime,5000);检查服务器上是否每5秒钟有新数据。
您还可以签出将在Rails 5中的https://github.com/rails/actioncable,这将在今年秋季发布稳定版。你可以赌它,它是下一个将被添加到rails的主要组件。
答案 1 :(得分:0)
可能你需要eventmachine(https://github.com/eventmachine/eventmachine/tree/master/examples/guides/getting_started)。看看聊天示例
答案 2 :(得分:0)
我使用服务器发送的事件进行自动重新连接以及使用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通知服务器发送一个发布请求以及密钥,用户ID,时间的散列函数。 Sinatra服务器重新计算哈希,以保证它已通过我们的源发送。然后,Sinatra服务器将通知推送到通过事件源监听的通知参数的“to”字段中与用户ID关联的所有连接。
使用eventsource.onmessage
我会更改DOM以显示收到的通知。
现在它正在发挥作用。