我们对顺序消息,延时消息,批量消息,过滤消息进行一个demo,方便以后cv。
顺序消息的生产与消费
顺序消息是指当消息消费的时候,会按照消息发送的顺序进行消费。RocketMQ可以保证消息严格的有序,这里分为全局有序和分区有序。 全局有序是针对所有消息的,每一个消息都按照绝对的先入先出原则。 分区有序,是指将需要有序的消息控制发送到同一个Queue上,消费的时候从这个Queue上拉取。即相对每个Queue是有序的。
全局有序
控制Topic指定只有一个队列,并且保证生产者与消费者只有一个就可以了
分区有序
要完成分区有序性,在生产者环节使用自定义的消息队列选择策略,我们以下单为例,我们需要确保订单号尾数相同的消息会被先后发送到同一个队列中,然后再消费端开启负载均衡模式,每个消费者只消费一个队列。最终确保一个消费者拿到的消息对于一个订单来说是有序的。
也就是说,需要自定义规则使得同一个订单的或者同一个业务逻辑的消息发送到同一个消息队列,再让一个消费者去消费的时候,就是顺序消费了。
生产者
public static void main(String[] args) throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("luke_group_order");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
List<Order> orderList = buildOrder();
for (int i = 0; i < orderList.size(); i++) {
String body = orderList.get(i).toString();
Message msg = new Message("luke_topic_order", null, "KEY" + i, body.getBytes());
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Long id = (Long)arg;
long index = id % mqs.size();
return mqs.get((int) index);
}
}, orderList.get(i).getId());
}
producer.shutdown();
}
Order类
@Data
@NoArgsConstructor
@ToString
class Order{
Long id;
String info;
}
模拟消息
模拟一个列表,我把中间的2和3删了,要不太长了。这里是按照提交ÿ