作者回复: 👍
作者回复: 处理删除和合并上没问题哈,需要考虑一下分库分表场景下,收发双方查询历史消息应该怎么查呢?
作者回复: 1. 缓存在这里的作用主要是快速响应用户的写入请求,规避同步写db的重操作。缓存服务器是否需要采取主从集群可以根据实际访问量来评估,一般写完主后即可返回,由主负责同步消息到从。
2. 由于消息id和产生时间在写入缓存前就已经生成好,失败队列重试导致的顺序错乱不影响最终消息到达客户端后的重排序。
作者回复: 点赞、评论这些目前采用的拉取模式,用户打开具体的赞箱和评论箱时才从服务端获取;私信是支持在线推送的,不过为了减少对大V的骚扰,对于未关注人私信没有系统push。
作者回复: 这个需要看具体的业务场景吧,比如考虑访问模型,数据量大小,读写的比例等等。在我们自己的场景里mysql和hbase,pika都有在使用。
作者回复: 没太理解到您的意思哈,websocket网关只有是无状态的多实例部署没啥问题的呀;实例重启断开连接是肯定的,需要解决的是断开后客户端需要有重连机制以及如果尽量减少实例重启的概率。
作者回复: 这里说一下:消息的收发是可以通过同一个长连通道来实现的,对于普通的聊天场景我甚至更推荐这种架构。对于消息下行扇出压力较大的场景(比如:直播、大型聊天室),考虑到下行通道的压力较大,稳定性方面保障会差一些。这种情况可以将上行独立拆分出来,保证用户发消息不会受到消息下推压力大的影响。
作者回复: 主要是考虑各自索引维护时的独立性:比如一方删除了消息不影响另一方查看类似的需求。
作者回复: 一般会先写缓存层,缓存层都成功的情况下,如果写有索引失败的情况可以先把失败的索引先写入到一个“失败队列”,由其他线程轮询尝试来写入。一般情况下,缓存层可以抗住db重试期间的数据可用性。
作者回复: 按时间段来查询没问题,但是消息写入的时候就会都落到一个表里,写入压力会有问题,但内容表实现上确实可以在hash完后按时间进行分表。
作者回复: 是个好问题,内容表的获取在拿到消息id后可以采取并发获取的方式哈,但是一页一般消息id是有限的(比如20),但分库分表的表数量会很多,上千都很常见。
作者回复: 这里需要考虑一个问题哈:我们在查询两个人之间的历史消息的时候是用户维度的查询还是消息维度的查询?如果按消息id哈希,查询两个人之间的历史消息在只有uid的情况下该怎么查呢?
作者回复: 单表单记录也是可行的,只是需要考虑清楚具体的使用场景:比如会话的某一方删除消息该怎么处理?如果业务需要类似邮箱的发件箱和收件箱这种设计是否方便索引查询?
作者回复: 群组聊天的存储在文章有提到哈,一般采用读扩散方式。
作者回复: 👍
作者回复: 这里说的联系人表其实就是存的最近联系人以及和这个联系人最新的一条消息,排序的话会按照最新一条消息来排。