本文引用了45岁老架构师尼恩的技术分享,即时通讯网有修订和重新排版。
你说:“1 吃饭了吗?” 他回:“2 刚吃完。” 你又说:“3 吃啥呢?”
“3 吃啥呢?” → “1 吃饭了吗?” → “2 刚吃完。”
String sessionId = msg.getSessionId(); //这里是伪代码,实际代码以mq 的负载均衡机制为准 int nodeIndex = Math.abs(sessionId.hashCode()) % clusterNodeCount; //这里写个伪代码,代表mq 主从复制 ClusterNode targetNode = clusterNodes.get(nodeIndex); targetNode.sendMsg(msg);
long msgSeq = redis.incr("msg_seq_" + sessionId); msg.setSeq(msgSeq); msg.setUniqueKey(sessionId + "_" + msgSeq);
如果你的 Redis 是集群模式,记得确保同一个会话的 key 落在同一 slot,否则 INCR 可能跨节点失效。
//这里是伪代码, 先排序 List<Msg> sortedMsgs = msgList.stream() .sorted(Comparator.comparingLong(Msg::getSeq)) .collect(Collectors.toList()); //这里是伪代码, 再渲染 renderMsgList(sortedMsgs);
不要为“假需求”买单——我们不需要全局有序,只需要业务上有意义的有序。
不是技术做不到,而是要不要做。
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
一套纯血鸿蒙NEXT产品级IM系统。
详细介绍 / 产品截图 / 安装
引用:无论消息以什么顺序到达,统统按 seq 升序排列后再上屏。哪怕第100条先到,第1条后到,也能正确归位。这也是为什么我们强调“客户端必须信任服务端 SEQ”——它是唯一真相源。
引用:BanTanger 发表于 2026-02-06 15:56 站长,这里我有个疑问,若是某些消息在投递的时候有丢失,难道接收方要通过滑动窗口等待他重试抵达再展示 ...
引用:BanTanger 发表于 2026-02-06 16:27 还有一点想请教一下,如果采用 SEQ 局部序号,是否还需要 ServerID 全局序号呢,我看目前市面上开源的IM项 ...
精华主题数超过100个。
积极发起、参与各类话题的讨论等,主题、发帖内容较有价值。
连续任职达1年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2026 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.140625 second(s), 43 queries , Gzip On.