背景
- 使用实时的、分布式的流处理平台(比如 Apache Kafka)
- 消费者在意生产者生产消息时刻的资源状态
问题
从生产者生产消息到消费者消费消息是有时间间隔的,在这个间隔里资源的状态有可能发生改变,消费者在意事件发生时的状态而不是事件消费时的状态
例子
一个直播软件想要给主播在线的时候聊天的用户附加积分。积分模块在消费聊天模块生产的聊天消息时,需要知道主播是否在线
解决方案1
消息生产者把消费者需要的状态放到消息里,比如把在线状态放到聊天消息里
这样做的问题有
- 领域不清晰。聊天模块不需要/应该知道主播在线状态
- 生产者依赖消费者。生产者应该和消费者低耦合,或者说在生产消息时对有多少消费者以及他们是怎么消费无需知情
解决方案2
因为流处理平台的性能保障,默认消费者在接收消息的时候资源状态不变,那么就等到消费的时候再去获取状态(调用微服务等)。比如积分模块在得到事件后再去得到当时主播的在线状态。
这样做的问题有
- 因为文初所述的时间间隔的存在(服务故障、服务重新部署等等原因),这个默认并不可靠
思考
首先方案的选择基于应用场景。如果不是关键流程,可以允许一定程度的不精确性,那么可以选择方案2。在绝大多数的时间里,流平台的实时性可以保障
如果必须要保障精确程度,并且可以牺牲一定的实时性,那可以引入信息聚合器来集成所需要的事件并生成事件消息的时间线。比如直播模块生产主播上线下线的消息,信息聚合器同时消费两边的时间存储事件时间线,积分模块再通过时间线确保事件发生顺序