@
zzlhr 1 )建归档表存每个月数量:month count。
2 )建事件表用于触发更新:month。
流程:
在线部分:
1 )增加 /删除文章,先插入一条事件记录:(2018 年 2 月份);若该步骤失败(数据库异常等),则中止后续流程,这叫做 WAL ( write ahead log )。
2 )对文章表的各种操作...
离线部分:
1 )取事件表中的一批记录(比如 100 条)到内存,按 month 去重,通常来说只会剩下一个 month,因为发布的新文章都是当月的。
2 )对于去重后的每个 month,去文章表执行 select count group by month,得到数量后更新到归档表对应 month 中。
3 )删除已经处理的事件。
该方案考虑了几个点:
1 )文章并发新建 /删除,实时更新归档表存在老覆盖新的并发问题,所以选择走 WAL 事件异步串行化。
2 )离线计算批量,解决文章并发量大,重复 count 的性能问题,因为基本上新文章都是当月的,可以批处理为 1 次 SQL 运算。
3 )若上述串行离线处理方案存在瓶颈,建议换消息队列,按 month 分区,多消费者并行。