AMQP[RabbitMQ]小结

在这里插入图片描述

消息队列:

组成:

交换器,队列,绑定

作用:异步处理,削峰,服务解耦

交换器

RabbitMQ常见的exchange(交换器)类型:

  • direct–路由键完全匹配才可以

  • fanout–广播

  • topic --主题,模糊匹配路由键

队列

messagequeue:

组成:

  • 路由键 routine-key—决定消息发给谁

  • 优先级priority–决定消息发送的优先级

  • 分发模式deliver-mode–决定消息的发送方式–持久化等

绑定

binding:

依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>2.6.4</version></dependency>

配置文件:

spring:rabbitmq:username: zzypassword: 1234host: 172.24.232.166

注册队列:

@Configuration
public class RabbitConfig {@Beanprotected Queue queue(){Queue queue= new Queue("zzy");return  queue;}
}

生产者发送消息

//作为信息的发布者
@SpringBootTest(classes = ApplicationRabbitMq.class)
public class RabbitTest {//Amqp模板类@Autowiredprivate AmqpTemplate amqpTemplate;@Testvoid RabbitTest(){amqpTemplate.convertAndSend("zzy","hello world");System.out.println("success");}
}

消费者消费消息:

@Component  //加注解,不然无法解析
public class RabbitMqConsumer {@RabbitListener(queues = "zzy")//订阅的队列public void Listened1(String msg){System.out.println("取出的消息1----"+msg);}@RabbitListener(queues = "zzy")public void Listened2(String msg){System.out.println("取出的消息2----"+msg);}
}

默认使用direct队列,如果要使用广播队列:

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitFanoutConfig {//准备两个队列@Beanprotected Queue queue() {return new Queue("gavin");}@Beanprotected Queue queue2() {return new Queue("zzy");}//内置fanout交换器名称amq.fanout@Beanprotected FanoutExchange fanoutExchange() {return new FanoutExchange("amq.fanout");}//将交换器和队列绑定@Beanprotected Binding fanoutBinding(Queue queue, FanoutExchange fanoutExchange) {return BindingBuilder.bind(queue).to(fanoutExchange);}@Beanprotected Binding fanoutBinding2(Queue queue2, FanoutExchange fanoutExchange) {return BindingBuilder.bind(queue2).to(fanoutExchange);}
}

一个交换器可以绑定多个队列;

几个重要的注解/Bean

import org.springframework.amqp.core.AmqpTemplate;
@Bean
AmqpTemplate amqpTemplate 
//此模板中有发送消息的方法-------------------------------------
import org.springframework.amqp.core.Queue;
//注册一个队列direct@Beanprotected Queue queue() {return new Queue("gavin");}//注册一个广播交换器@Beanprotected FanoutExchange fanoutExchange() {return new FanoutExchange("amq.fanout");}
//交换器绑定队列//将交换器和队列绑定@Beanprotected Binding fanoutBinding(Queue queue, FanoutExchange fanoutExchange) {return BindingBuilder.bind(queue).to(fanoutExchange);}
//注册一个topic交换器@Beanprotected TopicExchange topicExchange() {return new TopicExchange("amq.topic");}
//绑定队列//将交换器和队列绑定@Beanprotected Binding TopicBind1(Queue queue, TopicExchange topicExchange) {return BindingBuilder.bind(queue).to(topicExchange).with("com.gavin.*");//匹配路由规则}

消费者:

 @RabbitListener(queues = "gavin")该方法从对列中消费消息

消息重复消费原因:

消费完毕后本该向broker发送ack,但是由于网路延迟较高过了broker等待的时间,于是broker会把消息再次投递到consumer

解决方案:

数据库—处理消息前,使用消息主键在表中带有约束的字段中insert,插入成功则消费成功,插入失败则已经消费过了,不再进行消费

Map–单机版的使用ConrrentHashMap ->putifAbsent

Redis --分布式锁

保证消息队列的消费顺序

同一个topic,同一个queue,发的时候让一个线程去发,消费的时候让一个线程去消费,如果多线程暂时无法保证消费的有序性

怎么保证消息发送到同一个queue?

RocketMQ 提供了一个MessageQueueSelector 接口,重写接口方法

RocketMQ如何保证消息不丢失

Producer端:

采用send()同步发消息,发送结果是同步感知的;

Broker端:

设置数显策略为同步刷新策略

集群部署,配置主从,高可用模式

Consumer端:

消费正常后再进行手动ACK确认

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

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

相关文章

【解决方法】树莓派4B安装wiringpi失败、gpio -v与gpio readall命令not found(arm64架构)

问题描述 树莓派信息&#xff1a;#4B# #64位# #aarch# 使用 gpio -v 或 gpio readall 命令时显示 cmmand not foung安装好 RPi.GPIO &#xff08;安装命令&#xff1a;pip install RPi.GPIO&#xff09;仍旧不能使用上述命令安装好 wiringpi 结果报错 wiringpi:armhf 原因分析…

作为产品经理,你是如何分析和管理你的产品需求的?

作为一名产品经理&#xff0c;分析和管理产品需求是非常重要的工作。在产品开发周期中&#xff0c;需求调研、需求分析、需求管理等环节都是非常关键的&#xff0c;因为好的需求管理能够直接影响产品的质量和用户体验。 需求调研 在进行需求调研的过程中&#xff0c;我们首先…

windows RocketMQ与可视化监控平台安装

windows RocketMQ与可视化监控平台安装 安装日期2023.09.21 最新版 RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件&#xff0c;搭建RocketMQ需要先配置JAVA环境变量,需要有JAVA_HOME。 下载安装包 进入官网选择需要的版本下载安装包&#xff08;以下以5.1.3为例…

Swift data范围截取问题

文章目录 一、截取字符串的几种方法1. 截取前几位2. 截取后几位3. subData4. 下标截取 二、subData(in:) 报错 EXC_BREAKPOINT 一、截取字符串的几种方法 1. 截取前几位 mobileID.prefix(32)2. 截取后几位 mobileID.suffix(3)3. subData data.subdata(in: 0..<4)4. 下标…

全渠道客服体验:Rocket.Chat 的无缝互动 | 开源日报 No.41

RocketChat/Rocket.Chat Stars: 36.9k License: NOASSERTION Rocket.Chat 是一个完全可定制的开源通信平台&#xff0c;适用于具有高标准数据保护要求的组织。我们是团队沟通场景下的最终免费开源解决方案&#xff0c;可以实现同事之间、公司之间或客户之间的实时对话。提高生…

Visual Studio 如何删除多余的空行,仅保留一行空行

1.CtrlH 打开替换窗口&#xff08;注意选择合适的查找范围&#xff09; VS2010: VS2017、VS2022: 2.复制下面正则表达式到上面的选择窗口&#xff1a; VS2010: ^(\s*)$\n\n VS2017: ^(\s*)$\n\n VS2022:^(\s*)$\n 3.下面的替换窗口皆写入 \n VS2010: \n VS2017: \n VS2022: \n …

Lnmp架构之mysql数据库实战2

4、mysql组复制集群 一主多从的请求通常是读的请求高于写 &#xff0c;但是如果写的请求很高&#xff0c;要求每个节点都可以进行读写&#xff0c;这时分布式必须通过&#xff08;多组模式&#xff09;集群的方式进行横向扩容。 组复制对节点的数据一致性要求非常高&#xff…

【运维】dockerfile 中的COPY 会覆盖文件夹吗

Dockerfile 中的 COPY 命令会根据指定的源路径将文件或文件夹复制到容器中的目标路径。行为取决于两个因素&#xff1a;源路径和目标路径以及目标路径的类型。 源路径是文件&#xff0c;目标路径是文件&#xff1a; 如果源路径是文件&#xff0c;目标路径也是文件&#xff0c;则…

【Python基础】if __name__ == ‘__main__‘:和assert函数

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

经典垃圾回收器

Serial收集器 Serial 是一种新生代的收集器。顾名思义“serial 串行”&#xff0c;它是一种单线程工作的收集器&#xff0c;它的“单线程”并不仅仅指的只有一个处理器或一个线程来实现垃圾的收集工作&#xff0c;更重要的是他在垃圾收集的过程中会暂停所有的用户线程&#xf…

VB6.0实现修改EXE程序的图标

当你给一家公司做技术支持的时候&#xff0c;需求各种各样的&#xff0c;其中今天遇到就是要修改某个程序的图标&#xff0c;代码实现如下。 // q1016058890 群 214016721 //注 意&#xff1a;这个方法貌似只对有些EXE文件有效&#xff0c;这不是万能的方法&#xff0c;此…

MySQL关于日期函数的使用-笔记

韩老师笔记 select current_time select CURRENT_DATE create table mes ( id int, content VARCHAR(255), send_time DATETIME ) select * from mes; insert into mes values(1,北京,CURRENT_DATE) insert into mes (id,send_time) values(2,CURRENT_TIME) insert into mes v…

数字音频工作站FL Studio 21中文版下载及电音编曲要用乐理吗 电音编曲步骤

FL Studio 21是一款强大的数字音频工作站&#xff08;DAW&#xff09;软件&#xff0c;为您提供一个完整的软件音乐制作环境。它是制作高质量的音乐、乐器、录音等的完整解决方案。该程序配备了各种工具和插件&#xff0c;帮助你创建专业的虚拟乐器&#xff0c;如贝斯、吉他、钢…

SpringMVC 学习(四)RestFul 风格

5. RestFul 风格 5.1 简介 概念 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议&#xff0c;只是一种风格。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。 功能 资源&#xff1a;互联网所有的事物都可以被抽象为…

【Phoenix】phoenix实现每个Primarykey主键保留N版本数据,CDC数据记录为Changelog格式

一、背景&#xff1a; CDC数据中包含了&#xff0c;数据的变更过程。当CDC写入传统数据库最终每一个primary key下会保存一条数据。当然可以使用特殊手段保存多分记录但是显然造成了数据膨胀。 另外数据湖Hudi(0.13.1)是不支持保存所有Changelog其Compaction机制会清除所有旧版…

Cross Attention和 Self- Attention 的区别?

Cross Attention和Self-Attention都是深度学习中常用的注意力机制&#xff0c;用于处理序列数据&#xff0c;其中Self-Attention用于计算输入序列中每个元素之间的关系&#xff0c;Cross Attention则是计算两个不同序列中的元素之间的关系。它们的主要区别在于计算注意力分数时…

算法 只出现一次的两个数字-(哈希+异或)

牛客网: BM52 题目: 数组中仅2个数字出现1次&#xff0c;其余出现2次 思路: 出现2次的数字异或结果为0&#xff0c;另外两个不同的数字异或结果res不为0&#xff0c;异或结果的二进制位必与其中一个相同&#xff0c;求出二进制位为1的pos, 遍历数组&#xff0c;所有此位置为1…

安卓recovery流程分析(编译、界面、图片)

目录 recovery 界面菜单 recovery 界面操作 recovery 启动流程 recovery 编译makefile recovery 图片大小 ramdisk、boot.img、recovery.img之间的关系 authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 recovery 界面菜单 recovery 界面显示 android recoveryuse …

LINUX -SQL笔记(自学用)

1.安装 sudo apt-get install mysql-server sudo mysql -u root -p2.关系模型 在关系数据库中&#xff0c;一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成的。 每一条记录都包含若干定义好的字段。同一个表的所有记录都有相同的字段定义。 对于关系表&#…

TCP协议和UDP协议

TCP通信原理 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种传输层协议&#xff0c;它主要负责点对点的数据传输TCP 主要特点是面向连接的&#xff0c;也就是说&#xff0c;在数据传输之前&#xff0c;它需要先建立一个连接。连接建…