MQ简介

定义

用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。

特性

•是一个独立运行的服务器。生产者发送消息,消费者接收消息都需要先和服务器建立连接。•采用队列作为数据结构,有先进先出的特点。•具有发布订阅(publish/subscribe)的模型,消费者可以获取自己需要的消息。

优点

解耦合,削峰,限流,广播通信

缺点

维护成本增加,系统可用性降低,复杂度增加

RabbitMQ

rabbitmq支持AMQP、STOMP、MQTT、HTTP、WebSockets协议

工作模型

springboot rabbitmq 迁移 RocketMQ rabbitmq传输对象_获取rabbitmq连接对象

名词简介

1.Broker

使用RabbitMQ接收发送消息,必须先安装一个RabbitMQ服务器。默认端口为5672.这个服务器就称之为Broker。

1.Connection

生产发送消息和消费者接收消息都必须先跟Broker建立一个TCP长连接。

1.Channel

如果每一个生产者发送消息和消费者接收消息,都直接创建和释放TCP长连接的话,对于Broker来说会造成很大的性能消耗,也会浪费时间。因此在AMQP里面引入了Channel的概念。Channel是一个虚拟的连接。这样就可以在长连接中在去创建不同的channel,减少资源消耗。不同的channel之间是相互隔离的,每个channel都有自己的编号。

1.Queue

Queue在RabbitMQ中是用来存储消息的对象,在RabbitMQ中叫Queue。RabbitMQ中是用数据库进行存储消息的。名字叫Mnesia。queue也是生产者和消费者之间传递消息的纽带。生产者将消息发送到queue中,消费者从queue中获取消息。

1.Consumer

Consumer消费消息又两种模式,Pull模式和Push模式。

•Pull模式对应的方法basicGet。消息存放在服务顿啊,只有消费者主动获取才能够拿到消息。这种方式可以根据自己的消费能力决定获取消息的频率,但是由于每隔一段时间获取一次消息,消息的实时性会降低。•Push模式对应的方法是basicConsume。只要生产者发送消息到服务器,就马上推送给消费者,消息保存在客户端,实时性很高,但是消费不过来的时候就会造成消息积压。SpringAMQP是push方式,通过事件机制对队列进行监听,只要有消息到大队列,就会出发消费消息的方法。

由于队列是FIFO的特性,只有确定钱一条消息被消费者接受之后,Broker才会把这条消息从数据库删除,继续投递下一条消息。

一个消费者可以监听多个队列,一个队列也可以被多个消费者监听。但是在生产环境中最好一对一。如果需要提升处理消息的能力,可以增加多个消费者,这个时候消息会在多个消息之间进行轮询。

1.Exchange

路由消息组件。exchange是不会存储消息的,它只是根据规则分发消息,不论有多少个对立需要接收消息,都只需要发送到Exchange就可以了。这样的话,生产者发送消息就不需要调用多次basicPublish的方法,一次发送给多个队列了。降低生产者的压力。既然生产者将消息发送到exchange,然后在由exchange进行分发给不同的队列,那么exchange也就必须和接收消息的queue建立绑定关系了。并且每个队列需要一个特定的标示进行分辨。

exchange和queue是多对多的绑定关系。绑定关系建立好之后,生产者发送消息到exchange,会携带一个特殊的标示,当这个标示和绑定的标示匹配后,消息就会发给一个活多个符合规则的队列。

1.Vhost

如果某一个业务不想和其他的业务共用一个broken,可以创建一个虚拟主机VHost,这样就可以和其他业务分开,不相互影响了。不同的Vhost中可以有相同的Exchange和Queeu,他们之间是完全透明的,就相当于在电脑上创建了多个虚拟机一样。这个地方可以创建Vhost

springboot rabbitmq 迁移 RocketMQ rabbitmq传输对象_获取rabbitmq连接对象_02

路由方式

队列接收消息和生成者发送消息必须和交换机(exchange)绑定。绑定方式有四种direct、topic、fanout和header

1.直连(direct)

使用明确的绑定键(binding key)和路由键(routing key),适用于业务目的明确的场景。

// 创建Dirct交换机public DirectExchange getDirectExchange() {      return new DirectExchange(directExchange);}// 创建队列public Queue getFirstQueue() {      return new Queue(firstQueue);}// direct交换机和队列进行绑定public Binding bindFirst(@Qualifier("firstQueue") Queue queue,                             @Qualifier("myDirectExchange") DirectExchange exchange) {     return BindingBuilder.bind(queue).to(exchange).with("shmilylyp.first_queue");}

1.主题(topic)

使用支持通配符的绑定键。使用于根据业务主体过滤消息的场景。通配符主要有

•#代表0个或者好多个档次•*代表一个单词

public TopicExchange getTopicExchange() {     return new TopicExchange(topicExchange);}public Queue getSecondQueue() {     return new Queue(secondQueue);}public Binding bindSecond(@Qualifier("secondQueue") Queue queue,                          @Qualifier("myTopicExchange") TopicExchange exchange) {     return BindingBuilder.bind(queue).to(exchange).with("#.second_queue.#"); }

1.广播(fanout)

无需绑定键。就和广场的大喇叭一样,都可以接受到消息。适用于通用类业务消息。

public FanoutExchange getFanoutExchange() {    return new FanoutExchange(fanoutExchange);}public Queue getFourQueue() {    return new Queue(fourQueue);}public Binding bindThree(@Qualifier("threeQueue") Queue queue,                             @Qualifier("myFanoutExchange") FanoutExchange exchange) {     return BindingBuilder.bind(queue).to(exchange);}