gpt4 book ai didi

ruby - 与 ruby​​ 的实时通信

转载 作者:数据小太阳 更新时间:2023-10-29 08:50:53 24 4
gpt4 key购买 nike

我正准备用 ruby​​ 编写一个游戏服务器。该游戏的一项功能包括玩家四处走动,其他人应该能够看到它。

我已经使用事件机编写了一个纯套接字演示。但由于大部分通信都将基于 http,所以我正在寻找一些 http 轮询解决方案。当然,我可以用事件机器来编写它,但是是否已经有适合这种工作的 gem 了?

我试过类似 faye 的东西,但其中大部分是针对消息系统的,比如订阅和发布到一个 channel ,我似乎无法控制我应该推送给哪些客户端。在我的例子中,我需要能够推送给特定的客户,比如一个人从 10,10 移动到 20,20,只有他周围的人(也许从 0,0 到 30,30,但不是 40,50 的人) 需要接收消息。

------------有抽筋的前兆

这是一个快速更新。我正在抽筋,有 5000 个连接,每秒移动 100 个客户端,CPU 使用率几乎是 100%。当我将两个数字都翻倍时,CPU 使用率仍然是 100% 左右,响应非常慢。

很明显,我并没有使用我拥有的所有资源,而是只有一个 CPU 核心被占用。需要更多的工作。

------------轮到 Node.js 了

@aam1r实际上 Node.js 比抽筋做得更好。 5000 个连接和 100 个客户端移动 seoncd,Cpu 使用率超过 60%。当我加倍到每秒 10000 个连接和 200 个客户端移动时,CPU 使用率为 100%,响应变得缓慢。同样的问题,cramp 或 Node.js 每个进程只能使用一个 cpu 核心。那是个问题。

------------JRuby呢?

因为 GIL 的存在,Ruby MRI 没有真正的多线程同时执行。 Node.js 也没有。所以我要试试 JRuby。

  • 当客户端移动时,使用另一个线程找到所有其他需要通知的客户端(这是一项 CPU 繁重的工作)。然后将结果推送到一个 channel 。

  • 主线程只是订阅 channel 。当它得到结果时,将它们推送给客户端。

虽然需要一些时间来编写演示。

最佳答案

我建议使用 Espresso与服务器发送的事件。

在服务器端定义一个流操作:

class App < E
map :/

attr_reader :connections

def subscribe
@connections ||= []
stream :keep_open do |conn|
connections << conn
conn.callback { connections.delete conn }
end
end

private
def communicate_to_clients
connections.each do |conn|
conn << 'some message'
end
end

:keep_open 选项将指示服务器不要关闭连接。

然后用 Javascript 打开一个连接:

pool = new EventSource('/subscribe');
pool.on_message = function(msg) {
// here you receive messages sent by server
// via communicate_to_clients method
}

关于ruby - 与 ruby​​ 的实时通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com