Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
Rocketmq
提交
ae7b6751
R
Rocketmq
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
Rocketmq
与 Fork 源项目一致
Fork自
Apache RocketMQ / Rocketmq
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rocketmq
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
ae7b6751
编写于
12月 02, 2021
作者:
D
dongeforever
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Finish the logic for RETRY message of logic queue
上级
085f2392
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
36 addition
and
36 deletion
+36
-36
broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java
...pache/rocketmq/broker/processor/SendMessageProcessor.java
+8
-0
client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
...ketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
+25
-31
docs/cn/statictopic/RocketMQ_Static_Topic_Logic_Queue_设计.md
docs/cn/statictopic/RocketMQ_Static_Topic_Logic_Queue_设计.md
+3
-5
未找到文件。
broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java
浏览文件 @
ae7b6751
...
...
@@ -212,6 +212,14 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement
return
CompletableFuture
.
completedFuture
(
response
);
}
if
(
requestHeader
.
getOriginTopic
()
!=
null
&&
!
msgExt
.
getTopic
().
equals
(
requestHeader
.
getOriginTopic
()))
{
//here just do some fence in case of some unexpected offset is income
response
.
setCode
(
ResponseCode
.
SYSTEM_ERROR
);
response
.
setRemark
(
"look message by offset failed to check the topic name"
+
requestHeader
.
getOffset
());
return
CompletableFuture
.
completedFuture
(
response
);
}
final
String
retryTopic
=
msgExt
.
getProperty
(
MessageConst
.
PROPERTY_RETRY_TOPIC
);
if
(
null
==
retryTopic
)
{
MessageAccessor
.
putProperty
(
msgExt
,
MessageConst
.
PROPERTY_RETRY_TOPIC
,
msgExt
.
getTopic
());
...
...
client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
浏览文件 @
ae7b6751
...
...
@@ -715,31 +715,28 @@ public class DefaultMQPushConsumerImpl implements MQConsumerInner {
sendMessageBack
(
msg
,
delayLevel
,
null
,
mq
);
}
private
void
sendMessageBack
(
MessageExt
msg
,
int
delayLevel
,
final
String
brokerName
,
final
MessageQueue
mq
)
throws
RemotingException
,
MQBrokerException
,
InterruptedException
,
MQClientException
{
try
{
String
desBrokerName
=
brokerName
;
if
(
mq
!=
null
)
{
String
tmpBrokerName
=
this
.
mQClientFactory
.
getBrokerNameFromMessageQueue
(
mq
);
if
(
tmpBrokerName
!=
null
)
{
desBrokerName
=
tmpBrokerName
;
}
}
if
(
MixAll
.
LOGICAL_QUEUE_MOCK_BROKER_NAME
.
equals
(
desBrokerName
))
{
desBrokerName
=
this
.
mQClientFactory
.
getBrokerNameFromMessageQueue
(
this
.
defaultMQPushConsumer
.
queueWithNamespace
(
new
MessageQueue
(
msg
.
getTopic
(),
msg
.
getBrokerName
(),
msg
.
getQueueId
())));
}
String
brokerAddr
=
null
;
if
(
null
!=
desBrokerName
)
{
brokerAddr
=
this
.
mQClientFactory
.
findBrokerAddressInPublish
(
desBrokerName
);
if
(
MixAll
.
LOGICAL_QUEUE_MOCK_BROKER_NAME
.
equals
(
brokerName
)
||
(
mq
!=
null
&&
MixAll
.
LOGICAL_QUEUE_MOCK_BROKER_NAME
.
equals
(
mq
.
getBrokerName
())))
{
sendMessageBackAsNormalMessage
(
msg
);
}
else
{
RemotingHelper
.
parseSocketAddressAddr
(
msg
.
getStoreHost
());
}
String
brokerAddr
=
(
null
!=
brokerName
)
?
this
.
mQClientFactory
.
findBrokerAddressInPublish
(
brokerName
)
:
RemotingHelper
.
parseSocketAddressAddr
(
msg
.
getStoreHost
());
this
.
mQClientFactory
.
getMQClientAPIImpl
().
consumerSendMessageBack
(
brokerAddr
,
msg
,
this
.
defaultMQPushConsumer
.
getConsumerGroup
(),
delayLevel
,
5000
,
getMaxReconsumeTimes
());
}
}
catch
(
Exception
e
)
{
log
.
error
(
"sendMessageBack Exception, "
+
this
.
defaultMQPushConsumer
.
getConsumerGroup
(),
e
);
sendMessageBackAsNormalMessage
(
msg
);
}
finally
{
msg
.
setTopic
(
NamespaceUtil
.
withoutNamespace
(
msg
.
getTopic
(),
this
.
defaultMQPushConsumer
.
getNamespace
()));
}
}
private
void
sendMessageBackAsNormalMessage
(
MessageExt
msg
)
throws
RemotingException
,
MQBrokerException
,
InterruptedException
,
MQClientException
{
Message
newMsg
=
new
Message
(
MixAll
.
getRetryTopic
(
this
.
defaultMQPushConsumer
.
getConsumerGroup
()),
msg
.
getBody
());
String
originMsgId
=
MessageAccessor
.
getOriginMessageId
(
msg
);
...
...
@@ -754,9 +751,6 @@ public class DefaultMQPushConsumerImpl implements MQConsumerInner {
newMsg
.
setDelayTimeLevel
(
3
+
msg
.
getReconsumeTimes
());
this
.
mQClientFactory
.
getDefaultMQProducer
().
send
(
newMsg
);
}
finally
{
msg
.
setTopic
(
NamespaceUtil
.
withoutNamespace
(
msg
.
getTopic
(),
this
.
defaultMQPushConsumer
.
getNamespace
()));
}
}
void
ackAsync
(
MessageExt
message
,
String
consumerGroup
)
{
...
...
docs/cn/statictopic/RocketMQ_Static_Topic_Logic_Queue_设计.md
浏览文件 @
ae7b6751
...
...
@@ -385,10 +385,9 @@ logicOffset的决策,依赖于上一个 PhysicalQueue 的最大位点。
*
所有位点相关的API,需要考虑 MappingItem endOffset,因为超过了 endOffset 可能已经不属于 当前 LogicQueue 了
*
新建 MappingItem,需要先获取 旧 MappingItem 的 endOffset
当前实现,为了保证简洁,禁止 PhysicalQueue 被重复利用,每次更新映射都会让物理层面的 writeQueues++ 和 readQueues++
当前实现,为了保证简洁,禁止 PhysicalQueue 被重复利用,每次更新映射都会让物理层面的 writeQueues++ 和 readQueues++
。
后续实现,可以考虑复用已经被清除掉的Physical,也即已经没有数据,位点从0开始。
#### 备机更新映射
当前,admin操作都是要求在Master操作的。因此,没有这个问题。
Command操作时,提前预判Master是否存在,如果不存在,则提前报错,减少中间失败率。
...
...
@@ -411,10 +410,9 @@ Command操作时,提前预判Master是否存在,如果不存在,则提前
#### 拉取消息时的 中断问题
当1个 PhysicalQueue 被拉取干净时,需要修正 nextBeginOffset 到下一个 PhysicalQueue。
如果没有处理好,则直接会导致拉取中断,无法前进。
#### pullResult 位点由谁设置的问题
类似于Batch,由客户端设置,避免服务端解开消息。
类似于Batch,由客户端设置,避免服务端解开消息:
在PullResultExt中新增字段 offsetDelta。
#### 远程读的性能问题
从实战经验来看,性能损耗几乎不计。
#### 使用习惯的改变
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录