微服务通讯有两种方式,同步和异步。客户端将请求发送到服务器,异步通讯较同步通讯而言,通过调用事件驱动模型Broker,无需等待服务器返回结果,微服务之间耦合度更低,微服务无需等待订阅者处理完成性能更好,并且做到了故障隔离,不存在级联失败等问题。

MQ,意思为消息队列,分布式系统中的重要组件,用它就可以实现应用解耦、异步消息、流量削峰等问题。消息队列产品有很多,企业级应用较广泛的就是RabbitMQ。

消息队列中的消息分为两类传输模型点对点模型(一个生产者发送的同一条消息只能被一个消费者消费)、发布订阅模型(一个生产者发送的同一条消息可以被多个消费者同时消费)。

点对点模型包含Simple Queue简单消息模型(一个生产者一个消费者)、Worker消息模型(一个生产者、多个消费者,消费者之间可以平均消费也可以竞争消费)。

发布订阅模型又包含Fanout Exchange 广播模式、、Direct Exchange、Topic Exchange

消息发送接收的流程

简单消息模式:首先消息生产者和消息消费者与RabbitMQ通过mq地址、账户密码建立连接,然后建立通道建立队列来存放消息、消息生产者生产投递消息发送给消息队列,消息发送完成后释放资源(SpringAMQP框架中包含了不用写代码,释放资源代码在底层是写在生产者里面的),消费者监听队列订阅消费消息。

Worker消息模型:就是上述中多个消费者绑定到一个队列中,同一条消息只会被一个消费者处理,并且可通过设置修改consumer服务的application.yml文件,将消费者平均消费模式改为竞争模式

spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1 # 消费者一次处理一条消息,处理完毕后再从MQ中获取,即消费者消费改为竞争模式

Fanout Exchange 广播模式:较以上多了Exchanges交换机,交换机绑定不同的队列,不同的消费者监听不同的队列。生产者生产消息,将消息投递到交换机,至于交换机将消息发送给哪个队列,生产者不知道。交换机负责接收生产者的消息,并将消息转发到对应的队列上,交换机本身不能存储消息。队列绑定到指定的交换机上,从交换机中接收消息,队列是用来存储消息的。消费者绑定队列,从队列中获取消息。

Direct Exchange 直接广播模式:Fanout Exchange的交换机将消息发送给哪个队列,生产者不知道,但是在正常的微服务项目中,需要生产者消息被指定的消费者也可理解不同的队列消费,因此产生了Direct Exchange,Direct Exchange交换机可以通过发送消息指定RoutingKey消息队列绑定时指定BindingKey,来实现不同消息类型的消息通过队列将消息发送给指定的消息队列也就发送给了自定的消费者。

Topic Exchange 专题广播模式:就是相比Direct Exchange,可以使用通配符#、*等。

02-16 07:35