我看有的系统设计成
三张表:用户表 users 、消息表 messages 、消息接收者中间表 message_receive 。
中间表字段:message_id/userid/read_status 。
给他们定义了多对多关联,message_receive 为中间表。
各位大神请问这种 消息 /站内消息模块 如何设计比较好?
![]() | 1 scung 2023-04-15 19:49:55 +08:00 个人愚见,中间表可以加上创建时间和用户阅读时间。 在消息产生时,系统可以争对当前在线用户进行推送,这时候只需要插入在线用户数量的中间表数据。 消息表可以设计一个字段表示离线用户是否需要推送,这样离线用户和新注册用户在他们登录后,进行消息的拉取,这时候根据该字段再创建中间表数据,然后根据创建的数据数量来进行推送(比如上线后收到一条推送,内容:有 5 条新消息未查看) |
2 wangxiaoaer 2023-04-15 20:21:36 +08:00 简单点就是生产者消费者模式。 以向 1W 用户群发一条消息为例:生产服务(进程)负责写入 1w 条记录,每条记录初始标记为未发送,可以间隔进行。消费服务(进程)负责读取未发送的记录,间隔发送、提醒。 |
![]() | 3 RedBeanIce 2023-04-15 20:29:54 +08:00 消息写一条,那么无法对于吗每一条消息,做每个人的定制化操作。 消息写多条,那么存储量太大。 这是他们两个方案各自的缺点,我不知道有什么更好的答案,等楼下。 |
![]() | 4 RedBeanIce 2023-04-15 20:30:24 +08:00 请忽略我的上述回答。。。我回复错了。 |
5 night98 2023-04-15 23:36:55 +08:00 可以看一下阿里之前直播时候写的技术文档,最终他们是采用了读写混合模式,具体的技术细节可以去看文档,和你这个场景比较类似,不过他们是做的直播间评论的功能 |
![]() | 6 FrankFang128 2023-04-16 03:45:39 +08:00 支持群发怎么样 |
![]() | 7 sadfQED2 2023-04-16 08:27:53 +08:00 via Android 群发消息只写一条数据,然后客户端拉取 单发消息服务端推送。 当然,你这边用户量少,随便怎么搞都行 |
8 fackVL 2023-04-16 09:27:42 +08:00 via iPhone 如果是我:消息模板表,单独消息表(带阅读状态,推送通知状态),群发消息表(全员推送通知状态,新用户只有未读不推送,新用户是否可见),群发消息阅读状态表(谁阅读了 insert 一条)。剩下的 mq 、缓存啥的还有业务逻辑不用说了吧。 |