美文网首页
如何保证消息的顺序性?

如何保证消息的顺序性?

作者: 善思者_tin | 来源:发表于2019-12-28 16:18 被阅读0次

    一、背景

    有的时候消费者消费消息是顺序消费的。比如生成一个订单,先扣库存,然后扣款。如果顺序错了,扣了款库存没了,不就尴尬了吗?通常,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的一个实例。

    相关文章

      网友评论

          本文标题:如何保证消息的顺序性?

          本文链接:https://www.haomeiwen.com/subject/pmcloctx.html