Gateway/Workman模式下的消息"插队"情况

wytj0304

我使用Gateway/worker模式搭建了一个应用.其中gatway->count=4,worker->count=1.在实际使用中发现,在极少的情况下会发生消息(message)插队的情况.即clientA发送给服务器数据123456789,同时clientB发送给服务器987654321.但是服务器收到的数据是123459876543216789,即clientB的数据包插入在clientA数据包内.导致解析出错.
请问下此情况是不是跟gateway非阻塞模式有关?
如果我将gateway->count调整至1是不是可以解决这个问题?
另外,如果gateway非阻塞模型在多进程高并发数据通讯的情况下会有消息插队问题,怎样才能有一个相对完备的方案?
谢谢!

4694 8 0
8个回答

wytj0304

gateway使用的tcp协议,socket数据"粘包"我已经通过程序处理,但是这种插队问题感觉无法通过程序代码解决

  • 暂无评论
walkor

不会出现插队
gateway不能用tcp,使用现有协议或者参考手册写一个协议,否则会粘包,导致数据连在一起

  • 暂无评论
wytj0304

我在event.php中的onMessage函数里面每个$message记录了下来,之前所说的数据包"插队"问题的场景是这样的:
有两个客户端同时向服务器不停的发送数据,架设两个客户端在一段时间内都向服务器发送了3个数据包.在一些情况下客户端A会将数据以2.5+0.5的方式发送,即$message中现接受到A的2.5个数据包,然后接收0.5个剩余数据包.但同时客户端B向服务器连续发送了3个数据包(按照1+1+1)方式.
最终在onMessage函数里面每个$message的顺序为: 2.5(A) 1(B) 1(B) 1(B) 0.5(A).就是我说的插队现象.

  • 暂无评论
wytj0304

原先我在每个数据包头中增加了长度来处理粘包问题.现在想来那只是针对单个sock_id才有用,对于现在多个客户端同时推送服务器信息的情景.可能需要对每个sock_id设置独立的缓冲区.
假如我按照你的建议写一个协议,是否可以解决我说的问题?

  • 暂无评论
wytj0304

补充一下,不知道我表达的是否明确
架设网关收到的数据包顺序: 2.5(A) 1(B) 1(B) 1(B) 0.5(A)
使用多连接共用缓冲区在解析第三个数据报文时,会将A客户端的0.5个报文合并到B客户端报文上,导致整体出错.
使用自定义协议的话,能否避免这个问题?

  • 暂无评论
walkor

去参考手册搞个协议就好了
或者直接用workerman的Text协议
协议格式为 数据包+换行符

  • 暂无评论
wytj0304

问题已经解决,重新写了一个协议.
原来对gateway/worker的运行方式理解有误导致,多谢指导哈

  • 暂无评论
walkor

不客气

  • 暂无评论
年代过于久远,无法发表回答
🔝