RocketMQ发送消息流程

109 阅读1分钟

RocketMQ发送消息流程如下

DefaultMQProducer实现增加了RPCHook,RPCHook用于拦截请求和响应

DefaultMQProducer.send
	defaultMQProducerImpl.send  --- 默认同步发送
		this.sendDefaultImpl
			this.tryToFindTopicPublishInfo  --- 获取topic路由 默认4个messageQueue
			----- 选择MessageQueue 发送消息;同步策略尝试3次,失败会记录MessageQueue,用于下次重试排除
			this.selectOneMessageQueue
			defaultMQProducer.withNamespace  --- 重试的时候重新设置topic
			this.sendKernelImpl   ---- 发送消息
				mQClientFactory.findBrokerAddressInPublish	---- 查找broker地址
				MixAll.brokerVIPChannel --- 是否转换成vip vip:端口-2
				hasCheckForbiddenHook	--- CheckForbiddenHook
				this.executeCheckForbiddenHook
				this.hasSendMessageHook	--- SendMessageHook
				this.executeSendMessageHookBefore

				--- 同步发送消息 逻辑 ---
				mQClientFactory.getMQClientAPIImpl().sendMessage
					this.sendMessageSync
						remotingClient.invokeSync
							doBeforeRpcHooks	--- RPCHook
							this.invokeSyncImpl	--- netty发送请求
								new NettyClientHandler.channelRead0 --- Neety 等待请求结果,处理结果
									processMessageReceived
										processResponseCommand
							doAfterRpcHooks	--- RPCHook
					this.processSendResponse	--- 请求结果
				this.hasSendMessageHook	---是否有后置拦截请求,即SendMessageHook
				this.executeSendMessageHookAfter

				--- 异步发送逻辑
				mQClientFactory.getMQClientAPIImpl().sendMessage
					this.sendMessageAsync
						remotingClient.invokeAsync
							this.invokeAsyncImpl
								doBeforeRpcHooks
								this.invokeAsyncImpl
									new NettyClientHandler.channelRead0 --- Neety 等待请求结果,处理结果
										processMessageReceived
											processResponseCommand
												executeInvokeCallback	--- InvokeCallback.operationComplete
													MQClientAPIImpl.this.processSendResponse
													sendCallback.onSuccess	--- sendCallback不为空,SendCallback用于监控异步发送消息成功/异常处理

				--- oneWay 逻辑
				mQClientFactory.getMQClientAPIImpl().sendMessage
					remotingClient.invokeOneway
						doBeforeRpcHooks
						this.invokeOnewayImpl
							new NettyClientHandler.channelRead0 --- Neety 等待请求结果,处理结果
								processMessageReceived
									processResponseCommand


RocketMQ发送消息类图如下

未命名文件 (1).png