rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java

重要的知识点,禁止并发消费,加锁这样就不会多线程同时访问一个队列造成无序。

consumer会平均分配queue的数量进行消费的,一个consumer同时可以消费一个队列的多个消息,要保证顺序消费就要加锁的。

一个消费者是一个线程池。

第一步:还原为最简单的代码

第二步:在队头或者队尾部消费只是初次启动第一次有效,第二次重启的时候以后都是按照上一次的消费点往后消费的。

代码:

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_02

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_03

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

第三个几乎不用。

第三步:负载均衡策略算法。

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_04

一个topic有很多的队列,我们要分配到consumer里面去,这需要算法,默认是负载均衡的算法。

consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueStrategy());

第四步:消费 进度的存储。

rocketMq消费者配置java rocketmq消费者线程数_线程池_05

consumer消费消息之后要标记下,broker也要标记下的。

消息消费两种形式:集群和广播。

//默认是集群方式,可以更改为广播,但是广播方式不支持重试
        consumer.setMessageModel(MessageModel.CLUSTERING);

offset的存储位置,广播模式是本地的,集群的是broker的。

rocketMq消费者配置java rocketmq消费者线程数_线程池_06

consumer.setPullBatchSize(32);

看下线程池的源码:

rocketMq消费者配置java rocketmq消费者线程数_线程池_07

第五步:

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_08

总结:模式和线程可以调,其他的一般不需要调整的。

------01-------------

rocketMq消费者配置java rocketmq消费者线程数_线程池_09

知识点1:topic下的quene的数量一般要 大于consumer的数量。最好是偶数倍。

知识点2:什么是消费者组,同一个consumerGroup的消费者。

rocketMq消费者配置java rocketmq消费者线程数_加锁_10

知识点3:我们做下集群模式的验证看下性能。

消费者组分配到的队列那个消费者只消费消息一次的。

知识点4:我们做下广播模式的验证看下性能。

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_11

可知:

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_12

每个consumer都会消费消息一次。

------------02---------

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_13

consumer消费指定的tag,可以在broker过滤也可以在consumer过滤。

offset也是分为broker和consumer过滤。

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_14

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_15

测试代码:

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_16

订阅关系注意一下。

rocketMq消费者配置java rocketmq消费者线程数_线程池_17

同一个消费者组订阅的topic和tag必须是一样的。

测试1:

生产者:

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_18

消费者:

rocketMq消费者配置java rocketmq消费者线程数_加锁_19

注意一点:被过滤的消息是被抛弃了,新起一个节点是不会消费了。

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_20

sql92的:

rocketMq消费者配置java rocketmq消费者线程数_rocketMq消费者配置java_21

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_22

这个测试的是broker端过滤。consumer过滤自己写逻辑实现的。

测试2:sql语法。

基础知识点:

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_23

第一步:打开控制台,看主要节点的配置,确定是不是开启。

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_24

第二步:开启 kill掉broker 编辑broker.conf 注意主从都要改的。

rocketMq消费者配置java rocketmq消费者线程数_加锁_25

第三步:写代码

生产者:

@RequestMapping("/api/v1/pay_cb")
    public Object callback(String tag,String amount) throws Exception {
        Message message = new Message(JmsConfig.TOPIC,tag, "",tag.getBytes());
        message.putUserProperty("amount",amount);  
        SendResult sendResult =  payProducer.getProducer().send(message);
        System.out.printf("发送结果=%s, sendResult=%s \n", sendResult.getSendStatus(), sendResult.toString());
        return new HashMap<>();
    }

rocketMq消费者配置java rocketmq消费者线程数_加锁_26

消费者:

consumer.subscribe(JmsConfig.TOPIC, MessageSelector.bySql("amount > 5"));

注意点:

rocketMq消费者配置java rocketmq消费者线程数_线程池_27

 

原理:

rocketMq消费者配置java rocketmq消费者线程数_加锁_28

 

consumer会携带tag到broker,进行hash运算对比。不匹配则跳过。consunmer用原生的tag匹配。

rocketMq消费者配置java rocketmq消费者线程数_线程池_29

rocketMq消费者配置java rocketmq消费者线程数_线程池_30

-------------03----------

之前我们一直用的是pushConsumer,然后消费者进行监听。

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_31

rocketMq消费者配置java rocketmq消费者线程数_负载均衡_32

在控制台查看是什么机制:

rocketMq消费者配置java rocketmq消费者线程数_线程池_33

不是长轮询就是1s请求一次。

消费端:

rocketMq消费者配置java rocketmq消费者线程数_线程池_34

rocketMq消费者配置java rocketmq消费者线程数_加锁_35

可以看出来是拉模被封装了。 

pull的方式:

rocketMq消费者配置java rocketmq消费者线程数_加锁_36

官方的例子:

rocketMq消费者配置java rocketmq消费者线程数_加锁_37

rocketMq消费者配置java rocketmq消费者线程数_加锁_38

----04--------------