Rails - Sinatra 实时通知
Rails - Sinatra real time notifications
我正在尝试构建一个实时通知模块,其功能与 facebook 的实时通知类似,例如,如果用户请求与另一个用户建立友谊,则会向第二个用户发送推送通知,我有以下限制:
1-通知发送到特定用户的所有浏览器实例
2-用户需要登录才能订阅他的通知
3- 由于性能问题不使用池化
4- 它显然需要安全
我进行了快速研究,发现我的选项是网络套接字或服务器发送的事件。服务器发送的事件会自动处理重新连接并且非常适合我需要的功能,所以我决定使用它。
我构建了一个 sinatra 事件驱动的服务器,每当一个用户请求另一个用户的友谊时,通知应该通过它推送给第二个用户,但似乎有几个问题,我的解决方案让我相信我要去方向错误。
如何将事件源绑定到特定用户并同时维护安全性。当且仅当用户登录时我可以创建事件源的正确方法是什么。
我还需要通用的有用指南来解决此任务
通常不需要"exactly real time",可以使用setTimeout(simulate_realtime, 5000);每 5 秒检查一次服务器上是否有新数据。
您还可以查看 https://github.com/rails/actioncable 将在 Rails 5 中,它将在今年秋天发布稳定版。你可以打赌,它是下一个将添加到 rails.
的主要组件
可能您需要 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 通知服务器发送一个 post 请求以及密钥、用户 ID、时间的哈希函数。 Sinatra 服务器重新计算哈希以保证它已通过我们的来源发送。然后,Sinatra 服务器将通知推送到与通知参数的 "to" 字段中的用户 ID 关联的所有连接,这些连接正在通过事件源侦听。
使用 eventsource.onmessage
我做了 DOM 更改以显示收到的通知。
现在效果很好。
我正在尝试构建一个实时通知模块,其功能与 facebook 的实时通知类似,例如,如果用户请求与另一个用户建立友谊,则会向第二个用户发送推送通知,我有以下限制: 1-通知发送到特定用户的所有浏览器实例 2-用户需要登录才能订阅他的通知 3- 由于性能问题不使用池化 4- 它显然需要安全
我进行了快速研究,发现我的选项是网络套接字或服务器发送的事件。服务器发送的事件会自动处理重新连接并且非常适合我需要的功能,所以我决定使用它。
我构建了一个 sinatra 事件驱动的服务器,每当一个用户请求另一个用户的友谊时,通知应该通过它推送给第二个用户,但似乎有几个问题,我的解决方案让我相信我要去方向错误。
如何将事件源绑定到特定用户并同时维护安全性。当且仅当用户登录时我可以创建事件源的正确方法是什么。
我还需要通用的有用指南来解决此任务
通常不需要"exactly real time",可以使用setTimeout(simulate_realtime, 5000);每 5 秒检查一次服务器上是否有新数据。
您还可以查看 https://github.com/rails/actioncable 将在 Rails 5 中,它将在今年秋天发布稳定版。你可以打赌,它是下一个将添加到 rails.
的主要组件可能您需要 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 通知服务器发送一个 post 请求以及密钥、用户 ID、时间的哈希函数。 Sinatra 服务器重新计算哈希以保证它已通过我们的来源发送。然后,Sinatra 服务器将通知推送到与通知参数的 "to" 字段中的用户 ID 关联的所有连接,这些连接正在通过事件源侦听。
使用 eventsource.onmessage
我做了 DOM 更改以显示收到的通知。
现在效果很好。