请教关于站内信的实现

2019-12-23 08:54:52 +08:00
 yumc

大家接触过的产品中都是如何实现站内信呢? 我首先想到的是根据接收方的唯一标识放在消息队列,阅读后持久化到数据库

2878 次点击
所在节点    问与答
9 条回复
taotaodaddy
2019-12-23 08:59:59 +08:00
同想知道主流实现方案是什么
b821025551b
2019-12-23 09:02:42 +08:00
这么做数据量岂不是一条消息就*用户数了。把用户分组,一组一个消息记录呢?
chenset
2019-12-23 09:03:12 +08:00
不是直接持久化在数据库. user id 有索引, 然后通过一个非索引的是否已读标识标记就好了吗?
mejee
2019-12-23 09:04:27 +08:00
大站解决方案有很多,分工明确。
小站一个消息一行数据库记录就 OK 了
sujin190
2019-12-23 09:46:35 +08:00
从系统结构来说,最好不要做成需要两次持久化的,维护太麻烦了,有异常恢复也太费劲,数据小直接放数据库就是了,根本无所谓,量大一点可以先写数据库,接着把未读消息放缓存或队列,有异常也很容易从数据库恢复
optional
2019-12-23 10:08:59 +08:00
总结起来就是两句话:单播写扩散,广播读扩散。
whileFalse
2019-12-23 11:22:13 +08:00
可以举出很多用消息队列纯属扯淡的理由……
1. 消息队列有过期时间
2. 无法在不查看消息的时候知道有多少条。
3. 为了显示消息,需要查两次:一次消息队列 第二次数据库。

但根本原因是:不应把“未读消息”等同于“未处理消息”。消息队列是存放未处理消息的没错,但那是为了给计算机系统削峰平谷用的,不是给人类当收件箱用的。
yumc
2019-12-23 13:30:06 +08:00
@whileFalse 感谢,我首先是想到消息队列,但是想想具体实现...
请问最常规的直接通过数据库实现 ok 吗?
当数据量大或者对性能要求高时的解决方案都有什么呢?
qiayue
2019-12-23 13:33:50 +08:00
@yumc 量大方案找找看微博的推消息拉消息机制参考。
不可能一次写完代码永远不升级,你先实现一版,现有用户使用再说。
不要在只有 100 个用户时考虑性能问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631358

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX