V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yumc
V2EX  ›  问与答

请教关于站内信的实现

  •  
  •   yumc · 2019-12-23 08:54:52 +08:00 · 2893 次点击
    这是一个创建于 1796 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    但根本原因是:不应把“未读消息”等同于“未处理消息”。消息队列是存放未处理消息的没错,但那是为了给计算机系统削峰平谷用的,不是给人类当收件箱用的。
    yumc
        8
    yumc  
    OP
       2019-12-23 13:30:06 +08:00
    @whileFalse 感谢,我首先是想到消息队列,但是想想具体实现...
    请问最常规的直接通过数据库实现 ok 吗?
    当数据量大或者对性能要求高时的解决方案都有什么呢?
    qiayue
        9
    qiayue  
       2019-12-23 13:33:50 +08:00
    @yumc 量大方案找找看微博的推消息拉消息机制参考。
    不可能一次写完代码永远不升级,你先实现一版,现有用户使用再说。
    不要在只有 100 个用户时考虑性能问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1686 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.