首页 > 其他分享 >RabbitMQ 消息应答

RabbitMQ 消息应答

时间:2023-09-18 14:46:02浏览次数:34  
标签:对象 应答 RabbitMQ 算法 线程 消息

每日一句

物是人非事事休,欲语泪先流。

概述

为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制,

消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。

自动应答

消息发送后立即被认为已经传送成功,这种模式需要在高吞吐量和数据传输安全性方面做权衡。

因为这种模式有两种情况会出问题:

1。如果消息在接收到之前,消费者那边出现连接或者channel关闭,那么消息就丢失了。

2。消费者这边由于接收太多还来不及处理的消息,导致这些消息的积压,最终使得内存耗尽,最终这些消费者线程会被操作系统杀死。

所以这种模式仅适用于在消费者可以高效并以某种速率能够处理这些消息的情况下使用。

消息应答的方法

A.Channel.basicAck(用于肯定确认) RabbitMQ 已知道该消息并且成功的处理消息,可以将其丢弃了

B.Channel.basicNack(用于否定确认)

C.Channel.basicReject(用于否定确认) 与 Channel.basicNack 相比少一个参数,不处理该消息了直接拒绝,可以将其丢弃了

Multiple 的解释

手动应答的好处是可以批量应答并且减少网络拥堵

multiple 的 true 和 false 代表不同意思

true 代表批量应答 channel 上未应答的消息

比如说 channel 上有传送 tag 的消息 5,6,7,8 当前 tag 是8 那么此时5-8 的这些还未应答的消息都会被确认收到消息应答

false 同上面相比只会应答 tag=8 的消息 5,6,7 这三个消息依然不会被确认收到消息应答

消息自动重新入队

如果消费者由于某些原因失去连接(其通道已关闭,连接已关闭或 TCP 连接丢失),导致消息未发送 ACK 确认,RabbitMQ 将了解到消息未完全处理,并将对其重新排队。如果此时其他消费者可以处理,它将很快将其重新分发给另一个消费者。这样,即使某个消费者偶尔死亡,也可以确保不会丢失任何消息。

消息手动应答代码

面试题

线程池工作原理?

JVM先根据用户给定的参数创建一定数量的可运行的线程任务,并将其放入队列中,在线程创建后启动这些任务。

1。通过execute 方法提交任务时,当线程池中的线程小于corePoolsize时,新提交的任务将通过创建一个新线程来执行,即使此时线程池中存在空闲线程。

2。通过execute方法提交任务时,当线程池中线程数量达到corePoolSize时,新提交的任务将被放入workQueue中,等待线程池中线程调度执行。

  1. 通过execute方法提交任务时,当workQueue已存满,且maximumPoolSize大于corePoolSize时,新提交的任务将通过创建新线程执行。

4。通过execute方法提交任务,当线程池中线程数达到maxmumPoolSize,并且workQueue也存满时,新提交的任务由RejectedExecutionHandler执行拒绝操作。

5。当线程池中线程数超过corePoolSize,并且未配置allowCoreThreadTimeOut=true,空闲时间超过keepAliveTime的线程会被销毁,保持线程池中线程数为corePoolSize。

6。当设置allowCoreThreadTimeOut=true时,任何空闲时间超过keepAliveTime的线程都会被销毁。

线程池(Thread Pool)是一种基于池化思想管理线程的工具,线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。

线程池维护多个线程,等待监督管理者分配可并发执行的任务。

这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

线程池解决的核心问题就是资源管理问题。

【HashMap】HashMap中,当两个对象的hashcode相同会发生什么?如果两个键的hashcode相同,你如何获取值对象?

因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

HashMap中,如果两个键的hashcode相同,你如何获取值对象?

当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。 找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象

【GC算法】为什么 JAVA 新生代使用复制算法、老年代使用标记清除算法比较好?三种算法对比?

  • 新生代更新频繁,绝大部分都是垃圾对象,垃圾回收之后,只有极小的可用对象,采用复制算法,将这小部分的对象复制到S区,成本是比较小的。

  • 老年代中的对象很多经过新生代之后,都是证明不好回收的对象,采用复制算法,那么需要复制对象的太多了,成本太高了。采用标记清除算法只需要删除标记对象就可以了,这样的成本是最低的。

  • CMS收集器关注延迟问题,有低延迟的特性,基于标记清除算法。因为该算法不需要移动对象,所以停顿时间短,但正是不需要移动对象,所以会有内存碎片化的问题

  • Parallel Old收集器,关注吞吐量,是基于标记整理算法,牺牲了一定的性能,但是对内存对象进行了一个压缩操作,所以吞吐量会大一点。

你好,我是yltrcc,日常分享技术点滴,欢迎关注我:ylcoder

标签:对象,应答,RabbitMQ,算法,线程,消息
From: https://www.cnblogs.com/yltrcc/p/17711811.html

相关文章

  • 消息队列中如何保证消息的顺序性?
    面试官心理分析其实这个也是用MQ的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。面试题剖析我举个例子,我们以前做过一个mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个mys......
  • springcloud 集成rabbitmq
    以下是在SpringCloud中使用RabbitMQ的基本步骤:引入依赖:在pom.xml文件中引入以下依赖:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency><depe......
  • 消息
         ......
  • rabbitmq-如何确定消息发送到Broker
    交换机1工作生活中的交换机/路由器-------转发网络信号,且只是转发网络信号。2可以控制黑名单,隐藏网络,权限控制---除了信号不是他提供的,他只是转发信号服务外,其他的事儿,他是可以控制的。rabbitmq-如何确定消息发送到BrokerConfirm方式有三种模式:1、普通Confirm模式2、......
  • 消息转换器 替代 @JsonFormat注解 完成 日期类序列化时的格式转换
      spring中的日期类从数据库读取完数据后,默认的格式其实很难看,传输给前端也不友好,所以我们一般会将日期类通过类似@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateLocalDateTimecreateTime;来更改日期类序列化时的格式。但这样太麻烦了,我们还可以用SpringMVC框架的......
  • 基于SqlSugar的开发框架循序渐进介绍(25)-- 基于SignalR实现多端的消息通讯
    基于ASP.NETCoreSignalR可以实现客户端和服务器之间进行即时通信。本篇随笔介绍一些SignalR的基础知识,以及结合对SqlSugar的开发框架的支持,实现SignalR的多端处理整合,从而实现Winform客户端,基于Vue3+ElementPlus的BS端整合,后面也可以实现对移动端的SignalR的整合通讯。适合Sign......
  • 深入探讨Spring Cloud Stream的消息分区
    背景在分布式系统中,消息队列是一种常见的解决方案,它可以实现异步通信、解耦和削峰填谷等功能。SpringCloudStream是一个基于SpringBoot的消息驱动微服务框架,它提供了一种简单的方式来创建和管理消息驱动的微服务。其中一个重要的特性就是消息分区,本文将深入探讨SpringClou......
  • Python stomp 发送消息无法显示文本
    我们向消息服务器通过stomp发送的是文本消息。当消息服务器发送成功后,消息服务器上的文本没有显示,显示的是2进制的数据。  如上图,消息没有作为文本来显示。问题和解决消息服务器是如何判断发送的小时是文本还是二进制的。根据官方的说,Stomp如设置了content-leng......
  • 深入研究消息队列06 高级功能
    27Topic分区订阅如何实现动态配置在消息队列里面,因为需要保持架构的简洁度,基于本地文件也是一种常用的方案。比如Kafka和Pulsar就是基于ZooKeeper来实现的动态配置,因为架构中已经集成了ZooKeeper。RocketMQ的Nameserver是一个缓存组件,没有实际的存储和Watch机制,无法......
  • RabbitMQ如何保证消息的可靠性
    RabbitMQ如何保证消息的可靠性1、保证消息不丢失(三步)开启事务(不推荐)开启confirm(推荐)开启RabbitMQ持久化(交换机、队列、消息)关闭RabbitMQ自动ack(改成手动)2、保证消息不重复消费幂等性(每个消息用一个唯一标识来区分,消费前先判断标识有没有被消费过,若已消费过,则直接ACK......