私信系统设计

私信系统设计

整体设计

分两种类型的表

  • 联系人表
  • 私信消息表

通过长连接或者 push 消息推送实现实时聊天

表结构设计[分库分表]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
DROP TABLE IF EXISTS `contact_%v`;
CREATE TABLE `contact_%v` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id,主键',
`owner_id` bigint(20) unsigned NOT NULL COMMENT '私信发送者',
`peer_id` bigint(20) unsigned NOT NULL COMMENT '私信接收者',
`peer_type` tinyint(4) NOT NULL COMMENT '联系人类型:0普通/100系统/101群',
`peer_ack` tinyint(4) NOT NULL COMMENT 'peer是否给owner发过消息:0未发过/1发过',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '联系人状态:0正常/1代表被删除; 默认值为0',
`last_msg_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '最新一次发送的私信id,默认值为0',
`last_del_msg_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '最后一次删除联系人时的私信id,默认值为0',
`version_id` bigint(20) unsigned NOT NULL COMMENT '版本号',
`sort_key` bigint(20) unsigned NOT NULL COMMENT '排序字段',
`labels` varchar(512) DEFAULT NULL COMMENT '标签,json串',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_owner_id_peer_id` (`owner_id`,`peer_id`),
KEY `idx_owner_id_version_id` (`owner_id`,`version_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

DROP TABLE IF EXISTS `message_%v`;
CREATE TABLE `message_%v` (
`msg_id` bigint(20) unsigned NOT NULL COMMENT '私信id',
`session_id` varchar(128) NOT NULL COMMENT '会话id,生成规则:uid小的在前大的在后用冒号连接;群消息和系统消息时为0:群号',
`send_id` bigint(20) unsigned NOT NULL COMMENT '私信发送者id',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '私信状态:0正常/1代表被审核删除/2代表撤销; 默认值为0',
`has_read` tinyint(4) NOT NULL DEFAULT '0' COMMENT '私信接收者消息已读/未读状态:0未读/1已读; 默认值为0',
`seq_id` bigint(20) unsigned NOT NULL COMMENT '客户端本地私信序列id',
`version_id` bigint(20) unsigned NOT NULL COMMENT '版本号',
`sort_key` bigint(20) unsigned NOT NULL COMMENT '排序字段',
`msg_type` tinyint(4) NOT NULL COMMENT '私信类型',
`content` varchar(2048) NOT NULL COMMENT '私信内容',
`invisible_list` varchar(2048) DEFAULT NULL COMMENT '此msg对哪些用户不可见',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`msg_id`),
KEY `idx_session_id_msg_id` (`session_id`, `version_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

缓存设计

详细设计

  1. 发送,写联系人表,写消息表
  2. 拉取联系人,拉取消息
  3. 删除私信【自己不可见】 撤销私信【全部不可见】
  4. 置顶会话 排序为设为最大
  5. 清空未读
    6. 发系统私信

 问题

系统消息怎么处理?