Comments (8)
嗯,你说的问题也是我一直在考虑的。
我觉得通过messageExt中的msgId来维护幂等性是成本很高的(比如将msgId或者key存入redis),所以我目前倾向的方式是通过消息key结合消息体中的业务属性做消费的幂等,如果有好的方式也欢迎提出来。
另,我也越发觉得messageExt中的很多属性需要暴露给消费者,比如我之前是不暴露key的,加了之后抽象类的api就发生了一次变化,依赖方就很痛苦了,也不愿意升级,所以需要更好的方式,正在考虑放到一个k-v的集合当中,有好的想法也欢迎加入一起改善。
from rocketmq-spring-boot-starter.
消息key结合消息体中的业务属性做消费的幂等我觉得也是可以的。
关于“我也越发觉得messageExt中的很多属性需要暴露给消费者”,深有同感哈,我fork的在我司内部版本,就将messageExt的tag也暴露给消费者了。这个我感觉还是很有必要的,因为当我订阅的Topic有多个tag的时候,按照目前的设计,我就不能根据tag来区分不同的业务场景。我只能再多建几个Topic。
还有一个问题我想说下,按照目前的设计,由于consumerGroup,topic都是写死在@MQConsumer注解的。这样一来就必须在每个环境都各自部署一套rocketmq服务,因为如果还是用同一套rocketmq服务,意味着各个环境都在共同使用topic,会导致环境间消费者消费错乱。所以我fork的版本,稍微改造了下,允许在消费者中定义topic,consumerGroup属性(优先使用@MQConsumer里的topic与consumerGroup)。这样我们只要配置不同的topic名称,不同的consumerGroup名称,就能隔离不同环境的消息错乱问题。哎,公司穷没办法哈。。。
使用方法如下:
`@MQConsumer(tag = "A")
public class DemoConsumerA extends AbstractMQPushConsumer{
@Value("${rocketmq.demoConsumerA.topic}")
private String topic;
@Value("${rocketmq.demoConsumerA.consumerGroup}")
private String consumerGroup;
@Override
public boolean process(String messageKey, String tag, Demo message) {
System.out.println("DemoConsumerA.process "+"messageKey=【"+messageKey+"】,message=【"+message+"】");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
}`
application.yml里定义下就好:
rocketmq:
...
demoConsumerA:
topic: TP_DEMO
consumerGroup: CID_DEMO_A
对于生产者还好,因为发送消息的时候,可以指定topic。这是我fork的,经过修改后我们公司使用的版本
https://github.com/jaychang9/qh-rocketmq-spring-boot-starter 本来想发个pull request的,但我觉得可能这个特性并不是大家所需要的。
from rocketmq-spring-boot-starter.
@jaychang9
topic和consumerGroup是支持配置项的,具体实现在 代码 MQConsumerAutoConfiguration
中:
String consumerGroup = applicationContext.getEnvironment().getProperty(mqConsumer.consumerGroup());
if(StringUtils.isEmpty(consumerGroup)) {
consumerGroup = mqConsumer.consumerGroup();
}
String topic = applicationContext.getEnvironment().getProperty(mqConsumer.topic());
if(StringUtils.isEmpty(topic)) {
topic = mqConsumer.topic();
}
会尝试先将注解中的内容解析为一个配置项。
ps.我个人不是很倾向大力推广tag的方式,因为调用方可能无意中使用了同一个consumerGroup来监听同一个topic的多个tag,因为rocketmq的特性就会导致消息丢失或者重复,你在使用的时候也可以注意一下。
还有在我们实际应用场景中,还是做了不同环境的物理隔离,即不同环境部署不同的mq实例,这样可以最大程度避免消息不知道被谁消费掉的问题。
from rocketmq-spring-boot-starter.
非常感谢作者能及时回复,这个可以有,那比如我的Consumer类定义的注解是@MQConsumer(consumerGroup="CID_DEMO",topic="TP_DEMO") 如果我想覆盖注解中的consumerGroup topic配置的话,是不是加下启动参数,或者是配置一个环境变量?
比如 jar -jar xxx.jar -DCID_DEMO=CID_DEMO_DEV -DTP_DEMO=TP_DEMO_DEV
from rocketmq-spring-boot-starter.
@jaychang9
master分支的最新代码中,使用了extMap 来存放messageExt中的属性和message.properties中的属性,一起帮忙看看这样实现合适不。
from rocketmq-spring-boot-starter.
关于消息幂等的处理还是决定交给业务方通过extMap中的属性来自行处理
from rocketmq-spring-boot-starter.
好的,我去看看,这几天没看github
from rocketmq-spring-boot-starter.
看了下哈,我感觉还不如直接把MessageExt暴露出来给使用者。。。用的时候还得从map里根据key取出来,而且还得强转类型。因为存的时候值是Object类型。
from rocketmq-spring-boot-starter.
Related Issues (20)
- 关于这次版本升级,提出的几点问题 HOT 7
- ons自动切换 HOT 7
- 同步刷盘timeout,项目是进行重新推送,但doAfterSyncSend却没有消息的内容无法重新推送 HOT 2
- 建议可通过配置设置VipChannelEnabled HOT 7
- 在springmvc中如何使用 HOT 1
- 怎么启动项目呢??? HOT 1
- 楼主这个项目支持事务消息吗? HOT 1
- 多个队列发送如何支持 HOT 1
- 事务消息发送支持 HOT 1
- 消费者每次只能接受到发送消息的四分之一 HOT 4
- 事务消息demo
- key怎么用? HOT 2
- 事务消息使用 HOT 1
- 关于 ConsumerGroup、Topic、Tags 的验证逻辑 HOT 2
- RocketMq消息轨迹的问题 HOT 1
- spring xml 风格的配置支持吗
- 设置消费线程池
- 启动后报循环依赖的问题
- 是否支持5.0
- 在SpringBoot3.1.5中无法使用 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rocketmq-spring-boot-starter.