openresty的设计思路跟一般游戏服务器不一样,一般游戏服务器就是一个大while循环,所有socket收发都在一个线程里处理,所以任何深层逻辑代码,只要有对应的socket id,都可以直接给它发数据。
但是openresty的思路是每个连接一个线程跑自己的while循环(虽然只是lua协程,但是内部做了很多限制以避免当前连接的socket被其它连接的协程操作),连接只能被自己的线程处理,这对于http类的业务逻辑来说是合适的,但对于游戏这种client间交互频繁的逻辑是不合适的。
我之前的解决办法是:
每个连接在自己的while循环里,除监听socket事件之外,还监听redis上的一个list,用blpop取数据,然后发给自己的socket
也就是说每个连接要在redis上申请一个自己的list做为“信道”,当要给其它连接发数据时,发给它的信道,让那个连接在它自己的while循环里去读到,然后转发给它的socket
在 2015年1月8日星期四 UTC+8上午10:56:11,rong zeng写道:
各位,agentzh,大家好!
我们的最新游戏打算用 openresty 做服务器,使用 websocket 来通信。
我们现在碰到的问题是,如何向任意 websocket client 发消息?
一个具体的例子:
游戏中的聊天功能,玩家 A 直接选择玩家 B 私聊,这样在服务端,我就需要受到玩家 A 的消息后,找到玩家 B 的 websocket 对象,然后把玩家 A 的消息发给 TA。
我现在想到的方法,是利用 Redis 的 Pub/Sub 功能。对于聊天功能,所有的 client 都注册一个聊天 channel,世界聊天的时候直接广播,私聊的时候,每个client 在收到广播消息的时候判断是不是发给自己的,若是则向 websocket 客户端发布消息。
但我觉得这个方法挺蠢的。
请问,有没有更好的方法(或者思路)?
谢谢!