什么是顺序消息: 消息的生产和消费顺序一致 全局顺序:topic下面全部消息都要有序(少用),性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的 场景,并行度成为消息系统的瓶颈, 吞吐量不够 使用场景:在证券处理中,以人民币兑换美元为例子,在价格相同的情况下,先出价者优先处理,则可以通过全局顺序的方式按照 FIFO 的方式进行发布和消费 局部顺序:只要保证一组消息被顺序消费即可,性能要求高 使用场景:电商的订单创建,同一个订单相关的创建订单消息、订单支付消息、订单退款消息、订单物流消息、订单交易成功消息 都会按照先后顺序来发布和消费 (阿里巴巴集团内部电商系统均使用局部顺序消息,既保证业务的顺序,同时又能保证业务的高性能) 下面是用RocketMQ举例(用kafka或rabbitmq类似) 一个topic下面有多个queue 顺序发布:对于指定的一个 Topic,客户端将按照一定的先后顺序发送消息 举例:订单的顺序流程是:创建、付款、物流、完成,订单号相同的消息会被先后发送到同一个队列中, 根据MessageQueueSelector里面自定义策略,根据同个业务id放置到同个queue里面,如订单号取模运算再放到selector中,同一个模的值都会投递到同一条queue public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) { //如果是订单号是字符串,则进行hash,得到一个hash值 Long id = (Long) arg; long index = id % mqs.size(); return mqs.get((int)index); } 顺序消费:对于指定的一个 Topic,按照一定的先后顺序接收消息,即先发送的消息一定会先被客户端接收到。 举例:消费端要在保证消费同个topic里的同个队列,不应该用MessageListenerConcurrently, 应该使用MessageListenerOrderly,自带单线程消费消息,不能再Consumer端再使用多线程去消费,消费端分配到的queue数量是固定的,集群消费会锁住当前正在消费的队列集合的消息,所以会保证顺序消费。 注意: 顺序消息暂不支持广播模式 顺序消息不支持异步发送方式,否则将无法严格保证顺序 不能再Consumer端再使用多线程去消费
如何保证消息队列里消息的生成和消费的顺序性
最新推荐文章于 2024-08-26 11:45:45 发布