【RabbitMQ】异步任务

本文探讨了如何使用MQ实现异步任务,重点讲述了RabbitMQ的特点、核心概念以及一个入门Demo。RabbitMQ是一个用Erlang开发的AMQP实现,具备可靠性、灵活路由等特点,支持多种消息队列协议和多语言客户端。文中提到了消息生产者、交换器、队列、消费者等关键概念,以及它们在消息传递过程中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

     上一篇博客介绍了用线程池实现异步任务。这一篇博客谈一谈用MQ实现异步任务。MQ的产品有灰常多,像什么MSMQ、activeMQ、RocketMQ、RabbitMQ、kafak等。在此之前先谈一谈对消息队列的理解。

二、MQ

       MQ是一种应用程序对应用程序的通讯方法,应用程序通过读写出入队列的消息来进行通信,两者无需建立连接,发布者和消费者无需知道对方的存在。

      MQ是生产者--消费者模型的一个代表,一端往消息队列中不断写入消息,而另一端则可以不断读取或订阅队列中的消息。

      使用场景:

      1、异步处理:在项目中将一些无需及时返回且耗时的操作提取出来,进行异步处理,采用异步处理,将大大节省了服务器的请求响应时间,从而提高了系统的吞吐量。

       2、消息推送

三、RabbitMQ特点

       RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。

       RabbitMQ的特点为:

       1、可靠性

       RabbitMQ提供了多种技术可以让你在性能和可靠性之间进行权衡,如持久性、传输确认、投递确认。

       2、灵活的路由

       在消息进行队列之前,通过Exchange来路由消息。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现,针对更复杂的路由功能,可以将多个Exchange绑定在一起,也可以通过插件机制来实现自己的Exchange。

       3、消息集群

        多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。

       4、高可用

       在同一集群中队列可以被镜像到多台机器,使得在部分节点出现问题的情况下,队列仍然可用。

       5、多协议

       RabbitMQ支持多种消息队列协议。

       6、多语言客户端

       支持java、.NET、Ruby等

       7、管理界面

        RabbitMQ提供了一个易用的用户界面,用户可以监控和管理Broker的许多方面。

       8、跟踪机制

        如果消息异常,RabbitMQ提供了消息跟踪机制,使用者可以找出发生了什么。

       9、插件机制</

当我们使用RabbitMQ处理任务时,通常需要将任务分发到多个工作者节点进行异步执行。下面是一个基于Spring Boot和RabbitMQ异步任务处理示例。 首先,我们需要创建一个工作者节点来处理任务。这个工作者节点需要监听RabbitMQ队列,并在队列中有任务时进行处理。下面是一个简单的工作者节点示例: ```java @Component public class Worker { @RabbitListener(queues = "taskQueue") public void processTask(String task) { // 处理任务逻辑 System.out.println("Processing task: " + task); } } ``` 注意,使用@RabbitListener注解来监听名为“taskQueue”的队列,并在队列中有任务时调用processTask方法进行处理。 接下来,我们需要创建一个生产者节点来发布任务。下面是一个简单的生产者节点示例: ```java @RestController public class TaskController { @Autowired private RabbitTemplate rabbitTemplate; @PostMapping("/task") public void publishTask(@RequestBody String task) { rabbitTemplate.convertAndSend("taskExchange", "taskQueue", task); } } ``` 注意,使用RabbitTemplate将任务发送到名为“taskExchange”的交换机,并将其路由到名为“taskQueue”的队列。 最后,我们需要在应用程序中配置RabbitMQ连接和队列等信息。下面是一个简单的配置类示例: ```java @Configuration public class RabbitMQConfig { @Value("${spring.rabbitmq.host}") private String host; @Value("${spring.rabbitmq.port}") private int port; @Value("${spring.rabbitmq.username}") private String username; @Value("${spring.rabbitmq.password}") private String password; @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost(host); connectionFactory.setPort(port); connectionFactory.setUsername(username); connectionFactory.setPassword(password); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate() { return new RabbitTemplate(connectionFactory()); } @Bean public Queue taskQueue() { return new Queue("taskQueue"); } @Bean public DirectExchange taskExchange() { return new DirectExchange("taskExchange"); } @Bean public Binding binding() { return BindingBuilder.bind(taskQueue()).to(taskExchange()).with("taskQueue"); } } ``` 这个配置类中,我们首先使用@Value注解读取application.properties文件中的RabbitMQ配置信息,然后创建一个ConnectionFactory和RabbitTemplate来连接RabbitMQ。接着,我们创建一个名为“taskQueue”的队列和一个名为“taskExchange”的交换机,并将这个队列绑定到这个交换机上。最后,我们将这个队列绑定到“taskQueue”路由键上。 现在,我们可以使用以上示例,在基于Spring Boot和RabbitMQ的应用程序中异步执行任务了!
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值