RocketMQ踩坑:Tag与SQL冲突问题

需求:
根据数据的特征发送同步至不同的consumer端,比如说某个message特征数 10,
有可能有的consumer消费是消费1-20,有的consumer消费的数据特征为3-13这种不相同不固定的消费范围
这种需求我一下就感觉RocketMQ的SQL刚好合适,并且根据这种需求,当然是使用广播模式,
然后我就看到有的文档上写着,广播模式的consumerGroup相当于无效的,因为是给所有consumer发送message
这时,我的想法是在同一个group中有着各自不相同的sql条件,每个consumer根据自己的限制条件进行限制消费。

关于pull还是push?

  • push支持SQL限制tag,pull不能使用SQL92(官方文档这么写的);
  • 如果不需要这个SQL过滤,我们就可以使用pull

于是,我就有了以下的想法:(producer 生成10条测试数据,coal值从0-9)

//第一种consumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup1");
consumer.setNamesrvAddr("localhost:9876");
consumer.setInstanceName("consumer 1");
consumer.setMessageModel(MessageModel.BROADCASTING);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest", MessageSelector.bySql("coal < 3"));
consumer.registerMessageListener(MessageListener.getInstance()); // 简单自定义打印
consumer.start();
//第二种consumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup1");
consumer.setNamesrvAddr("localhost:9876");
consumer.setInstanceName("consumer 2");
consumer.setMessageModel(MessageModel.BROADCASTING);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest", MessageSelector.bySql("coal >=2 and coal <= 7"));
consumer.registerMessageListener(MessageListener.getInstance()); // 简单自定义打印
consumer.start();

然后我就发现:consumer并没有按照我理想中的情况各自消费
经过多次测试,得到结论:
** 一个consumerGroup只能指定一种过滤条件(不管是Tag还是SQL,都一样)**

后生效的consumer的过滤条件会覆盖之前congsumer的过滤条件

然后多次各种情况下测试,发现tag的“*”不太一样。
tag的“*”不会覆盖同组其他的tag,除了“*”其他tag都会在consumerGroup中覆盖生效

我是这么理解:
同一个consumerGroup组,
tag的“*”其实就是相当于没有tag.

详细测试情况如下概述:
producer生产10条数据,tag为0-9

第一个生效的consumer1的tag是“*”
第二个生效的consumer2的tag是“1”
则consumer1和consumer2都只会消费tag为“1”的message

反过来,第一个生效的consumer1的tag是“1”,第二个生效的consumer2的tag是“*”
则consumer1消费tag为“1”的message,consumer2消费所有的10条message

随后我就想到了一种骚操作:

既然consumer的过滤条件会冲突,那么tag和sql之间会冲突吗?
代码:

//第一种consumer
...
consumer.subscribe("TopicTest", MessageSelector.byTag("a"));
...
//第二种consumer
...
consumer.subscribe("TopicTest", MessageSelector.bySql("coal >=2 and coal <= 7"));
...

结论:

麻蛋,果然会冲突。

你可能感兴趣的:(RocketMQ踩坑:Tag与SQL冲突问题)