保证更新db和发送消息的事务
利用数据库的事务原子性

操作如图中所示
- 订单服务在更新order表的同时会将消息插入到outbox表(一般在类似mysql结构中使用),这里outbox扮演了消息临时队列。或者可以给order表添加一个属性,专门用来记录需要发送的message(一般在NoSQL中使用)
- message relay读取outbox表中的内容
- message relay将读取到outbox内容发送到message broker中。当成功发送到broker中后,relay在将outbox表中对应的message删除。
优势
- 实现简单
劣势
- 由于要经常性的读取数据库,在数据量较大时,性能有可能不好
消费事务日志

这种方法是通过消费事务日志来获取消息,然后发送到broker中。对于log miner组件,一般采用开源的实现,主要有以下开源软件
- Debezium
- LinkedIn Databus
- DynamoDB streams
- Eventuate Tram
- Canal(阿里出品)
优势
- 性能良好
- 对于数据库侵入少
劣势
- 实现较为复杂
网友评论