如何保证消息的顺序性?
2019-12-28 本文已影响0人
善思者_tin
一、背景
有的时候消费者消费消息是顺序消费的。比如生成一个订单,先扣库存,然后扣款。如果顺序错了,扣了款库存没了,不就尴尬了吗?通常,MQ可以保证现到队列的消息按照顺序分发给消费者消费来保证顺序,但是一个队列有多个消费者消费的时候,就失去了这个保证,因为多个消费者的话,这些消息被多个线程并发消费,并发是不能保证顺序的。比如队列里面分别有处理数据库业务的增加、修改、删除三个消息,多个消费者并发处理后可能变成删除、增加、修改,原本不存在的数据被硬生生的添加了一条。
二、解决方案
2.1、ActiveMQ
2.1.1、利用Activemq的高级特性:consumer之独有消费者
broker会从queue中,一次发送消息给一个消费者,避免多个线程并发处理的问题。
queue= new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");consumer= session.createConsumer(queue);
但是一个消费者处理效率比较慢,比如接二连三的多个订单需要处理,是否可以用多个消费者并行处理。
2.1.2、消费分组
在一个消息被分发到consumer之前,broker首先检查消息JMSXGroupID属性。如果存在,那么broker会检查是否有某个consumer拥有这个message group。 如果没有,那么broker会选择一个consumer,并将它关联到这个message group。
重要概念:
分布式:联想到分布,不同地方,对于计算机系统来说,就是讲一个业务拆分成多个子系统,部署到不同的服务器上。
broker:代理,实现ActiveMQ的一个实例。