学习小记-RocketMQ的一些小知识

目录

如何保证消息不丢失

如何保证消息顺序消费

如何实现延时消息


如何保证消息不丢失

  1. 消息存储

    • RocketMQ 将消息存储在物理磁盘上,而不是仅仅缓存在内存中。每个消息都被序列化并存储在指定的存储路径中。
  2. 主从复制(Master-Slave Replication):

    • 消息在被发送到 Master 节点后,会被异步复制到 Slave 节点。这样即使 Master 节点发生故障,Slave 节点仍然可以保证消息的完整性。
  3. 刷盘机制

    • 为了确保消息的持久性,RocketMQ 支持同步和异步两种刷盘方式。同步刷盘会等待消息写入磁盘后才返回确认,而异步刷盘则可以提高性能。
  4. 消息确认

    • 消费者在成功处理消息后,需要发送一个确认回执给消息队列。如果消息队列没有收到确认,它会认为消息未被成功处理,并可能重新投递该消息。

RocketMQ没办法100%保证消息不丢失,只能最大限度保证消息称不丢失!

如何保证消息顺序消费

答:三次加锁!

  1. 使用同步发送消息的方式,把消息发送到同一队列中(发送时可以通过参数指定)。
  2. 需要同一个消费者消费(加锁实现-给消费者客户端申请分布式锁<首次加锁>)
  3. 因为消费者消费时是把消息丢到消费线程池多线程消费的,为了保证顺序消费,这里就要再次加锁,确保同事时间内一个队列里只能有一个线程处理该消息<二次加锁>。
  4. 对存储消息的processQueue加锁(解锁时再次加锁),确保重平衡过程中不会出现重复消费。
    1. 当集群新增了消费客户端进来的时候,某个队列可能原来输入A客户端,现在却要经过重平衡交由B客户端消费,这时候假如A客户端正在消费,此时消费结果还没提交,在交接的过程中就需要确保锁不被移除,否则可能其他客户端获取锁后会重复消费(所以就需要在A客户端解锁的时候再次加锁,如果加锁成功才允许解锁)。

顺序消费因为加了很多锁,会降低吞吐量,所以慎重选择。

如何实现延时消息

Rocket5.0版本之前,使用Timer定时器实现,先将消息存储在内存中,达到时间后再存储到磁盘中并且投递给消费者(Timer有缺陷,定时器中任务很多时会导致性能下降)。

Rocket5.0中增加了基于时间轮实现的定时消息,该算法很高效,可在O(1)时间内找到将执行的任务:

  1. 当Broker接收到定时消息时,根据消息的过期时间计算出需要投递的槽位,并将消息放置到对应的槽位中。
  2. 时间轮滴答到该槽位时便会触发事件,将消息投递给消费者

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值