一个订阅功能表面上只有“关注”和“取消”,实际还包含动态列表、未读提醒、批量已读和降级展示。把所有逻辑放进一张关系表,会让读写路径互相牵制。
分离事实与视图
订阅关系是事实数据;订阅动态列表和未读数量是可重建的读模型。关系变更通过事件更新读模型,短暂延迟可以接受,但必须最终收敛。
已读使用水位
相比为每条内容写一条已读记录,记录用户最后阅读时间或序列水位更轻量。只有需要精确逐条状态的场景才维护明细。
计数不是事实源
提醒数字可以缓存并异步修正。用户打开列表时,以实际内容和水位重新计算,避免计数漂移永久存在。
降级
聚合服务异常时,仍可展示订阅关系和最近缓存列表;提醒数字可以隐藏,不能因此阻塞主要页面。
读模型允许产品获得高性能体验,同时把一致性要求控制在可解释范围内。