关于消息系统的设计

2014-09-20 16:45:57 +08:00
 azurefang
最近我在写一个问答网站练手,想实现类似知乎的消息提醒功能,但感觉总是设计不出来。我说一下我的想法。rmdb中有一张消息表。当用户有新状态时,会存一条消息到redis中的消息队列中,那我该如何将这条消息分发给关注这个用户的所有用户?遍历用户关注表在把任务交给celery?会不会太慢?那要如何实现实时通知?
新手,请多指教。
3563 次点击
所在节点    程序员
8 条回复
nybux
2014-09-20 17:28:21 +08:00
NetCobra
2014-09-20 17:29:28 +08:00
不知道你用的是什么语言,我们公司的产品中用的是SignalR实现的这个功能,但这个只适用于ASP.Net,你可以看看有没有其他类似的方案。
eslizn
2014-09-20 17:41:41 +08:00
没这么复杂吧,就是一张消息表,用户每次去取属于自己的消息就可以了,取完标记一下或者redis直接pop
zzlettle
2014-09-20 17:56:36 +08:00
我设计我的论坛的时候,查过,这种消息通知的数据库模型,设计一般有3种
针对的是小型,中型,大型数据。
你去查查吧。
反正我觉得写这个很绕,可能我学的不够好。所以你看V2EX没有会员间的私信功能。这个功能看起来简单,做起来感觉还有麻烦,主要是数据库里面的查询。
我最后也只做出来一个会员之间的私信来往。那种全部会员通知的,还有针对一定特点会员的群私信的,我都还没做。
真的做起来才感觉绕来绕去的。可能是我没经验吧。你只要把几个数据模型设计好了,数据库查询条件搞清楚了,就没问题了。
我是用django开发的,感觉没有用到celery啊。
zzlettle
2014-09-20 18:01:58 +08:00
我猜想你用celery的原因是不是因为你的数据很小,你想如果是群体全部用户发私信,就被每个用户消息队列后台添加?
如果你有100万用户你怎么搞?
这个思路只适用很小的用户群。正确的做法是,你做2个数据模型。一个是消息本身内容的,每个人只要一登陆,先去查询有没有新的私信,有的话,就取到自己的数据库里面,标记为已经获取了私信。
所以你用celery的做法是错误的。
zeayes
2014-09-20 18:09:58 +08:00
消息获取的方式无非有2种:PUSH和PULL。具体可以看下微博的设计。
gamexg
2014-09-20 19:24:48 +08:00
会存一条消息到redis中的消息队列中,那我该如何将这条消息分发给关注这个用户的所有用户?

每个用户有一个字段,内容是[关注自己的用户列表]。用户有更新时也是推送到消息队列,后台进程取[关注当前用户列表],然后挨个向消息表里面加,同时修改未读消息数量。
willwen
2014-09-20 19:34:44 +08:00
一個自增量作為消息的id,以Hash message:id作為消息的容器,id推進Set messages,同時推進Set user_id:messages。
這樣可以全局可查,獨立用戶可查,消息狀態控制Set messages即可。
完畢

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

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

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

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

© 2021 V2EX