MQ入门...

一、MQ引入:

        MQ,英文全称Message Queue,消息队列。

        1、同步和异步通讯

        微服务间通讯有同步和异步两种方式:

        同步通讯:比如打电话,需要实时响应。

        异步通讯:比如发邮件,无需马上回复。

如图:

        

 

         打电话,一次只能撩一个妹子。发微信,同时可以和多个妹子聊天,6吧!

         两种方式各有优劣:

         打电话可以立即得到响应,但是你却不能跟多个人同时通话。

         发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。

1.1同步调用的问题:

        微服务间基于Feign的调用就属于同步通讯,存在一些问题。只要其中一个微服务出Bug(或添加新功能),那么其他相关微服务都要推倒重来(修改代码操作),工作量太大,效率太低。人为操作的话得累个半死!

如图:

        

同步调用存在的问题:

        

小结:

同步调用的优点:        

        时效性较强,可以立即得到响应结果。

同步调用的问题:

  • 耦合度高
  • 性能和吞吐能力下降
  • 有额外的资源消耗
  • 有级联失败问题

 tips:

吞吐量:吞吐量是指对网络、设备、端口、虚电路或其他设施,单位时间内成功地传送数据的数量(以比特、字节、分组等测量)。

1.2异步调用的优势: 

异步调用则可以避免上述问题:

        我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。

        在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。

        订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。

        为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。

 

         Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。

        

好处:

  1. 吞吐量提升:无需等待订阅者处理完成,响应更快速。
  2. 故障隔离:服务没有直接调用,不存在级联失败问题。
  3. 节约资源:调用间没有阻塞,不会造成无效的资源占用。
  4. 耦合度极低:每个服务都可以灵活插拨,可替换。
  5. 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件。

缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理。
  • 需要依赖于Broker的可靠性、安全性、吞吐能力。

好在现在开源软件或云平台上 Broker 的软件是非常成熟的,比较常见的一种就是我们今天要学习的MQ技术。

二、MQ简介:

        MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

        几种常见MQ的对比:

目前市场上最常用的是RabbitMQ和阿里的RocketMQ,今天我们先来了解一下前者:

2.1RabbitMQ概述:

  RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:https://www.rabbitmq.com/

  RabbitMQ结构图:

        

 RabbitMQ中的一些角色:

  • publisher:生产者
  • consumer:消费者
  • exchange:交换机,负责路由消息到队列中
  • queue:队列,存储消息
  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息

2.2RabbitMQ入门:

        

 2.2.1基础消息队列(BasicQueue):

2.2.2 工作消息队列(WorkQueue):

        也叫Task queues,任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。

        

 

        当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。

        此时就可以使用work 模型,多个消费者共同处理消息处理,速度就能大大提高了。

 2.2.3 发布、订阅(Publish、Subscribe)

 如图:

可以看到,在订阅模型中,多了一个exchange角色,而且过程略有变化:

  • Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给exchange(交换机)

  • Exchange:交换机,图中的exchange。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有以下3种类型:

    • Fanout:广播,将消息交给所有绑定到交换机的队列

    • Direct:定向,把消息交给符合指定routing key 的队列

    • Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

  • Consumer:消费者,与以前一样,订阅队列,没有变化

  • Queue:消息队列也与以前一样,接收消息、缓存消息。

Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!

小结:

交换机的作用是什么?

  1. 接受publisher发送的消息
  2. 将消息按照规则路由给与之绑定的队列
  3. 不能缓存消息,路由失败,消息丢失
  4. FanoutExchange会将消息路由到每个绑定的队列

三、SpringAMQP

        SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。

        SpringAmqp的官方地址:Spring AMQPLevel up your Java code and explore what Spring can do for you.https://spring.io/projects/spring-amqp

 

 

        

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值