整合消息队列RabbitMQ

为什么使用消息队列MQ?

因为使用消息队列有多个好处:可以实现系统服务的解耦、异步和削峰:

  1. 异步通信:消息队列提供了一种异步通信的方式,发送方可以将消息发送到队列中,然后继续执行其他任务,而不需要等待接收方的响应。这种异步通信方式可以提高系统的响应速度和吞吐量。
  2. 解耦系统:通过引入消息队列,不同的系统或模块可以通过消息进行通信,而不直接依赖于彼此的实时可用性。这种解耦可以降低系统之间的耦合度,使系统更加灵活、可维护和可扩展。
  3. 削峰填谷:在高并发场景下,消息队列可以作为一个缓冲层,平衡生产者和消费者之间的速度差异。当生产者的请求量暴增时,消息队列可以暂时存储消息,使消费者可以按照自身的处理能力逐渐消费这些消息,从而避免系统崩溃或过载。

A服务直接把某个功能的消息发给消息队列,B服务从消息队列中取出消息,然后执行任务,这样完成了项目的解耦,同时异步执行了这个任务。

特点:
  1. 灵活的消息路由:RabbitMQ支持多种灵活的消息路由方式,包括直接交换、主题交换、扇形交换等,可以根据消息的特征将消息路由到不同的队列。
  2. 可靠性:RabbitMQ提供持久化机制,可以将消息持久化到磁盘上,确保消息不会丢失。同时,它还支持发布确认和消费确认机制,保证消息的可靠传递。
  3. 高可用性:RabbitMQ支持集群部署,可以将多个节点组成一个集群,提供高可用性和负载均衡。
  4. 多语言支持:RabbitMQ提供了多种编程语言的客户端库,使得开发者可以使用各种语言来与RabbitMQ进行交互。
  5. 可扩展性:RabbitMQ提供了插件机制,可以根据需要添加新的功能和特性。
基本概念:
  1. Producer(生产者):负责向RabbitMQ发送消息。
  2. Consumer(消费者):负责接收和处理RabbitMQ中的消息。
  3. Queue(队列):消息在RabbitMQ中的存储区域,消息发送到交换机后最终被投递到队列中等待消费者消费。
  4. Exchange(交换机):接收生产者发送的消息,并根据规则将消息路由到一个或多个队列中。
  5. Binding(绑定):用于将交换机和队列之间建立关联关系,定义了消息如何从交换机路由到队列。
  6. Routing Key(路由键):生产者在发送消息时,可以指定一个路由键,交换机根据路由键将消息路由到相应的队列。
使用:

1、引入依赖:

        <!--        消息队列--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

2、引入配置

  rabbitmq:host: localhostport: 5672username: guestpassword: guest

3、创建交换机和队列

    public static void doInit(){try{ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("host");connectionFactory.setPort(5672);connectionFactory.setUsername("name");connectionFactory.setPassword("pass");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();String EXCHANGE_NAME = "code_exchange"; //交换机channel.exchangeDeclare(EXCHANGE_NAME,"direct");
//            创建队列,写一个队列名String queueName = "code_queue";channel.queueDeclare(queueName,true,false,false,null);channel.queueBind(queueName,EXCHANGE_NAME,"my_routingKey");log.info("创建MQ成功");}catch (Exception e){log.error("创建MQ失败");e.printStackTrace();}}
  1. 生产者代码
package com.stukk.stuojbackendquestionservice.message;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** @Author: stukk* @Description:* @DateTime: 2023-12-07 21:08**/
@Component
public class MyMessageProducer {@Resourceprivate RabbitTemplate rabbitTemplate;public void sendMessage(String exchange,String routingKey, String message){rabbitTemplate.convertAndSend(exchange,routingKey,message);}}
  1. 消费者代码
package com.stukk.stuojbackendjudgeservice.message;import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;/*** @Author: stukk* @Description: 消费者* @DateTime: 2023-12-07 21:17**/
@Component
@Slf4j
public class MyMessageConsumer {//    指定监听的队列和确认机制@SneakyThrows@RabbitListener(queues = {"code_queue"}, ackMode = "MANUAL")public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long deliverTag){log.info("获取到消息:{}", message);
//   根据传递的消息来执行需要执行的业务channel.basicAck(deliverTag,false);}}

确定好要传递的消息,就可以执行你需要的业务了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/258789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Linux源码趣读》| 好书推荐

目录 一. &#x1f981; 前言二. &#x1f981; 像小说一样趣读 Linux 源码三. &#x1f981; 学习路线 一. &#x1f981; 前言 最近、道然科技给狮子送了两本书&#xff1a;一本是付东来的《labuladong的算法笔记》、一本是闪客著的《Linux源码趣读》&#xff0c;《labulado…

基于AIS数据的船舶密度计算与规律研究

参考文献&#xff1a;[1]陈晓. 基于AIS数据的船舶密度计算与规律研究[D].大连海事大学,2021.DOI:10.26989/d.cnki.gdlhu.2020.001129. 谢谢姐姐的文章&#xff01; 网格化AIS数据 网格化 AIS 数据是处理和分析船舶轨迹数据的一种有效方法&#xff0c;特别是当涉及到密度计算和…

unity3d摄像机和观察对象坐标轴修正

让摄像机与观察对象在场景层级并列&#xff0c;以世界坐标看齐 &#xff0c;在local模式&#xff0c;只调整模型或者摄像机方向

案例063:基于微信小程序的传染病防控宣传系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

多线程并发Ping脚本

1. 前言 最近需要ping地址&#xff0c;还是挺多的&#xff0c;就使用python搞一个ping脚本&#xff0c;记录一下&#xff0c;以免丢失了。 2. 脚本介绍 首先检查是否存在True.txt或False.txt文件&#xff0c;并在用户确认后进行删除&#xff0c;然后从IP.txt的文件中读取IP地…

docker的资源控制

docker容器的资源控制 Docker通过Cgroup 来控制容器使用的资源配额&#xff0c;包括CPU、内存、磁盘三大方面&#xff0c;基本覆盖了常见的资源配额和使用量控制。Cgroup 是ControlGroups的缩写&#xff0c;是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(…

自学网络安全的三个必经阶段(含学习笔记)

学习网络安全技术的方法无非三种: 第一种是报网络安全专业&#xff0c;现在叫网络空间安全专业&#xff0c;主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内…

12.8 作业 C++

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

一篇文章带你快速入门 Nuxt.js 服务端渲染

1. Nuxt.js 概述 1.1 我们一起做过的SPA SPA&#xff08;single page web application&#xff09;单页 Web 应用&#xff0c;Web 不再是一张张页面&#xff0c;而是一个整体的应用&#xff0c;一个由路由系统、数据系统、页面&#xff08;组件&#xff09;系统等等&#xff0…

HbuilderX使用Uniapp+Vue3安装uview-plus

如果你是vue2版本想使用uniapp去配置uviewui库可以参考之前的文章 小程序的第三方ui库推荐较多的还是uview的&#xff0c;看起来比较美观&#xff0c;功能也比较完善&#xff0c;下面将提一下Vue3安装uview-plus库的教程 创建项目 安装 首先进入官网 uView-Plus 直接下载并导…

Spring全面详解

目录 1. Spring 概述 1.1 Spring是什么 1.2 Spring的作用 1.3 Spring IoC是什么 2. Spring 快速入门 3. Spring Bean 3.1 的实例化方式 空参构造器 3.2 的属性注入 全参构造器注入 setter方法注入 策略模式 3.3 注解管理 3.4 注解方式的属性注入 1. Spring 概述 …

Spring框架学习:Bean生命周期

目录 SpringBean的生命周期 Bean实例属性填充 三级缓存 常用的Aware接口 Spring IoC容器实例化Bean总结 SpringBean的生命周期 Spring Bean的生命周期是从 Bean 实例化之后&#xff0c;即通过反射创建出对象之后&#xff0c;到Bean成为一个完整对象&#xff0c;最终存储到…