MQ回顾之rabbitmq速通

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.mzph.cn/news/661136.shtml

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

相关文章

transformer_正余弦位置编码代码笔记

transformer_正余弦位置编码代码笔记 transformer输入的序列中,不同位置的相同词汇可能会表达不同的含义,通过考虑位置信息的不同来区分序列中不同位置的相同词汇。 位置编码有多种方式,此处仅记录正余弦位置编码 正余弦位置编码公式如下&…

idea+javafx的真正打包方式

概述:看到网上很多乱说javafx如何打包的,这里写一篇真正可以打包javafx的。 注:使用java17即使里面没有javafx,也是可以运行javafx项目的,只要你们按照下面一步一步来即可。 第一步:编写一个类去调用主类…

ArXiv| Graph-Toolformer: 基于ChatGPT增强提示以赋予大语言模型图数据推理能力

ArXiv| Graph-Toolformer: 基于ChatGPT增强提示以赋予大语言模型图数据推理能力. 来自加利福利亚大学戴维斯分校计算机科学系的IFM实验室发表在arXiv上的文章:“Graph-ToolFormer: To Empower LLMs with Graph Reasoning Ability via Prompt Augmented by ChatGPT”。 文章的…

2.1总结

还是一样水更一天,就随便做了几个题,有一个周期有点长,后面更一篇长的 随手刷的一道水题,就不往今天的行程单添了 问题:最大公约数 题解:题目太水了,就是求三个数,其中两组的最大公…

PyTorch识别验证码

## 一、生成测试集数据pip install captcha common.py import random import time captcha_array list("0123456789abcdefghijklmnopqrstuvwxyz") captcha_size 4from captcha.image import ImageCaptchaif __name__ __main__:for i in range(10):image ImageC…

this.$store undefined

报错:vuex报错 this.$store显示undefined,可能存在的问题,从以下几个方向排查 1、查看store文件中的vuex实例对象是否暴漏 2、main.js中是否注入store 3、如果上边均没问题,打开package.json,查看vue与vuex的版本&am…

el-upload子组件上传多张图片(上传为files或base64url)

场景: 在表单页,有图片需要上传,表单的操作行按钮中有上传按钮,点击上传按钮。 弹出el-dialog进行图片的上传,可以上传多张图片。 由于多个表单页都有上传多张图片的操作,因此将上传多图的el-upload定义…

Web中的转发与重定向

转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一…

09-信息收集-APP及其他资产等

信息收集-APP及其他资产等 信息收集-APP及其他资产等一、APP提取季抓包及后续配合1、某APK一键提取反编译2、利用bp抓取更多URL 二、某IP无web框架下的第三方测试1、各种端口一顿乱扫 —— 思路2、各种接口一顿乱扫 —— 思路3、接口部分一顿测试 —— 思路 三、**案例演示**1、…

技术革新与市场需求:探索亚信安慧AntDB的发展之路

在这个信息爆炸的时代,企业对数据处理的需求日益增长,而传统的数据库系统往往难以应对海量数据的存储和处理。亚信安慧AntDB的出现,为解决这一难题提供了有力的工具。它不仅具备高吞吐、高并发、高性能的特点,还拥有极佳的扩展性和…

HTML+JavaScript-05

DOM 什么是 DOM? DOM 是一项 W3C (World Wide Web Consortium) 标准。 DOM 定义了访问文档的标准: “W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”…

AI绘画探索人工智能的未来

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示:Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

Seata下载与配置、启动

目录 Seata下载Seata配置启动Seata Seata下载 首先,我们需要知道我们要使用哪个版本的seata,这就要查看spring-cloud-alibaba版本说明,找到我们对应的seata。 spring-cloud-alibaba版本说明: 地址链接 下面是部分版本说明: s…

【MyBatis】MyBatis是什么?作用?怎么实现?

一、MyBatis是什么 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain …

虚拟机扩容后黑屏卡死解决方法

亲测有效,首先一般是在扩容后黑屏的,现象为开机后看到个横线光标不闪,黑屏,进入不了桌面。原因是硬盘已经满了,所以解决方法就是清理硬盘。所以首先还是要解决登录问题。 开机时按 esc 键进入 GNU GRUB,选择…

详解SpringCloud微服务技术栈:深入ElasticSearch(4)——ES集群

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:深入ElasticSearch(3)——数据同步(酒店管理项目&a…

新火种AI|GPT Store可能是一个“硅基人才市场”

作者:一号 编辑:美美 也许我们都错了,GPT Store可能是一个“硅基人才市场”,而不是APP Store。 如果要说在AI领域中最火的一个应用,那么在当下,毫无疑问会是ChatGPT。 2023年,全球前50的AI工…

IT行业中最重要的证书

在IT行业,拥有一些含金量较高的证书是职业发展的关键。这些证书不仅可以证明技能水平,还有助于提升在职场上的竞争力。本文将介绍几个IT行业中最重要的证书。 1. Cisco认证 CCNA(Cisco Certified Network Associate)是Cisco公司新…

LeetCode: 189.轮转数组

本篇目标了解,翻转数组的经典解法, 189. 轮转数组 - 力扣(LeetCode) 目录 基本方法概述: 1,翻转做法,推荐时O(n),空(1) 2&#x…