整合消息队列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: localhost
    port: 5672
    username: guest
    password: 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 {

    @Resource
    private 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.mfbz.cn/a/229190.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++STL的string模拟实现

文章目录 前言string的成员变量成员函数构造函数拷贝构造赋值重载 模拟实现string各种接口print迭代器普通迭代器const迭代器 string比较大小push_backinsert 和 eraseinserterase reserve和resizereserveresize swapfindcout和cincoutcin 前言 今天要讲string的底层实现&…

docker---资源控制

docker的资源控制 对容器使用宿主机的资源进行限制。 三种控制方向&#xff1a;CPU 内存 磁盘I/O docker使用linux自带的功能cgroup&#xff1b;control groups是linux内核系统提供的一种可以限制记录&#xff0c;隔离进程所使用的物理资源机制。 docker借助此…

每日一练 | 华为认证真题练习Day145

1、一台路由器通过RIP、OSPF和静态路由都学习到了到达同一目的地址的路由。默认情况下&#xff0c;VRP将最终选择通过哪种协议学习到的路由&#xff1f; A. 三种协议学习到的路由都选择 B. 静态路由 C. OSPF D. RIP 2、如果网络管理员没有配置骨干区域&#xff0c;则路由器…

el-table 表格多选(后端接口搜索分页)实现已选中的记忆功能。实现表格数据和已选数据(前端分页)动态同步更新。

实现效果&#xff1a;&#xff08;可拉代码下来看&#xff1a;vue-demo: vueDemo&#xff09; 左侧表格为点击查询调用接口查询出来的数据&#xff0c;右侧表格为左侧表格所有选择的数据&#xff0c;由前端实现分页。 两个el-table勾选数据联动更新 实现逻辑&#xff1a; el-…

MQTT协议对比TCP网络性能测试模拟弱网测试

MQTT正常外网压测数据---时延diff/ms如下图&#xff1a; MQTT弱网外网压测数据 TCP正常外网压测数据 TCP弱网外网压测数据 结论&#xff1a; 在弱网场景下&#xff0c;MQTT和TCP的网络性能表现会有所不同。下面是它们在弱网环境中的对比&#xff1a; 连接建立&#xff1a;M…

华清远见嵌入式学习——QT——作业2

作业要求&#xff1a; 代码运行效果图&#xff1a; 登录失败 和 最小化 和 取消登录 登录成功 和 X号退出 代码&#xff1a; ①&#xff1a;头文件 #ifndef LOGIN_H #define LOGIN_H#include <QMainWindow> #include <QLineEdit> //行编辑器类 #include…

Rust测试字符串的移动,Move

代码创建了一个结构体&#xff0c;结构体有test1 字符串&#xff0c;还有指向字符串的指针。一共创建了两个。 然后我们使用swap 函数 交换两个结构体内存的内容。 最后如上图。相同的地址&#xff0c;变成了另外结构体的内容。注意看指针部分&#xff0c;还是指向原来的地址…

想转行IT,有前途吗?

作为一个在工程领域工作了三年的人&#xff0c;我深知转行到 IT&#xff0c;尤其是网络安全领域&#xff0c;不是一件轻松的事。我的经历或许能为你提供一些启示。 在我之前的工作中&#xff0c;虽然工作量大、压力重&#xff0c;但总觉得缺少了某种成就感和动力。我意识到&a…

Flutter代码补全

有的时候属性不经常使用&#xff0c;就想不起来该用啥&#xff0c;只有点点印象&#xff1b;只能用代码补全功能&#xff0c;但我用了AS的默认操作发下并不好使&#xff0c;估计是快捷键冲突了。刚开始是不是下面的效果&#xff1a;这肯定不是我们想要的。 不怕&#xff0c;接下…

XML是什么

XML是是什么&#xff1f; XML&#xff08;Extensible Markup Language&#xff09;&#xff0c;中文是可扩展标记语言&#xff0c;是标准通用标记语言的子集。它是一种标记语言&#xff0c;用于标记电子文档&#xff0c;使其结构化。 XML可以用来标记数据&#xff0c;定义数据…

代码随想录算法训练营第五十九天【单调栈part2】 | 503.下一个更大元素II、42. 接雨水

503.下一个更大元素II 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 重点在如何处理循环数组。 方案一&#xff1a; 直接将两个数组拼接在一起&#xff0c;然后使用单调栈求下一个最大值。 方案二&#xff1a; 在遍历的过…

提醒事项日历同步怎么设置?可实时同步日历的提醒事项工具

随着生活节奏的加快&#xff0c;我们每天都需要处理许多琐碎的事务。为了不忘记重要的事情&#xff0c;很多人选择使用提醒事项工具来帮助自己。然而&#xff0c;市场上的提醒事项工具五花八门&#xff0c;有些并不具备日历月视图功能&#xff0c;也无法与手机日历同步&#xf…

【Linux系统编程】项目自动化构建工具make/Makefile

介绍&#xff1a; make和Makefile是用于编译和构建C/C程序的工具和文件。Makefile是一个文本文件&#xff0c;其中包含了编译和构建程序所需的规则和指令。它告诉make工具如何根据源代码文件生成可执行文件&#xff0c;里面保存的是依赖关系和依赖方法。make是一个命令行工具&a…

paddleocr文字识别变迁

数据挖掘 v3 UIM&#xff1a;无标注数据挖掘方案 UIM&#xff08;Unlabeled Images Mining&#xff09;是一种非常简单的无标注数据挖掘方案。核心思想是利用高精度的文本识别大模型对无标注数据进行预测&#xff0c;获取伪标签&#xff0c;并且选择预测置信度高的样本作为训…

如何提升软文推广效果?这三招大部分人都不知道

内容为王的时代下不少企业都把软文推广作为宣传的主要手段&#xff0c;但不是每一次软文推广的效果都会如意。今天媒介盒子就来和大家分享提升软文推广效果的小诀窍&#xff0c;让企业宣传事半功倍。 一、以质取胜 虽然软文营销是一个长期积累的过程&#xff0c;但不代表数量决…

鸿蒙4.0开发笔记之ArkTS语法基础之数据传递与共享详细讲解(十八)

文章目录 一、路由数据传递&#xff08;router&#xff09;1、路由数据传递定义2、路由数据传递使用方法3、数据传递两个页面的效果 二、页面间数据共享&#xff08;EntryAbility&#xff09;1、定义2、实现案例3、避坑点 三、数据传递练习 一、路由数据传递&#xff08;router…

梳理一下嵌入式和单片机之间的关系

一定有很多人都听说过嵌入式和单片机&#xff0c;但在刚开始接触时&#xff0c;不知道大家有没有听说过嵌入式就是单片机这样的说法&#xff0c;其实嵌入式和单片机还是有区别的。单片机与嵌入式到底有什么关系&#xff1f; 下面我们就来说说嵌入式和单片机之间的联系和区别吧…

信息可视化在数字孪生中的应用:打造直观决策支持系统

在当今的数字化时代&#xff0c;数字孪生和信息可视化已成为推动各行业发展的重要力量。数字孪生为物理世界提供了一个虚拟的副本&#xff0c;而信息可视化则将复杂的数据以易于理解的方式呈现出来。两者之间的关系密切&#xff0c;相辅相成&#xff0c;为决策者提供了更全面、…

如何解决el-table中动态添加固定列时出现的行错位

问题描述 在使用el-table组件时&#xff0c;我们有时需要根据用户的操作动态地添加或删除一些固定列&#xff0c;例如操作列或选择列。但是&#xff0c;当我们使用v-if指令来控制固定列的显示或隐藏时&#xff0c;可能会出现表格的行错位的问题&#xff0c;即固定列和非固定列…

定时器TIM HAL库+cubeMX(上)

定时器时钟源APB1 36MHz 一.基本定时器 1.基本框图 2.溢出时间计算 3.配置定时器步骤 TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) {g_timx_handle.Instance TIM6;g_timx_handle.Init.Prescaler p…