MQ回顾之rabbitmq速通

news2025/2/4 2:33:26

rabbitMQ相对来说功能比较完善,吞吐量会低一点。

持续更新……

安装

docker

测试选择docker安装

官方安装操作

1、docker pull rabbitmq:latest

2、docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq

3、docker exec -it 容器id /bin/bash

        3.1、rabbitmq-plugins enable rabbitmq_management

消费者确认机制ack

如果一个消费者在没有发送ack的情况下死亡(它的信道被关闭、连接被关闭或TCP连接丢失),RabbitMQ会认为消息没有被完全处理,并将其重新排队。如果同时有其他消费者在线,它会很快将其重新交付给另一个消费者。

关键代码案例-消费

// 一次只接受一个未被ack的消息
channel.basicQos(1);
// 手动ack
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
// 设置不自动ack
boolean autoAck = false;
channel.basicConsume(QUEUE_NAME, autoAck, deliverCallback, consumerTag -> { });

消费者未ack时将会被阻塞,在消费者交付确认时强制执行超时(默认为30分钟)。这有助于检测那些从不承认交付的有问题(卡住)的消费者。

生产者确认机制confirms和事务

生产者将信道设置成confirm模式,所有在该信道上面发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID)。confirm模式最大的好处在于他是异步的,生产者可以在等信道返回确认的同时继续发送下一条消息。

同步确认:publisher-confirm-type: simple

异步确认:publisher-confirm-type: correlated

RabbitMQ中与事务机制有关的方法有三个:txSelect(), txCommit()以及txRollback(), txSelect用于将当前channel设置成transaction模式,txCommit用于提交事务,txRollback用于回滚事务。

消息持久化

关键代码案例-发布

boolean durable = true;
channel.queueDeclare("hello", durable, false, false, null);

// 标记持久消息

channel.basicPublish("", "task_queue",
            MessageProperties.PERSISTENT_TEXT_PLAIN,
            message.getBytes());

需要注意的是:RabbitMQ不允许你用不同的参数重新定义一个已经存在的队列,任何尝试这样做的程序都会返回错误。

任务分配

在不配置情况下它不会查看消费者的未确认消息数量。它只是盲目地将第n条消息分发给第n个消费者。它会均匀地分发消息,而不考虑消费者的消费能力。

为了克服这个问题,我们可以使用prefetchCount = 1的basicQos方法。这告诉RabbitMQ不要一次给worker发送多条消息。换句话说,在worker处理并确认前一条消息之前,不要将新消息分发给worker。相反,它会将其分发给下一个不忙的worker。防止消费能力差/任务重的消费者堆积

关键代码案例-消费

// 一次只接受一个未被ack的消息
channel.basicQos(1);

Exchanges交换器

RabbitMQ消息模型的核心思想是生产者从不直接将任何消息发送到队列。实际上,很多情况下,生产者根本不知道消息是否会被传递到任何队列。

生产者只能向exchange发送消息(通常情况下,也可以直接向队列发消息,不推荐),exchange必须确切地知道如何处理接收到的消息。这些规则由exchange类型定义。

交换类型分为:direct、topic、headers和fanout

  • fanout:它将接收到的所有消息广播给它知道的所有队列。
  • direct:消息将发送到绑定键与消息的路由键完全匹配的队列。
  • topic: 路由键是由点分隔的单词,不超过255 bytes。特殊符号*表示替代一个词;特殊符号#表示替代零个或多个词。
  • headers:设置key和value的规则和queue绑定,需要设置验证消息的header。性能差,一般不用。

临时队列

队列用完即删。

服务器为我们选择一个随机的队列名称。一旦我们断开了消费者的连接,队列被自动删除。

String queueName = channel.queueDeclare().getQueue();

Bindings绑定

交换器和队列之间的关系称为绑定(binding)。

模板

channel.queueBind(queueName, exchangesName, "");

从${exchangesName}里来的消息将会发往${queueName}

参数routingKey

上边模板可以看出来bind还有第三个参数,这个参数是routingKey。如果交换类型是fanout则会忽略此值。可以使用direct模式

需要注意的是使用同一个绑定键绑定多个队列是完全可以的。

模拟实现RPC

常用消息属性

deliveryMode:将消息标记为持久的(值为2)或临时的(任何其他值)

contentType:用于描述编码的mime-type。

replyTo:通常用于命名回调队列

correlationId:用于将RPC响应与请求关联起来

 总览

生产者向request-queue发送消息并且为每个消息创建单独的reply-queue供消费者发送响应,生产者通过CompletableFuture阻塞获取响应。

消费者消费request-queue消息并且拿到消息中的reply-queue-name,向其发送调用响应。

官方代码案例:RPCClient.java and RPCServer.java.

死信队列

死信队列需要配置和队列的关联。

来自队列的消息可能是死信(dead-lettered)意味着当以下事件发生时,消会息重新发布到交换器。

  • 消息通过被消费者使用basic.reject或者basic.nack以及requeue参数设置为false去否定
  • 消息生存时间过期。
  • 因为队列限制,消息被丢弃。

注意:如果是队列过期,则不会使消息变为死信。

如果没配置死信队列出现以上情况,消息则会被丢弃

消息TTL和队列TTL

可以和死信队列配合用作设计超时订单,延时消息。

消息TTL决定消息在队列中可以保留多长时间。如果消息在队列中的保留时间超过了该消息的TTL,则该消息将过期而被丢弃。

懒惰队列

定义:队列中的消息实际上尽可能早地移动到磁盘。这些消息只有在使用者请求时才加载到内存中。

使用场景:消费能力差,队列消息太多,内存不足导致队列进程阻塞。

优先级队列

队列优先级是0~255可选的一个整数,不建议设置太大,原因是:每个队列的每个优先级都有一些内存和磁盘开销。这还会产生额外的CPU成本。强烈建议在1~5之间。

批量发送消息

rabbitMQ批量发送的消息和其他mq不同,在broker存储的是一条聚合消息。另外,BatchingRabbitTemplate 提供的批量发送消息的能力比较弱。对于同一个 BatchingRabbitTemplate 对象来说,同一时刻只能有一个批次(保证 Exchange + RoutingKey 相同),否则会报错。

spring中消费异常处理

在执行顺序上,RabbitListenerErrorHandler 于 ErrorHandler 执行。不过这个需要建立在一个前提上,RabbitListenerErrorHandler 需要继续抛出异常。

另外,RabbitListenerErrorHandler 需要每个 @RabbitListener 注解上,需要每个手动设置下 errorHandler 属性。而 ErrorHandler 是相对全局的,所有 SimpleRabbitListenerContainerFactory 创建的 SimpleMessageListenerContainer 都会生效。

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

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

相关文章

C/C++ C++入门

个人主页:仍有未知等待探索-CSDN博客 专题分栏:C_仍有未知等待探索的博客-CSDN博客 目录 一、C关键字 二、命名空间 1、区别 1. C语言 ​编辑 2. C 2、命名空间定义 3、命名空间的使用 三、C输入&输出 四、缺省参数 五、函数重载 六、引用 …

80.如何评估一台服务器能承受的最大TCP连接数

文章目录 一、一个服务端进程最多能支持多少条 TCP 连接?二、一台服务器最大最多能支持多少条 TCP 连接?三、总结 一个服务端进程最大能支持多少条 TCP 连接? 一台服务器最大能支持多少条 TCP 连接? 很多朋友可能第一反应就是端…

【RT-DETR有效改进】利用YOLO-MS的MSBlock模块改进ResNet中的Bottleneck(RT-DETR深度改进)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块),我们将其用于替换我们ResNet中Basic组合出一种新的结构,来替换我们网络中的…

Spring:JDBCTemplate 的源码分析

一:JdbcTemplate的简介 JdbcTemplate 是 Spring Template设置模式中的一员。类似的还有 TransactionTemplate、 MongoTemplate 等。通过 JdbcTemplate 我们可以使得 Spring 访问数据库的过程简单化。 二:执行SQL语句的方法 1:在JdbcTempla…

智能末世战争之机器人的反击

在遥远的未来,地球陷入了一场空前的战争。这场战争不同于以往的任何战争,因为这是由人工智能和机器人主导的战争。在战争爆发之前,人类一直依赖AI和机器人来提高生产效率和生活质量。然而,随着AI技术的飞速发展,机器人…

H5 简约四色新科技风引导页源码

H5 简约四色新科技风引导页源码 源码介绍:一款四色切换自适应现代科技风动态背景的引导页源码,源码有主站按钮,分站按钮2个,QQ联系站长按钮一个。 下载地址: https://www.changyouzuhao.cn/11990.html

flinkcdc 3.0 尝鲜

本文会将从环境搭建到demo来全流程体验flinkcdc 3.0 包含了如下内容 flink1.18 standalone搭建doris 1fe1be 搭建整库数据同步测试各同步场景从检查点重启同步任务 环境搭建 flink环境(Standalone模式) 下载flink 1.18.0 链接 : https://archive.apache.org/dist/flink/flink…

【大数据】专业融合型人才迎来发展良机-国家数据局正式揭牌

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 摘要: 新华社北京10月26日电 《中国证券报》26日刊发文章…

shell - 正则表达式和grep命令和sed命令

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符: 大小写字母、数字、标点符号及一些其它符号元字符: 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

git修改密码后mac使用sourceTree出现Authentication failed错误

1、退出sourceTree 2、在钥匙串中删除git对应站点Access Key 3、执行命令:git config --system --unset credential.helper 4、重新启动sourceTree,这时会弹出输入密码框,重新输入密码即可

react 之 UseMemo

useMemo 看个场景 下面我们的本来的用意是想基于count的变化计算斐波那契数列之和,但是当我们修改num状态的时候,斐波那契求和函数也会被执行,显然是一种浪费 // useMemo // 作用:在组件渲染时缓存计算的结果import { useState …

树——二叉搜索树

二叉搜索树 概述 随着计算机算力的提升和对数据结构的深入研究,二叉搜索树也不断被优化和扩展,例如AVL树、红黑树等。 特性 二叉搜索树(也称二叉排序树)是符合下面特征的二叉树: 树节点增加 key 属性,用来…

Git介绍与常用命令总结

Git介绍与其常用命令总结 1、Git介绍2、Git的使用3、Git常用命令3.1 初始化仓库3.2 克隆仓库3.3 配置用户信息3.4 提交代码(Commit)3.5 推送代码(Push)3.6 拉取代码(Pull)3.7 分支(Branch)3.8 远程仓库(Remote)3.9 撤销回退本地改动3.10 更新本地仓库与远程仓库 1、Git介绍 Gi…

编程流程图

对于复杂流程,我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下: processOn: 这个是我之前 一直的选择,他可以画上面的这些,流程图,网页操作,但是他不是免费的,查过…

【LVGL环境搭建】

LVGL环境搭建 win模拟器环境搭建一.二.三.四.五. Ubuntu模拟器环境搭建一. 前置准备二. 下载LVGL Source code:三. 安装sdl2:四. 开启VScode执行五. 安装扩展套件六. 按F5执行七. 执行结果 win模拟器环境搭建 一. 二. 三. 四. 五. Ubuntu模拟器环境…

同城上门预约软件开发:改变生活服务模式

随着互联网技术的飞速发展,人们的生活方式也在发生着深刻的变化。特别是在生活服务领域,新的需求和模式不断涌现。其中,同城上门预约服务正逐渐成为一种新的趋势。本文将探讨开发同城上门预约软件的意义、市场需求、功能设计以及面临的挑战。…

C++类和对象入门(一)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、面相过程和面向对象的初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤&#…

大语言模型之LlaMA系列-LlaMA 2及LlaMA_chat(下)

多转一致性的系统消息 - System Message for Multi-Turn Consistency 在对话设置中,某些指示应适用于所有对话轮次。 例如,简洁地响应,或"充当"某个公众人物。当我们向Llama 2-Chat提供此类指示时,后续应响应始终遵守约…

专业139总分400+南昌大学811信号与系统考研经验电子信息与通信工程集成电路

今年专业课811信号与系统139分,总分400,顺利上岸南昌大学,回首这一年的复习,有很多经验想和大家分享,希望对大家复习会有一些帮助。专业课:139分,811信号与系统 主要参考书:《信号与…

2024年人工智能应用与先进制造科学国际学术会议(ICAIAAMS 2024)

2024年人工智能应用与先进制造科学国际学术会议(ICAIAAMS 2024) 2024 International Conference on Artificial Intelligence Applications and Advanced Manufacturing Science (ICAIAAMS 2024) 会议简介: 2024年人工智能应用与先进制造科学国际学术会议&#xff…