两个及以上进程写入同一缓冲区时,消息发送顺序是否可以保证?
结论:无法保证先点击发送按钮的客户端优先完成消息发送
核心原因如下:
- 点击事件到发送逻辑的执行不存在时序绑定:同一设备上两个客户端的进程/线程调度由操作系统控制,点击时间先后不影响操作系统的调度优先级,完全可能出现先点击的客户端线程被后调度、后点击的客户端先执行发送检查逻辑的情况。
- 当前的等待机制无顺序保障:你用的是
休眠1毫秒后重试的轮询逻辑,当buffer可用通知发出时,两个等待的客户端会几乎同时唤醒重试,谁能先抢到发送权限完全取决于系统的瞬时调度顺序,和点击先后没有关联。 - 服务端无等待顺序记录机制:buffer可用通知是广播给所有等待客户端的,服务端没有记录客户端进入等待状态的先后顺序,自然不会按点击顺序分配发送资格。
如果要实现你需要的发送顺序保证,可以做两处调整:
- 客户端点击按钮后,先向服务端发送带精确时间戳的排队申请,服务端维护全局发送队列,按排队申请的先后排序。
- 取消1ms轮询的机制,改为服务端按队列顺序给对应客户端单独下发
available通知,仅收到专属通知的客户端可以执行发送操作。
内容的提问来源于stack exchange,提问作者Miguel Leitão
相关产品推荐
相关产品推荐

