首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试官: 如何保证MQ消息不丢失?

之前的工作模式中,我们会发现,所有的生产者推送完消息后就结束或者执行其他任务,并不知晓消息是否发送成功。如果要保证消息的可靠性,需要对消息进行持久化处理。...代码实战: 第一步、配置文件中配置消息发送确认 spring.rabbitmq.publisher-confirms = true # 这里注意 # publisher-confirm-type:...他返回可能多条消息的接受情况,也可能返回单条消息的情况 System.out.println("handleAck --- multiple == true");...所以久而久之就会造成消息堆积,造成消息重复消费和阻塞RabbitMQ。...总结 结合代码实战和原理解读了RabbitMQ消息丢失以及对应的解决方案,正如上面图示所言,每一个角色都要兼顾才能够保障消息彻底的不丢失,这些只是MQ为我们提供的一些机制,日常开发和维护中

11810

RabbitMQ实战(三)-高级特性

0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成消息的重复消费 Confirm确认消息、Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL 死信队列...Con - 幂等性 3.2.1 什么是Con - 幂等性 在业务高峰期最容易产生消息重复消费问题,当Con消费完消息,在给Pro返回ack由于网络中断,导致Pro未收到确认信息,该条消息就会重新发送并被...如果你想用事务,放弃吧,Redis缓存事务和MySQL事务根本不是同一个事务 如果不落库,那么存储到缓存中,定时同步的策略如何设置为好?...OK,我们可以Redis命令执行失败,将消息落库,每日用定时器,对这种极特殊的消息进行处理。...6 Con - 自定义监听 之前我们都是代码中编写while循环,通过consumer.nextDelivery方法获取下一条消息,然后进行消费处理 其实我们还有另一种选择,使用自定义的Consumer

1.7K91
您找到你想要的搜索结果了吗?
是的
没有找到

【35期】如何保证消息的可靠性传输?

所以一般来说,如果你要确保说写 RabbitMQ 的消息别丢,可以开启 confirm 模式,在生产者那里设置开启 confirm 模式之后,你每次写的消息都会分配一个唯一的 id,然后如果写入了 RabbitMQ...或者一段时间内都没返回,客户端可以进行消息重发。...这个时候得用 RabbitMQ 提供的 ack 机制,简单来说,就是你必须关闭 RabbitMQ 的自动 ack ,可以通过一个 api 来调用就行,然后每次你自己代码里确保处理完的时候,再在程序里 ack...我们生产环境就是按照上述要求配置的,这样配置之后,至少 Kafka broker 端就可以保证 leader 所在 broker 发生故障,进行 leader 切换,数据不会丢失。..., 生产者执行本地事务并且返回给 MQ 一个状态(Commit、RollBack 等),如果是 Commit 的话 MQ 就会把消息给到下游, RollBack 的话就会丢弃该消息,状态如果为 UnKnow

19110

python While 循环语句

python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。...当判断条件假false循环结束。 执行流程图如下: ? 还是上一篇文章,讲的猜年龄的例子,需要无限次数执行 可以使用while循环来做,代码如下: #!...执行效果如下: ? break 表示跳出循环,否则程序无法退出 如果不想无限次数猜,只限制3次机会,怎么做呢?代码如下: #!...#每次执行加1     count += 1 执行效果如下: ? 代码还可以优化一下,如下: #!...#不输入n         if continue_confirm != "n":             #次数重置为0             count = 0 执行效果如下: ?

1K10

Springboot + RabbitMQ 用了消息确认机制,感觉掉坑里了!

在这里插入图片描述 这次我分享的是 springboot + rabbitmq 如何实现消息确认机制,以及实际开发中的一点踩坑经验,其实整体的内容比较简单,有时候事情就是这么神奇,越是简单的东西就越容易出错...2、basicNack basicNack :表示失败确认,一般消费消息业务异常用到此方法,可以将消息重新投递入队列。...2、消息无限投递 我最开始接触消息确认机制的时候,消费端代码就像下边这样写的,思路很简单:处理完业务逻辑后确认消息, int a = 1 / 0 发生异常后将消息重新投入队列。...); } } 但是有个问题是,业务代码一旦出现 bug 99.9%的情况是不会自动修复,一条消息会被无限投递进队列,消费端无限执行,导致了死循环。...3、重复消费 如何保证 MQ 的消费是幂等性,这个需要根据具体业务而定,可以借助MySQL、或者redis 将消息持久化,通过再消息中的唯一性属性校验。

1.7K41

springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

这次我分享的是 springboot + rabbitmq 如何实现消息确认机制,以及实际开发中的一点踩坑经验,其实整体的内容比较简单,有时候事情就是这么神奇,越是简单的东西就越容易出错。...2、basicNack basicNack :表示失败确认,一般消费消息业务异常用到此方法,可以将消息重新投递入队列。...2、消息无限投递 我最开始接触消息确认机制的时候,消费端代码就像下边这样写的,思路很简单:处理完业务逻辑后确认消息, int a = 1 / 0 发生异常后将消息重新投入队列。...); } } 但是有个问题是,业务代码一旦出现 bug 99.9%的情况是不会自动修复,一条消息会被无限投递进队列,消费端无限执行,导致了死循环。...3、重复消费 如何保证 MQ 的消费是幂等性,这个需要根据具体业务而定,可以借助MySQL、或者redis 将消息持久化,通过再消息中的唯一性属性校验。

40320

springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

[在这里插入图片描述] 这次我分享的是 springboot + rabbitmq 如何实现消息确认机制,以及实际开发中的一点踩坑经验,其实整体的内容比较简单,有时候事情就是这么神奇,越是简单的东西就越容易出错...2、basicNack basicNack :表示失败确认,一般消费消息业务异常用到此方法,可以将消息重新投递入队列。...); } } 但是有个问题是,业务代码一旦出现 bug 99.9%的情况是不会自动修复,一条消息会被无限投递进队列,消费端无限执行,导致了死循环。...[在这里插入图片描述] 经过测试分析发现,当消息重新投递到消息队列,这条消息不会回到队列尾部,仍是队列头部。 消费者会立刻消费这条消息,业务处理再抛出异常,消息再重新入队,如此反复进行。...3、重复消费 如何保证 MQ 的消费是幂等性,这个需要根据具体业务而定,可以借助MySQL、或者redis 将消息持久化,通过再消息中的唯一性属性校验。

63310

Js面试题__附答案

此外,很难调试和测试依赖于全局变量的代码。 9、解释JavaScript中定时器的工作?如果有,也可以说明使用定时器的缺点? 定时器用于设定的时间执行一段代码,或者在给定的时间间隔内重复代码。...setInterval(function,delay)函数用于提到的延迟中重复执行给定的功能,只有取消才停止。 clearInterval(id)函数指示定时器停止。...===被称为严格等式运算符,当两个操作数具有相同的值而没有任何类型转换,该运算符返回true。 12、说明如何使用JavaScript提交表单?...这导致执行任何代码之前会出现延迟。 onDocumentReady加载DOM之后加载代码。这允许早期的代码操纵。 39、你将如何解释JavaScript中的闭包? 什么时候使用?...for-in循环的语法是: 每次循环中,来自对象的一个属性与变量名相关联,循环继续,直到对象的所有属性都被耗尽。 42、描述JavaScript中的匿名函数?

8.8K30

RabbitMQ生产端消息可靠性投递方案分析

如果每一次访问RabbitMQ建立一个Connection,消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。...我们的消息成功投递到Broker,但是回送ACK确认消息,由于网络闪断,生产者没有收到。此时我们再重新投递此消息可能会造成消费端重复消费消息了。...#消费失败,自动重新入队 #重试次数超过最大限制之后是否丢弃(true不丢弃需要写相应代码将该消息加入死信队列) #true,自动重新入队,要写相应代码将该消息加入死信队列 #false,丢弃 spring.rabbitmq.listener.simple.default-requeue-rejected...=false #是否开启消费者重试(为false关闭消费者重试,这时消费端代码异常会一直重复收到消息) spring.rabbitmq.listener.simple.retry.enabled=true...它的作用是消息没有被路由到合适的队列情况下,Broker会将消息返回给生产者。

1.7K30

2023 想进 BAT 的快来,20 道JavaScript必须要面对的面试题(中)

JavaScript 中所有的循环结构是什么? while 循环**:**while 循环 是一个控制流语句,它允许根据给定的布尔条件重复执行代码。while 循环可以被认为是重复的 if 语句。...for 循环**:**for 循环提供了一种编写循环结构的简洁方法。与 while 循环不同,for 语句一行中使用初始化、条件和递增/递减,从而提供更短、易于调试的循环结构。...do while:do-while循环类似于 while 循环,唯一的区别是它在执行语句后检查条件,因此是退出控制循环的一个示例。 2. 如何更改元素的样式/类?...此函数返回一个 base 整数,该整数 parseInt() 函数的第二个参数中指定。parseInt() 函数字符串不包含数字返回 Nan(不是数字)。 6....执行 JavaScript 代码,几乎肯定会发生错误。这些错误可能是由于程序员方面的错误,由于输入错误,或者即使程序的逻辑有问题,也可能发生这些错误。但是所有错误都可以通过使用以下命令来解决。

16760

大数据技术之_23_Python核心基础学习_02_ 流程控制语句 + 序列(10.5小

#           代码块 # 执行的流程:if 语句执行时,会先对条件表达式进行求值判断: #   如果为 True,则执行 if 后的语句 #   如果为 False,则不执行 # 默认情况下...# 代码块: #   代码块中保存着一组代码,同一个代码块中的代码,要么执行要么都不执行。 #   代码块就是一种为代码分组的机制。...#       代码块 # 执行流程: #   if-else 语句执行时,先对 if 后的条件表达式进行求值判断 #       如果为 True,则执行 if 后的代码块 #       如果为... 循环 # while 循环 # 语法: #   while 条件表达式 : #       代码块 #   else : #       代码块 # 执行流程: #   while 语句执行时,...# 控制台中打印如下图形 # ***** # ***** # ***** # ***** # ***** # 创建一个循环来控制图形的高度 # 循环嵌套,外层循环执行一次,内存循环就要执行一圈

2.9K30

python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05

# 会一直打印0,记得停止 # n = 0 # while True: # print(n) # 重复 + 每次迭代都是基于上一次的结果而来的 l = [1, 2, 3, 4, 5] s...yield 关键字,那么加括号执行函数的时候并不会触发函数体代码的运行 *** print('second') yield 2 # yield 后面跟的值就是调用迭代器 __next...才返回True)   any(有一个是True返回True)   bool(将传进来参数变成布尔类型)   bin(十转二) oct(十转八)  hex(十转十六)    int(把指定类型转成十进制...,否则返回False # any 只要一个True,就返回True l = [0, 1, 2] print(all(l)) # 只要有一个是False,就返回False print(any(l)) #...exec 执行字符串里的代码,eval 不支持逻辑代码,只支持一些简单的python代码, exec可以执行逻辑代码 s = """ print('hello baby~') # x = 1 # y

1.4K40

『假如我是面试官』RabbitMQ我会这样问!

因此RabbitMQ出现消息丢失的情况有四个 分别是 消息生产者没有成功将消息发送到MQ导致消息丢失 交换机未路由到消息队列导致消息丢失 消息MQ中,MQ发生宕机导致消息丢失 消费者消费消息出现异常导致消息丢失...生产者将信道设置成confirm(确认)模式,一旦信道进入confirm模式,所有该信道上面发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认...; } } 消息从交换机未能匹配到队列将此条消息返回给生产者 spring.rabbitmq.publisher-returns=true @RestController public class...如何保证消息不重复消费(如何保证消息的幂等性) 消息重复的原因有两个: 生产消息重复 由于生产者发送消息给MQ,MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息。...死信如何处理 当一条消息队列中出现以下三种情况的时候,该消息就会变成一条死信。

43130

如何保证消息的可靠性传输?如何处理消息丢失的问题?

问题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费和幂等性问题。...客户端实现生产者 confirm 有 3 种方式: 1.普通 confirm 模式:每发送一条消息后,调用 waitForConfirms() 方法,等待服务器端 confirm,如果服务端返回 false...或者一段时间内都没返回,客户端可以进行消息重发。...这个时候得用 RabbitMQ 提供的 ack 机制,简单来说,就是你必须关闭 RabbitMQ 的自动 ack ,可以通过一个 api 来调用就行,然后每次你自己代码里确保处理完的时候,再在程序里 ack...我们生产环境就是按照上述要求配置的,这样配置之后,至少 Kafka broker 端就可以保证 leader 所在 broker 发生故障,进行 leader 切换,数据不会丢失。

94610

js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法

执行时,是载入后延迟指定时间后,去执行一次表达式,仅执行一次 setTimeout 执行时,它从载入后,每隔指定的时间就执行一次表达式 1,基本用法: 执行一段代码: var i=0; setTimeout...计时器setTimeout()与setInterval()是原生JS很重要且用处很多的两个方法, 但很多人一直误以为是相同的功能: 间隔时间重复执行传入的句柄函数....简单的说, 两才的区别在于, setTimeout()方法是等待指定时间后执行函数, 且只执行一次传入的句柄函数. setInterval()方法是每指定间隔时间后执行一次传入的句柄函数,循环执行直至关闭窗口或...() 返回 true。...调用 confirm() ,将暂停对 JavaScript 代码执行,在用户作出响应之前,不会执行下一条语句。

3.1K10

怎么理解分布式、高并发、多线程?(含面试题和答案解析)

该领域需要解决的问题极多,不同的技术层面上,又包括:分布式文件系统、分布式缓存、分布式数据库、分布式计算等,一些名词如Hadoop、zookeeper、MQ等跟分布式有关。...JAVA语言中,需要对JVM内存模型、指令重排等深入了解,才能写出一份高质量的多线程代码。...总之,TCC就是通过代码人为实现了两阶段提交,不同的业务场景所写的代码都不一样,复杂度也不一样,因此,这种模式并不能很好地被复用。 3、如何实现负载均衡,有哪些算法可以实现?...多线程中忙循环是什么 忙循环就是程序员用循环让一个线程等待,不像传统方法wait()、sleep()或者yied()它们放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。...通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。 当任务到达,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。

3.8K00

分享 8 个关于高级前端的 JavaScript 面试题

这种强大的语言也有一些怪癖。例如,您是否知道 0 === -0 的计算结果为 true,或者 Number("") 的结果为 0?...无论操作数的类型如何,它都会优先考虑数字减法。当操作数不是数字类型,JavaScript 会执行隐式强制转换,将其转换为数字。本例中,“11”被转换为数值 11,并且表达式简化为 11 - 1。...初步检查后,代码似乎通过复制原始数组 arr 中的每个元素来创建一个新数组 newArr。然而,重复函数本身出现了一个关键问题。 重复函数使用循环来遍历给定数组中的每个项目。...但在循环内部,它使用 push() 方法在数组末尾添加一个新元素。这使得数组每次变得更长,从而产生循环永远不会停止的问题。...当 JavaScript 引擎执行代码,声明全局变量 a 并为其赋值 5。然后,调用 bar() 函数。 bar() 函数内部,声明了一个局部变量 a 并赋值为 3。

44430

深度剖析 Seata TCC 模式【图解 + 源码分析】

当全局事务决议提交/回滚,TC 会通过分支注册的的资源 ID 回调到对应参与者服务中执行 TCC Resource 的 Confirm/Cancel 方法。...如何处理幂等 幂等问题指的是 TC 重复进行二阶段提交,因此 Confirm/Cancel 接口需要支持幂等处理,即不会产生资源重复提交或者重复释放。 那么幂等问题是如何产生的呢?...如上图所示,参与者 A 执行完二阶段之后,由于网络抖动或者宕机问题,会造成 TC 收不到参与者 A 执行二阶段的返回结果,TC 会重复发起调用,直到二阶段执行结果成功。...当重复调用二阶段 Confirm/Cancel 方法,判断事务状态即可解决幂等问题。...如何处理悬挂 悬挂指的是二阶段 Cancel 方法比 一阶段 Try 方法优先执行,由于允许空回滚的原因,执行完二阶段 Cancel 方法之后直接空回滚返回成功,此时全局事务已结束,但是由于 Try

1.4K20
领券