什么是MQ
MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法, 其实就是一个大队列,
拥有先进先出的特性
作用:
- 异步操作: 见下面的异步操作总结
- 解耦: 在代码中不会将具体的业务代码写死, 而是将需要处理的数据发送给mq服务器, 以后哪个项目连接mq服务器接收数据
进行后续处理, 可以随时变更业务. 比较灵活. - 削峰: mq相当于大队列服务器, 在流量洪峰产生的时候, 需要处理的大量数据可以发送到mq服务器队列中缓冲, 先进先出.
对于洪峰可以平缓的消除 - 可恢复性: mq有高可用技术解决方案(心跳检测技术), 防止mq服务器宕机
**同步操作 异步操作区别:**
1.同步操作:
以前controller调用service都是同步操作
技术: dubbo, feign
优点: 实时性高, 比如controller调用service, 必须马上立即执行, 没有返回结果前,
controller不向后执行, 等待
缺点: 效率低
2.异步操作:
controller可以将数据发送给消息服务器, 消息服务器可以将数据发给各个service服务器
技术: MQ技术, 消息队列技术
优点: 效率高, 因为MQ中有群发模式, 多个service项目可以同时接受到数据, 进行处理
缺点: 实时性差, 因为MQ如果在高并发的时候, 队列中消息会堆积, 先进先出,
不一定能够马上执行.
queue队列:
队列可以缓冲数据, 排队执行, 如果接收方没有接受到数据, 则数据会一直缓存在队列中不会发丢.
exchange交换器:
交换器没有缓存数据的功能, 如果交换器没有绑定队列, 那么我们发送数据到交换器中,
交换器直接会将数据发送出去
如果没有接收方接受, 数据会发丢
rabbitmq工作模式:
-
hello word简单模式:
描述: 一个发送方, 一个队列, 一个接收方使用场景: 发送方发送数据的速度和接收方处理数据的速度相当的情况下使用
2. work工作模式:
描述: 一个发送方, 一个队列, 多个接受方使用场景: 发送方发送数据的速度快, 接受方处理数据的速度慢, 队列长时间队列大量数据得不到处理, 内存显著消耗, 可以使用多个接收方, 抢着去队列中拿出去处理, 这样可以加快数据的处理速度.多个接收方是竞争关系, 一个接受方拿到的数据, 另一个接收方就拿不到, 另一个接收方可以拿其他数据处理.
3. Publish/Subscribe发布订阅模式(广播模式):
描述: 一个发送方, 将数据发送到mq的交换器中, 交换器中可以绑定多个队列,
这种模式是广播模式,
多个队列中接受到的数据是一模一样的, 不同项目中有不同的监听器, 监听不同队列,
但是拿到的数据也是相同的, 根据数据同时进行不同的业务操作.使用场景: 根据一个数据需要进行不同的业务操作, 这个时候可以使用这种模式进行解耦. 因为不同的项目可以同时接收到相同的数据, 各自项目拿到数据后进行业务操作.
4. Routing路由模式(定向发送):
描述: 一个发送方, 一个交换器, 多个队列, 交换器和队列绑定并且设置路由键,
多个接收方监听不同的队列多个接收方接受到的数据不相同, 因为路由键设置的不同使用场景: 路由模式比较灵活, 根据设置的不同的路由键, 将数据发送到不同的队列中, 不同项目监听不同队列,做不同的业务操作.
5. topic主题模式(通配符模式)
描述: 一个发送方, 一个交换器, 多个队列, 交换器和队列绑定并且设置路由键,
路由键中可以设置通配符匹配规则,不同接受方监听不同队列使用场景: 在代码中通过路由键来控制, 数据发往哪个队列, 更为灵活, 可以适用于复杂多变的业务操作.