事务发件箱请模式请参考:传送门
发送数据的两种方式
- 轮询发布数据
- 事务日志拖尾
轮询发布数据
可以通过线程一直循环查询OUTBOX操作,也可以使用定时任务循环查询OUTBOX表,将这些消息发送给消息代理,最后把完成的发送的消息从OUTBOX表中删除。
例如sql
select * from outbox order by id
begin
delete from outbox where id in (...)
commit
轮询数据库是一种在小规模下运营良好的简单方法。以弊端是经常轮询数据库可能造成昂贵的开销(导致数据库性能下降)。
事务日志拖尾
每次应用程序提交到数据库的更新都对应着数据库书屋日志中的一个条目。事务日志挖据器可以读取事务日志,把每条跟小学有关的记录发送给小学代理,下图展示了这个方案的具体实现方式。
transaction-log-miner读取事务日志的条目,它将对应于插入小学的每个相关的日志条目转换为消息,并将消息发布到消息代理。这个方案有一些实际的应用案例和实现可供参考。
- Debezium:一个开源项目,它可以向kafka消息代理发布消息更改
- LinkedIn Databus: 一个开源项目,用于挖掘Oracle事务日志文件并将更爱发布为事件。
- DynamoDb streams:包含过去24小时内的DynamoDB表更改的序列,并且这个序列是按时间排序的。应用程序可以从流中读取这些更改。
- Eventuate Tram:它使用MYSQL binlog协议、Postgres WAL 或轮询来读取对OUTBOX表所做的更改并将它们发布到kafka。