原文地址:https://www.douyacun.com/article/78899ae36e0dae22e49e54e62448f970
建议阅读
原则还是尽量保持单机事物,只有单库执行才能保证数据库的ACID特性,遇到跨库事物, 通常通过“最终一致”事物保证事物执行的吞吐量,
系统中所有的数据副本经过一段时间后最终能够达到一致的状态
保证核心事物的正向执行,然后保存事物中间状态,其他事物异步执行,执行完成后达到最终的事物一致,避免跨库事物时间序列执行阻塞,提升事物吞吐量
关键点在于:可靠事件投递 和 避免事件重复消费
可靠事件投递:
2要求实时性,第三条保证一定发布,额外的事件数据库可能会给数据库带来额外的压力
将事件持久化到外部事件系统,事件系统需要提供实时事件服务以接受微服务发布事件,事件系统需要提供事件恢复服务来确认和恢复服务
需要一次确认操作 并且需要 业务服务提供额外的查询接口, 事件幂等性
幂等性
TODO:: 待完善
幂等事件要考虑执行顺序,
事件消费的开销
需要考虑重复执行一条事件和查询存储结果的开销
对于重复处理开销很小的事件,或者只有非常少的事件会被重复处理接收,可以重复处理一次事件,在将事件数据持久化时由数据库 唯一索引 抛出唯一性约束异常
对于重复处理一条事件的开销比额外一次查询的开销要高很多, 可以使用过滤服务过滤处理的过的事件, 每个事件执行完成后记录执行结果
过滤服务是在事件处理完成后记录结果,可能处理中间就再次收到重复事件
可以记录事件的处理过程:
可以根据不同的状态,做不同的处理
业务服务的 消息处理状态,发送请求成功但是没有收到处理结果
选择暂时不一致性,采用对账和人工接入的方式保证一致性
补偿模式使用一个额外的协调服务来保证各个需要保证一致性的微服务,协调服务按顺序调用各个微服务,如果某个微服务调用异常(包括业务异常和技术异常)就取消之前已经调用成功的微服务
为了降低开发的复杂度和效率,协调服务需要实现为一个通用补偿框架,提供服务编排和自动完成补偿的能力 - 确定失败的步骤和状态,从而确定补偿的范围 - 能提供补偿操作使用到的业务数据 - 生成全局唯一的业务流水号 - 关联表,获取各个步骤的业务数据和状态 - 提供重试策略
建议阅读
3个阶段
预处理阶段
事物提交阶段
事物回滚阶段