hutu92 opened a new issue #574: 关于RocketMQ消息存储的几点问题
URL: https://github.com/apache/rocketmq/issues/574
 
 
   最近将RocketMQ的底层存储源码逐行看了一遍,发现了如下几个问题,希望能逐个解答一下或者修复该问题(如果我是对的话)。谢谢:two_hearts:。
   
   **1.关于锁synchronized的使用问题;**
   
   
https://github.com/apache/rocketmq/blob/1bedba8cbcef32554d2dc80f2a340ea686d68ba9/store/src/main/java/org/apache/rocketmq/store/CommitLog.java#L1069
   
   
https://github.com/apache/rocketmq/blob/1bedba8cbcef32554d2dc80f2a340ea686d68ba9/store/src/main/java/org/apache/rocketmq/store/CommitLog.java#L1136
   
   我认为上述两处的synchronized是完全没有必要的。减少没必要的锁的使用会增加性能:smile:。
   
   **2. 睡眠时间不合理,可能会造成正在处理的消息响应失败;**
   
   
https://github.com/apache/rocketmq/blob/1bedba8cbcef32554d2dc80f2a340ea686d68ba9/store/src/main/java/org/apache/rocketmq/store/CommitLog.java#L1131
   
   GroupCommitService此处的睡眠时间是否合理?
   
   
因为是同步刷盘策略,设置时间过短,在shutdown时,可能会造成正在处理的消息(eg,正在执行appendMessages的消息)来不及刷盘,进而响应失败(FLUSH_DISK_TIMEOUT)。
   
   是否可以采用其它方式?或者适当延长下时间?10毫秒是不是太短了。
   
   3. 可能会造成消息丢失;
   
   
https://github.com/apache/rocketmq/blob/1bedba8cbcef32554d2dc80f2a340ea686d68ba9/store/src/main/java/org/apache/rocketmq/store/CommitLog.java#L943-L947
   
   CommitRealTimeService此处没有第2点中提到的sleep机制。这里是采用尝试10次commit。
   
   举个简单的场景:
   
   1. A 在执行appendMessages;
   2. B 在执行appendMessages;
   3. 在B执行完appendMessages,还未来得及通知CommitRealTimeService,与此同时shutdown;
   4. 注意,A还未执行完appendMessages;
   4. 按照上述代码逻辑,会尝试10次commit,再第1次时就能将B消息commit,并结束循环;
   5. A 执行完appendMessages;
   
   **问题就在于A消息不会被commit了,A消息丢失。但给客户端返回的响应就是OK:anger:。**
   
   相同的,**FlushRealTimeService异步刷盘也有类似问题。**
   
   4. sleep(0)的问题
   
   
https://github.com/apache/rocketmq/blob/1bedba8cbcef32554d2dc80f2a340ea686d68ba9/store/src/main/java/org/apache/rocketmq/store/MappedFile.java#L507
   
   -XX:+ConvertSleepToYield 这个参数默认就是 true,如果 sleep 0 的话会转换成 yield
   
   但是 **ConvertSleepToYield 设为 false 时,会进行 sleep,且 sleep 的最小时间是 1 ms**,也就是说 
ConvertSleepToYield 为 false 时,哪怕是 sleep 0 实际上跟 sleep 1 
是一样的。**这样的话,并不会让出线程的时间片。**
   
   我个人认为 RocketMQ 应改为 Thread.yield 处理。或许sleep(0)有其它的意图?
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to