本文由“yuanrw”分享,职业:Java工程师,博客:juejin.im/user/5cefab8451882510eb758606,即时通讯网收录时内容有改动和修订。
message ChatMsg{ id = 1; //消息id fromId = Alice //发送者userId destId = Bob //接收者userId msgBody = hello //消息体 }
1.png (13.66 KB, 下载次数: 5092)
下载附件 保存到相册
5 年前 上传
message AckMsg { id; //消息id fromId; //发送者id destId; //接收者id msgType; //消息类型 ackMsgId; //确认的消息id } enum MsgType { DELIVERED; READ; }
message AckMsg { id = 2; fromId = Alice; destId = Bob; msgType = SENT; ackMsgId = 1; }
2.png (15.86 KB, 下载次数: 5475)
message AckMsg { id = 3; fromId = Bob; destId = Alice; msgType = DELIVERED; ackMsgId = 1; }
3.png (16.71 KB, 下载次数: 5104)
message AckMsg { id = 4; fromId = Bob; destId = Alice; msgType = READ; ackMsgId = 1; }
4.png (18.15 KB, 下载次数: 5117)
5.png (15.35 KB, 下载次数: 5239)
public interface UserStatusService { /** * 用户上线,存储userId与机器id的关系 * * @param userId * @param connectorId * @return 如果当前用户在线,则返回他连接的机器id,否则返回null */ String online(String userId, String connectorId); /** * 用户下线 * * @param userId */ void offline(String userId); /** * 通过用户id查找他当前连接的机器id * * @param userId * @return */ String getConnectorId(String userId); }
6.png (12.1 KB, 下载次数: 5151)
7.png (35.75 KB, 下载次数: 5145)
8.png (26.42 KB, 下载次数: 5144)
1.png (26.42 KB, 下载次数: 5205)
2.png (8.78 KB, 下载次数: 5077)
3.png (5.01 KB, 下载次数: 5137)
4.png (14.54 KB, 下载次数: 5251)
class ProcessMsgNode{ /** * 接收到的消息 */ private Message message; /** * 处理消息的方法 */ private Consumer<Message> consumer; } public CompletableFuture<Void> offer(Long id,Message message,Consumer<Message> consumer) { if (isRepeat(id)) { //消息重复 sendAck(id); return null; } if (!isConsist(id)) { //消息不连续 notConsistMsgMap.put(id, new ProcessMsgNode(message, consumer)); return null; } //处理消息 return process(id, message, consumer); } private CompletableFuture<Void> process(Long id, Message message, Consumer<Message> consumer) { return CompletableFuture .runAsync(() -> consumer.accept(message)) .thenAccept(v -> sendAck(id)) .thenAccept(v -> lastId.set(id)) .thenComposeAsync(v -> { Long nextId = nextId(id); if (notConsistMsgMap.containsKey(nextId)) { //队列中有下个消息 ProcessMsgNode node = notConsistMsgMap.get(nextId); return process(nextId, node.getMessage(), consumer); } else { //队列中没有下个消息 CompletableFuture<Void> future = new CompletableFuture<>(); future.complete(null); return future; } }) .exceptionally(e -> { logger.error("[process received msg] has error", e); return null; }); }
CREATE TABLE `im_relation` ( `id` bigint(20) COMMENT '关系id', `user_id1` varchar(100) COMMENT '用户1id', `user_id2` varchar(100) COMMENT '用户2id', `encrypt_key` char(33) COMMENT 'aes密钥', `gmt_create` timestamp DEFAULT CURRENT_TIMESTAMP, `gmt_update` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `USERID1_USERID2` (`user_id1`,`user_id2`) );
5.png (13.87 KB, 下载次数: 5274)
CREATE TABLE `im_offline` ( `id` int(11) COMMENT '主键', `msg_id` bigint(20) COMMENT '消息id', `msg_type` int(2) COMMENT '消息类型', `content` varbinary(5000) COMMENT '消息内容', `to_user_id` varchar(100) COMMENT '收件人id', `has_read` tinyint(1) COMMENT '是否阅读', `gmt_create` timestamp COMMENT '创建时间', PRIMARY KEY (`id`) );
update im_offline set has_read = true where id = ${msg_id} and has_read = false
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:JackJiang 发表于 2021-09-26 21:43 这也是为什么说多数人写的im集群是个假集群,道理就是这样的。看起来可以多实例部署了,但多实例之间的传 ...
引用:qingyun 发表于 2021-09-26 19:49 个人感觉transfer就是一个败笔,使用结点互联更好。理由:如果有n个connector,并且每台connector所连接的 ...
引用:JackJiang 发表于 2021-09-03 11:06 乱序这个问题,在服务端高并发的前提下,是很难在服务端避免的,只能客户端辅助处理,没有百分百顺序的方 ...
引用:椎锋陷陈 发表于 2021-09-03 10:54 使用lastId来保证消息不重复、不乱序这种方式可行吗? 一种情况是消息乱序到达时,后面的多个消息都必须等 ...
引用:椎锋陷陈 发表于 2021-09-03 10:50 可靠性-不丢消息那里,ACK确认不应该是发生在发送方和接收方之间的吧?应该是由服务端来充当二者的中间角色 ...
引用:椎锋陷陈 发表于 2021-09-03 10:29 ACK的含义应该是确认字符吧,作用是表示发来的数据已确认接收无误。 使用场景应该是在Server确认接收到消 ...
引用:a835029688 发表于 2021-06-10 15:29 真的是超级厉害!~
引用:wisdom_t5L00 发表于 2021-04-25 16:02 github上的代码,我跑起来了,然后看了下client和connector的代码。发现作者对消息可靠性这一块没有实现, ...
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.250009 second(s), 48 queries , Gzip On.