RabbitMQ如何保证消息的顺序性

文章目录

  • 局部顺序性保证
  • 全局顺序性

局部顺序性保证

define:在单个队列里面保证消息的顺序
(可以满足大部分业务)
如何保证?

单队列单消费者
最简单的方法就是使用单个队列,并由消费者进行处理,同一个队列的消息是先进先出的,这是RabbitMQ来帮助我们保证的(没有发送如何异常的情况下)

分区消费
单个消费者的吞吐太低了,当需要多个消费者以处理,可以使用分区消费
把一个队列分割为多个分区,每个分区由一个消费者处理
把一个用户id的消息发送到听一个区,由一个消费者进行消费(rabbitmq不支持)

实操:可以根据交换机的路线,以特定的条件路由到队列中

消息确认机制
使用手动消息确认机制,消费者在处理好一条消息之后,显式的发送确认ack,这样rabbitmq才会移除并继续发送下一条消息
这些策略需要结合使用的

业务逻辑控制
比如在消息中嵌入序列号,在消费是根据序列号保证顺序性

全局顺序性

define:在多个队列,多个消费者之间保证消息的顺序
在实际业务开发中,全局顺序性比较难实现,在分布式的系统中,多个消费者,需要保证这些消费者消费信息的顺序是比较难,在消费一条消息时,需要看其他机器有没有把这一条消息的上一条消息消费掉,才决定当前要不要处理
对应的解决办法:

对消息设置一个序号,这个序号还可以排序,拿到这条序号后,要知道上一条消息有没有消费成功,如果消费了,那么进行消费

把这些序号存起来,在消费消息的时候,需要去数据库里查一下(redis):如果消费了,那么进行消费
如果没有消费,可以搞一个缓存进行排序

你可能感兴趣的:(RabbitMQ,rabbitmq,ruby,分布式)