java rabittmq_【JAVA】RabbitMQ

RabbitMQ的工作原理

6f850f55f387

屏幕快照 2019-03-24 下午8.14.22.png

组成部分说明如下:

Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。

Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。

Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。

Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。

Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。

消息发布接收流程:

-----发送消息-----

1、生产者和Broker建立TCP连接。

2、生产者和Broker建立通道。

3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。

4、Exchange将消息转发到指定的Queue(队列)

----接收消息-----

1、消费者和Broker建立TCP连接

2、消费者和Broker建立通道

3、消费者监听指定的Queue(队列)

4、当有消息到达Queue时Broker默认将消息推送给消费者。

5、消费者接收到消息。

发送端操作流程

1)创建连接

2)创建通道

3)声明队列

4)发送消息

接收端

1)创建连接

2)创建通道

3)声明队列

4)监听队列

5)接收消息

6)ack回复

工作模式

RabbitMQ有以下几种工作模式 :

1、Work queues

2、Publish/Subscribe

3、Routing

4、Topics

5、Header

6、RPC

6f850f55f387

屏幕快照 2019-03-24 下午8.35.17.png

work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。 应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。

测试:

1、使用入门程序,启动多个消费者。

2、生产者发送多个消息。

结果:

1、一条消息只会被一个消费者接收;

2、rabbit采用轮询的方式将消息是平均发送给消费者的;

3、消费者在处理完某条消息后,才会收到下一条消息。

6f850f55f387

屏幕快照 2019-03-24 下午8.37.18.png

发布订阅模式:

1、每个消费者监听自己的队列。

2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

publish/subscribe与work queues有什么区别。

1)work queues不用定义交换机,而publish/subscribe需要定义交换机。

2)publish/subscribe的生产方是面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机)。

3)publish/subscribe需要设置队列和交换机的绑定,work queues不需要设置,实质上work queues会将队列绑定到默认的交换机 。

相同点: 所以两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。

实质工作用什么 publish/subscribe还是work queues。

建议使用 publish/subscribe,发布订阅模式比工作队列模式更强大,并且发布订阅模式可以指定自己专用的交换机。

6f850f55f387

屏幕快照 2019-03-24 下午8.42.12.png

路由模式:

1、每个消费者监听自己的队列,并且设置routingkey。

2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。

Routing模式和Publish/subscibe有啥区别?

Routing模式要求队列在绑定交换机时要指定routingkey,消息会转发到符合routingkey的队列。

6f850f55f387

屏幕快照 2019-03-24 下午8.46.36.png

Topics路由模式:

1、每个消费者监听自己的队列,并且设置带统配符的routingkey。

2、生产者将消息发给broker,由交换机根据routingkey来转发消息到指定的队列。

SpringBoot整合RibbitMQ

使用spring-boot-starter-amqp会自动添加spring-rabbit依赖,如下:

org.springframework.boot

spring‐boot‐starter‐amqp

org.springframework.boot

spring‐boot‐starter‐test

org.springframework.boot

spring‐boot‐starter‐logging

配置application.yml

server:

port: 44000

spring:

application:

name: test‐rabbitmq‐producer

rabbitmq:

host: 127.0.0.1

port: 5672

username: guest

passowrd: guest

virtualHost: /

定义RabbitConfig类,配置Exchange、Queue、及绑定交换机。本例配置Topic交换机。

@Configuration

public class RabbitmqConfig {

public static final String QUEUE_INFORM_EMAIL = "queue_inform_email";

public static final String QUEUE_INFORM_SMS = "queue_inform_sms";

public static final String EXCHANGE_TOPICS_INFORM="exchange_topics_inform";

@Bean(EXCHANGE_TOPICS_INFORM)

public Exchange EXCHANGE_TOPICS_INFORM() {

//durable(true)持久化,消息队列重启后交换机仍然存在

return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build();

}

//声明队列

@Bean(QUEUE_INFORM_SMS)

public Queue QUEUE_INFORM_SMS() {

Queue queue = new Queue(QUEUE_INFORM_SMS);

return queue;

}

//声明队列

@Bean(QUEUE_INFORM_EMAIL)

public Queue QUEUE_INFORM_EMAIL() {

Queue queue = new Queue(QUEUE_INFORM_EMAIL);

return queue;

}

//channel.queueBind(INFORM_QUEUE_SMS,"inform_exchange_topic","inform.#.sms.#"); * 绑定队列到交换机

@Bean

public Binding BINDING_QUEUE_INFORM_SMS(@Qualifier(QUEUE_INFORM_SMS) Queue queue,

@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange) {

return BindingBuilder.bind(queue).to(exchange).with("inform.#.sms.#").noargs();

}

@Bean

public Binding BINDING_QUEUE_INFORM_EMAIL(@Qualifier(QUEUE_INFORM_EMAIL) Queue queue,

@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange) {

return BindingBuilder.bind(queue).to(exchange).with("inform.#.email.#").noargs();

}

}

生产端,使用RarbbitTemplate发送消息

@SpringBootTest

@RunWith(SpringRunner.class)

public class Producer05_topics_springboot {

@Autowired

RabbitTemplate rabbitTemplate;

@Test

public void testSendByTopics(){

for (int i=0;i<5;i++){

String message = "sms email inform to user"+I;

rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_TOPICS_INFORM,"inform.sms.email",message);

System.out.println("Send Message is:'" + message + "'");

}

}

}

消费端,使用@RabbitListener注解监听队列。

@Component

public class ReceiveHandler {

//监听email队列

@RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_EMAIL})

public void receive_email(String msg,Message message,Channel channel){

System.out.println(msg);

}

//监听sms队列

@RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_SMS})

public void receive_sms(String msg,Message message,Channel channel){

System.out.println(msg);

}

}

测试

6f850f55f387

屏幕快照 2019-03-24 下午9.03.46.png

Mac安装rabbitmq

brew install rabbitmq

brew services list

brew services start rabbitmq

1. RabbitMQ是什么?它有什么作用? RabbitMQ是一个开源的消息中间件,它实现了高级消息队列协议(AMQP)标准,支持多种编程语言和操作系统。RabbitMQ能够帮助开发人员构建可靠、可扩展、异步和分布式的应用程序。 RabbitMQ有以下作用: - 解耦:将应用程序中的组件解耦,使它们可以独立地进行开发、测试和部署。 - 异步:提高应用程序的吞吐量和响应性能,通过异步处理来避免阻塞和等待。 - 可靠性:确保消息在不同的应用程序之间的可靠传输和处理。 - 扩展性:通过添加更多的消息代理来扩展应用程序的处理能力。 - 消息分发:将消息发送到多个消费者,使它们可以同时处理消息。 2. RabbitMQ的基本组件是什么? RabbitMQ的基本组件包括: - 生产者(Producer):将消息发送到RabbitMQ中的队列。 - 队列(Queue):存储消息的地方,生产者将消息发送到队列中,消费者从队列中获取消息进行处理。 - 消费者(Consumer):从队列中获取消息进行处理。 - 交换机(Exchange):接收生产者发送的消息,并将其路由到一个或多个队列中。 - 路由键(Routing Key):生产者将消息发送到交换机时,需要指定一个路由键,交换机会根据路由键将消息路由到相应的队列中。 3. RabbitMQ的消息确认机制是什么? RabbitMQ的消息确认机制分为两种:生产者确认和消费者确认。 - 生产者确认:生产者可以通过设置消息确认模式来确认消息是否已经被成功发送到RabbitMQ中。消息确认模式分为两种:事务模式和发布确认模式。事务模式需要在发送消息前开启事务,并在发送完成后提交或回滚事务来确认消息是否已成功发送。发布确认模式则会在发送消息后等待RabbitMQ发送确认消息,如果收到确认消息则表示消息已经成功发送。 - 消费者确认:消费者可以通过设置手动确认模式来确认消息是否已经被成功处理。手动确认模式需要消费者在处理完消息后主动发送确认消息给RabbitMQ,如果RabbitMQ收到确认消息则表示消息已经被成功处理,否则会重新将消息发送给其他消费者。 4. RabbitMQ的消息持久化是什么? RabbitMQ的消息持久化指的是将消息保存在磁盘中,以防止消息在RabbitMQ服务器宕机时丢失。消息持久化可以通过设置消息属性和队列属性来实现。 - 消息属性:生产者可以通过设置消息的delivery mode属性为2来将消息标记为持久化消息,RabbitMQ会将消息保存在磁盘中。如果delivery mode属性为1,则表示消息是非持久化消息,RabbitMQ会将消息保存在内存中。 - 队列属性:消费者可以通过设置队列的durable属性为true来将队列标记为持久化队列,RabbitMQ会将队列和其中的消息保存在磁盘中。如果durable属性为false,则表示队列是非持久化队列,RabbitMQ会将队列和其中的消息保存在内存中。 5. RabbitMQ的消息重试机制是什么? RabbitMQ的消息重试机制指的是当消费者无法处理消息时,将消息重新发送到队列中,以便其他消费者可以重新处理消息。消息重试机制可以通过设置队列的消息过期时间和最大重试次数来实现。 - 消息过期时间:消费者可以通过设置消息的expiration属性来指定消息的过期时间,如果消息在过期时间内没有被处理,则会被发送到死信队列中。 - 最大重试次数:消费者可以通过设置队列的最大重试次数来指定消息的最大重试次数,如果消费者在处理消息时发生异常,则会将消息重新发送到队列中,并增加消息的重试次数。如果消息的重试次数超过最大重试次数,则会被发送到死信队列中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值