
RabbitMq
z.jiaminf
程序猿一枚
展开
-
介绍下RabbitMQ的事务机制
我们需要先通过txselect开启事务,然后就可以发布消息给MQ了,如果txCommit提交成功了,则消息一定到达了RabbitMQ,如果在txCommit执行之前RabbitMQ实例异常崩溃或者抛出异常,那我们就可以捕获这个异常然后执行txRollback 进行回滚事务。RabbitMQ的事务机制,允许生产者将一组操作打包一个原子事务单元,那么全部执行成功,要么全部失败。想要保证发送者一定能把消息发送给RabbitMQ,一种是通过confirm机制,另外一种就是通过事务机制。原创 2024-03-05 16:58:39 · 956 阅读 · 0 评论 -
RabbitMQ如何保证消息不丢
1.非持久化 这是默认的传递模式,如果消息被设置为非持久化,RabbitMQ将尽力将消息传递给消费者,但不会将其写入磁盘,这意味着如果RabbitMQ服务器在消息传递之前崩溃或重启,消息可能会丢失。2.持久化 如果消息被设置为持久化,RabbitMQ会将消息写入磁盘,以确保即使在RabbitMQ服务器重启时,消息也不会丢失。在声明队列的时候,可以通过设置durable 参数为true 来创建一个持久化队列,持久化队列会在Rabbitmq服务器重启后保留,确保队列的元数据不会丢失。原创 2024-03-05 16:47:38 · 768 阅读 · 0 评论 -
如何保障消息一定能发送到RabbitMQ
一旦消息成功叨叨交换机并被处理,RabbitMQ会向消息生产者发送确认信号(ack)如果由于某种原因(比如 交换机不存在,路由键不匹配)消息无法被处理,RabbitMQ会向消息生产者发送否认信号 (NACK)当RabbitMQ 在无法路由消息时将消息返回给消息生产者,但是如果能正确路由,则不好返回消息。为了解决这个问题,有两个方案,一种是通过confirm机制,另外一种是事务机制,因为事务机制并不推荐,这里先介绍Confirm机制。上面两个丢失的过程,都可以利用confirm机制,注册回调来监听是否成功。原创 2024-03-05 16:20:23 · 500 阅读 · 0 评论 -
RabbitMQ如何实现消费端限流
我们可以在消费者指定最大的未确认消息数,当达到这个限制时,RabbitMQ将不再推送新的消息给消费者,直到有一些消息得到确认。什么是消费端限流,这个一种保护消费者的手段,假如说,现在是业务高峰期了,消息有大量堆积,导致MQ消费需要不断的进行消息消费,很容易被打挂,甚至重启之后还是会被大量消息涌入,继续被打挂。然后再在消费者处理完一条消息之后,手动发送确认消息给到RabbitMQ,这样就可以拉取下一条消息了;如以上配置,可以实现消费者在处理一条消息后,才会获取下一条消息。原创 2024-03-05 16:00:44 · 798 阅读 · 0 评论 -
RabbitMQ是如何保证高可用的?
这种集群模式下,每个实例中的元数据是一样的,大家都是完整的数据。在这种模式下,我们创建的Queue,它的元数据(配置信息)会在集群中的所有实例中进行同步,但是 队列中的消息只会存在于一个RabbitMQ实例上,而不会同步到其他队列中。当我们消费消息的时候,如果消费者连接到了未保存消息的实例,那么那个实例会通过元数据定位到消息所在的实例,拉取数据过来发送给消费者进行消费。这样每次在消息写入的时候,就需要在集群中的所有实例上都同步一份,这样即使有一台实例发送故障,剩余的实例也可以正常提供完成的数据和服务。原创 2024-03-05 15:41:28 · 1223 阅读 · 0 评论 -
什么是RabbitMQ的死信队列
当消息变成死信之后,如果配置了死信队列,它将被发送到死信交换机,死信交换机将死信投递到一个队列上,这个队列就是死信队列。1.消息处理失败:当消费者由于代码错误,消息格式不正确,业务规则冲突等原因无法成功处理一条消息时候,这条消息可以被标记为死信。4.消息无法路由:当消息不能被路由到任何队列时,例如,没有匹配的绑定关系或路由键时,消息可以被发送到死信队列。3.将队列与死信交换机绑定:将主要队列和死信交换机绑定,以便于无法处理的消息能够被转发到死信队列。1.创建死信队列:定义一个用于存储死信消息的队列。原创 2024-03-05 15:22:50 · 1276 阅读 · 1 评论 -
RabbitMQ 如何防止重复消费
这样我们在消费者端,接收到消息以后,只需要解析出消息体中的这个唯一标识,就可以通过 一锁 二判 三更新的方式来判断是否消费成功过了。RabbitMQ的消息消费是有确认机制的,正常情况下,消费者在消息消费成功后,会发送一个确认消息,消息队列接收到之后,就会将该消息从消息队列中删除,下次也就不会再投递了。但是如果存在网络延迟的问题,导致确认消息没有发送到消息队列,导致消息重投了,是有可能,所以当我们使用MQ的时候,消费者端自己也需要做好幂等控制来防止消息被重复消费。原创 2024-03-05 14:52:43 · 922 阅读 · 0 评论 -
RabbitMQ如何实现延迟消息?
但是,死信队列的实现方式存在一个问题,那就是可能造成队头阻塞,因为队列是先进先出的,而且每次只会判断队头的消息是否过期,那么如果队头的消息时间很长,一直都不过期,那么就会阻塞整个队列,这时候即便排在他后面的消息过期了,那么也会被一直阻塞。基于rabbitmq插件的方式可以实现延迟消息,并且不存在消息阻塞的问题,但是因为是基于插件的,而这个插件支持的最大延迟时间是(2^32)-1毫秒,大约49天,超过这个时间会被立即消费。目前该插件的当前设计并不真正适合包含大量延迟消息(例如数十万或者百万)的场景,原创 2024-03-05 14:43:41 · 825 阅读 · 0 评论 -
RabbitMQ是怎么做消息分发的?
在路由模式中,一个生产者将消息发送到交换器中,并指定消息的路由键,交换机根据路由键将消息路由到于之匹配的队列中。在主题模式中,一个生产者将消息发送到交换器中,并指定主题 作为路由键,交换器根据通配符匹配将消息路由到匹配的队列中。在发布/订阅模式中,一个生产者将消息发送到交换器中,交换器将消息广播到所有绑定的队列,每个队列对应一个消费者。每个消息只能被一个消费者处理。rabbitMQ一个有6种工作模式(消息分发方式)分别是简单模式,工作队列模式,发布订阅模式,路由模式,主题模式以及RPC模式。原创 2024-03-04 21:31:22 · 819 阅读 · 0 评论 -
RabbitMQ的整体架构是怎么样的?
每个VHost拥有自己的交换器,队列,绑定和权限配置,不同的VHost之间的资源相互独立,互不干扰。RabbitMQ是一个开源的消息中间件,用于在应用程序之间传递消息。Exchange(交换器):交换器是消息的接收和路由中心,它接收来自生成者的消息,并将消息路由到一个或多个与之绑定的队列(Queue)中。Queue (队列):队列是消息的存储和消费的,它保存着未被消费的信息,等待消费者从队列中获取并处理消息.Binding (绑定):绑定是交换器和队列之间的关联关系,它定义了交换器将消息路由到哪些队列中。原创 2024-03-04 21:08:49 · 719 阅读 · 0 评论