在消息队列中,生产者负责发送消息到broker,本文讲解Rocketmq发送消息的实现原理以及一些注意的事项。
一、生产者端的发送流程

大致步骤
1、根据topic从nameserver或本地获取路由信息,队列信息,broker信息等
2、根据重试次数,循环发送消息
3、消息内容组装成RemotingCommand对象,包括请求头和请求体
4、分oneway,sync,async的方式进行发送
5、如果是async,oneway会获取令牌再发送
6、组装请求头,调用netty组件发送消息
7、结果处理
二、broker端接收发送消息请求与处理流程
源码入口
class NettyServerHandler extends SimpleChannelInboundHandler<RemotingCommand> {//netty监听客户端消息@Overrideprotected void channelRead0(ChannelHandlerContext ctx, RemotingCommand msg) throws Exception {processMessageReceived(ctx, msg);}}
发送消息的请求处理器
public class SendMessageProcessor extends AbstractSendMessageProcessor implements NettyRequestProcessor {private List<ConsumeMessageHook> consumeMessageHookList;public SendMessageProcessor(final BrokerController brokerController) {super(brokerController);}@Overridepublic RemotingCommand processRequest(ChannelHandlerContext ctx,RemotingCommand request) throws RemotingCommandException {SendMessageContext mqtraceContext;switch (request.getCode()) {//消费者消费消息 回执case RequestCode.CONSUMER_SEND_MSG_BACK:return this.consumerSendMsgBack(ctx, request);//发送消息请求default://解析请求头SendMessageRequestHeader requestHeader = parseRequestHeader(request);if (requestHeader == null) {return null;}mqtraceContext = buildMsgContext(ctx, requestHeader);this.executeSendMessageHookBefore(ctx, request, mqtraceContext);RemotingCommand response;//发送消息逻辑if (requestHeader.isBatch()) {response = this.sendBatchMessage(ctx, request, mqtraceContext, requestHeader);} else {response = this.sendMessage(ctx, request, mqtraceContext, requestHeader);}this.executeSendMessageHookAfter(response, mqtraceContext);return response;}}}
获取消息存储路径
// 用户目录+store+commitlogprivate String storePathCommitLog = System.getProperty("user.home") + File.separator + "store"+ File.separator + "commitlog";// CommitLog file size,default is 1Gprivate int mapedFileSizeCommitLog = 1024 * 1024 * 1024;<

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



