分布式事务处理中的幂等性

2019-09-20  本文已影响0人  RaiseHead

事务是指以全有或全无的方式执行的一系列操作。所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。

以数据库为列,事物包含四个特性(ACID)

而在分布式系统中,你不能指望ACID事务。因为在分布式系统中会对数据库进行分区,这里所说的分区指的是物理分区,分区之后可能不同的库就处于不同的服务器上了,这个时候单个数据库的ACID已经不能适应这种情况了,而在这种ACID的集群环境下,再想保证集群的ACID几乎是很难达到,或者即使能达到那么效率和性能会大幅下降。

在没有ACID的情况下解决数据一致性的常见技巧是使用补偿。这种方法与ACID事务不同,你可以具有不一致的中间状态。在业务处理中通常可以忍受这些暂时的不一致,只要能确保最终清理它们并使系统恢复到一致状态。这称为最终一致性,这是分布式系统中的一个重要概念。

最终的一致性通常会产生更好的性能,更简单的操作和更好的可伸缩性,同时帮助程序员理解更复杂的数据模型。

在实现最终一致性时会出现消息重复发送问题。实际应用情况是,在分布式系统中确切地保证消息传递是不可能的。实现一次准确的消息传递完全基于消息生成者从消息使用者那里接收到确认消息。但是,ACK本身是不可靠的,因为它也将通过网络传播。在处理消息后,由于网络问题或消费者崩溃,很可能会丢失ACK。

任何通过网络进行通信,都可能会出现三种故障情形:

image

那么如何才能实现准确的消息传递?它的答案是幂等性!你必须使你的消费者操作具有幂等性。幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时不应该进行第二次扣款。

添加幂等性处理方法:

上一篇下一篇

猜你喜欢

热点阅读