如何在 Rails 中触发实时客户端更新
Posted
技术标签:
【中文标题】如何在 Rails 中触发实时客户端更新【英文标题】:How do I trigger a real time client update in Rails 【发布时间】:2013-05-13 08:02:05 【问题描述】:我正在使用 Rails 创建一个在线多人棋盘游戏,我希望无需手动刷新页面即可玩该游戏。我打算使用 websockets 或服务器发送事件来更新页面。我还没有决定哪一个,但我不认为它会对我的问题产生影响。
我感到困惑的是知道何时向客户端发送更新。例如,假设我正在下国际象棋,玩家 1 转了一圈。他们会将他们的移动发送到服务器,然后服务器会将其保存到数据库中。 player2 的 websocket 或 SSE 如何知道将有关 player1 移动的信息推送到 player2 的浏览器?
我知道他们可以定期查询数据库以查看游戏是否已更新,但这似乎很难扩展,因为每个用户都会经常查询数据库。
有没有一种简单的方法可以等待数据库更新并以某种方式自动收到通知?还是有其他解决方案?
我在网上找了很多解决方案,但还没有真正得到任何具体的想法。只要它是免费的,我绝对愿意使用图书馆或其他任何东西来解决问题。我见过一些付费解决方案,但这些都不是一种选择。
我还看到有人建议以某种方式使用 node.js 和 rails 来实时做一些事情。我对 node.js 了解不多,但我听说它对这样的异步功能很有用。如果它比任何 Rails 解决方案都好,我有兴趣学习如何使用它。
我使用的是 Rails 3.2,但如果 Rails 4 有一些在这里可以很好用的东西,我可能也会对此感兴趣。
【问题讨论】:
【参考方案1】:按照 nik 的建议,如果您是 ruby 开发人员,请使用 FAYE Ruby Server。
就事物如何结合在一起而言:
-
每场比赛都是一个频道
每个玩家都订阅了这个频道
当玩家移动时,移动被发送到服务器
服务器将针对游戏的移动保存在数据库中
服务器向频道发送消息。
两位玩家的 ui 都更新了新招式。
此设置可让您轻松重玩整个游戏或从上次中断的地方继续。只需从 db 获取所有动作并将它们发送到新频道即可。这可能性能不佳,但应该可以。
【讨论】:
FAYE 似乎可以使用长轮询或服务器发送事件。是否可以将它与 2 路通信(例如 websockets)一起使用?因此,不是为每个动作单独发出 http 请求,而是让您使用相同的 websocket 提交所有动作? 我的意思是使用同一个 websocket 来提交你所有的动作并从游戏频道接收更新 是的,客户端连接到FAYE服务器,既可以向服务器发送消息,也可以从服务器订阅(接收)事件。 所以 faye 将是一个单独的服务器,而不是我的 rails 服务器,对吧?我需要该服务器的单独网址吗?就像我在 mychesssite.com 上运行我的服务器一样,faye 必须不是 mychesssite.com 吗? 我只想指出,如果您打算用 javascript 编写大部分游戏,那么也许 rails 不是最好的堆栈(Rails 4 中的 LiveController 比 Faye 更复杂) , 顺便提一句)。如果 websocket 太大,你可以让你的 js 每隔一两秒检查一次玩家/棋盘的变化。这不是最佳实践,但它可能是一个更熟悉的领域,直到您可以实现适当的 websocket(例如,纯粹依靠 cancan 和设计 + setTimeout)。【参考方案2】:你也可以使用FAYE,它有Ruby Server和Node.js服务器,你可以选择一个
【讨论】:
以上是关于如何在 Rails 中触发实时客户端更新的主要内容,如果未能解决你的问题,请参考以下文章
在rails 6中使用jquery进行用户名和电子邮件实时验证