数据人看Feed流-架构实践( 九 )

是推?是拉?还是混合?没有最好的架构 , 只有适合的场景~

基于关系的传递

图6是纯推模式的架构 , 该架构有3个关键的部分

  1. 异步化 。 生产者提交消息首先写入一个队列 , 成功则表示发布成功 , Dispatcher模块会异步的处理消息 。 这一点非常关键 , 首先生产者的消息发布体验非常好 , 不需要等待消息同步到粉丝的收信箱 , 发布延迟低成功率高;其次Dispatcher可以控制队列的处理速度 , 可以有效的控制大V账号造成的脉冲压力 。

  2. 多级队列 。 Dispatcher可以根据消费者的状态 , 信息的分类等划分不同的处理方式 , 分配不同的资源 。 比如对于大V账号的消息 , 当前活跃用户选择直接发送 , 保障消息的时效性 , 非活跃用户放入队列延迟发送 。 比如转发多的消息可以优先处理等 。 队列里的消息可以采用批量聚合写的方式提高吞吐 。

  3. 收信箱 。 假如有两亿用户 , 每个用户保留最新2000条推送消息 。 即便存储的是索引也是千亿的规模 。 收信箱一般的表结构为用户ID+消息序列 + 消息ID + 消息元数据 , 消息序列是一个递增的ID , 需要存储一个偏移量表示上次读到的消息序列ID 。 用户读取最新消息 select * from inbox where 消息序列 > offset 。

    推荐阅读