我即将用 ruby 编写一个游戏服务器。游戏的一项功能包括玩家四处走动,其他人应该能够看到它。
我已经使用事件机编写了一个纯套接字演示。但由于大部分通信都是基于 http 的,所以我正在寻找一些 http 轮询解决方案。当然,我可以用事件机器编写它,但是已经有适合这种工作的宝石了吗?
我尝试过类似 faye 的东西,但其中大部分是用于消息传递系统的,比如订阅和发布到频道,我似乎无法控制我应该推送到哪些客户端。就我而言,我需要能够推动特定客户,例如一个人从 10,10 移动到 20,20,只有他周围的人(可能从 0,0 到 30,30,但不是 40,50 的人) 需要接收消息。
------------ 抽筋前兆
这是一个快速更新。我正在处理抽筋问题,有 5000 个连接,每秒有 100 个客户端移动,CPU 使用率几乎是 100%。当我把这两个数字翻倍时,CPU使用率仍然是100%左右,响应很慢。
显然,我并没有使用我拥有的所有资源,而是只占用了一个 CPU 内核。需要更多的工作。
------------轮到Node.js
@aam1r 实际上 Node.js 比 cramp 做得更好。每秒有 5000 个连接和 100 个客户端移动,CPU 使用率超过 60%。当我翻倍到每秒 10000 个连接和 200 个客户端移动时,CPU 使用率为 100%,响应变慢。同样的问题,无论是 cramp 还是 Node.js,每个进程只能使用一个 cpu 核心。那是个问题。
------------JRuby呢?
由于GIL的存在,Ruby MRI 没有真正的多线程同时执行。Node.js 也没有。所以我要试试 JRuby。
当客户端移动时,使用另一个线程查找所有其他需要通知的客户端(这是一项 CPU 繁重的工作)。然后将结果推送到通道。
主线程只是订阅频道。当它得到结果时,将它们推送给客户。
不过需要一些时间来编写演示。