Catalog
  1. 1. 特性:
消息队列基础

消息队列

优点 解耦,异步,削峰

缺点 分布式事务问题, 有重复消费,消费丢失,数据顺序相关问题

选型与优缺点:

消息重复消费解决方案

幂等性(强)

比如你监听到用户支付成功的消息,你监听到了去加GMV是不是要调用加钱的接口,那加钱接口下面再调用一个加流水的接口,两个放在一个事务,成功一起成功失败一起失败。

每次消息过来都要拿着订单号+业务场景这样的唯一标识(比是天猫双十一活动)去流水表查,看看有没有这条流水,有就直接return不要走下面的流程了,没有就执行后面的逻辑。

之所以用流水表,是因为涉及到金钱这样的活动,有啥问题后面也可以去流水表对账,还有就是帮助开发人员定位问题。

幂等性(弱)

redis ,半个小时内的短信不必重发,丢失了多发一条也无所谓

实现消息的顺序消费

一个topic下有多个队列,为了保证发送有序,RocketMQ提供了MessageQueueSelector队列选择机制,他有三种实现:

Hash ID,生产者将订单发送至同一个topic ,单个消费者处理,保证了顺序性.

事务以及分布式事务

特性:

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

那有同学还是不理解,敖丙我总结了一下就是:事务就是一系列操作,要么同时成功,要么同时失败。然后会从事务的 ACID 特性(原子性、一致性、隔离性、持久性)展开叙述

事务就是为了保证一系列操作可以正常执行,它必须同时满足 ACID 特性。

2pc(两段式提交) :

2pc(两段式提交)可以说是分布式事务的最开始的样子了,像极了媒婆,就是通过消息中间件协调多个系统,在两个系统操作事务的时候都锁定资源但是不提交事务,等两者都准备好了,告诉消息中间件,然后再分别提交事务。

但是我不知道大家看到问题所在没有?

是的你可能已经发现了,如果A系统事务提交成功了,但是B系统在提交的时候网络波动或者各种原因提交失败了,其实还是会失败的。

最终一致性

整个流程中,我们能保证是:

  • 业务主动方本地事务提交失败,业务被动方不会收到消息的投递。
  • 只要业务主动方本地事务执行成功,那么消息服务一定会投递消息给下游的业务被动方,并最终保证业务被动方一定能成功消费该消息(消费成功或失败,即最终一定会有一个最终态)。

不过呢技术就是这样,各种极端的情况我们都需要考虑,也很难有完美的方案,所以才会有这么多的方案三段式TCC最大努力通知等等分布式事务方案,大家只需要知道为啥要做,做了有啥好处,有啥坏处,在实际开发的时候都注意下就好好了,系统都是根据业务场景设计出来的,离开业务的技术没有意义,离开技术的业务没有底气

还是那句话:没有最完美的系统,只有最适合的系统。

Author: 抹琦
Link: https://fengjunzixian.github.io/fengjunzixian.github.io/2019/11/27/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶