V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
azurefang
V2EX  ›  程序员

关于消息系统的设计

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

    每个用户有一个字段,内容是[关注自己的用户列表]。用户有更新时也是推送到消息队列,后台进程取[关注当前用户列表],然后挨个向消息表里面加,同时修改未读消息数量。
    willwen
        8
    willwen  
       2014-09-20 19:34:44 +08:00 via iPhone
    一個自增量作為消息的id,以Hash message:id作為消息的容器,id推進Set messages,同時推進Set user_id:messages。
    這樣可以全局可查,獨立用戶可查,消息狀態控制Set messages即可。
    完畢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:41 · PVG 11:41 · LAX 19:41 · JFK 22:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.