RocketMQ架构 - 同步发送

前言

围绕 defaultMQProducer.send(message) 这行代码展开分析。

源码解析

经过下面的一系列代码分析,RocketMQ发送消息的底层借助Netty的Channel#writeAndFlush(…)方法实现。
在这里插入图片描述
在这里插入图片描述
通过defaultMQProducer.setSendMsgTimeout(int timeout)方法改变默认的发送消息的超时时间。默认是3秒。

在这里插入图片描述
通过第二个参数CommunicationMode.SYNC,传递同步的通信方式。

在这里插入图片描述

private SendResult sendDefaultImpl(
    Message msg,
    final CommunicationMode communicationMode,
    final SendCallback sendCallback,
    final long timeout
) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
   
	/* 确保ServiceState是running状态 */
    this.makeSureStateOK();
    /* 要求消息体不为空、消息大小不超过消息最大的大小(默认是4MB)*/
    /* 要求topic不为空,长度不能>=255,不能是TBW102,不能包含非法字符 */
    Validators.checkMessage(msg, this.defaultMQProducer);
	.....
    TopicPublishInfo topicPublishInfo = this.tryToFindTopicPublishInfo(msg.getTopic());
     /* ok() : TopicPublishInfo#ArrayList<MessageQueue>属性有元素 */
    if (topicPublishInfo != null && topicPublishInfo.ok()) {
   
		.....
		/* 同步发送的生产者的重试次数为1 */
        int timesTotal = communicationMode == CommunicationMode.SYNC ? 1 + this.defaultMQProducer.getRetryTimesWhenSendFailed() : 1;
        int times = 0;
        String[] brokersSent = new String[timesTotal];
        for (; times < timesTotal; times++) {
   
       
            /* MQFaultStrategy选取一个MessageQueue */
            MessageQueue mqSelected = this.selectOneMessageQueue(topicPublishInfo, null);
            if (mqSelected != null) {
   
                mq = mqSelected;
                brokersSent[times] = mq.getBrokerName();
               		......
               		/* 发送消息的核心方法 */
                    sendResult = this.sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout - costTime);
                    ......
                    switch (communicationMode) {
   
                    .....
                        case SYNC:
                            if (sendResult.getSendStatus() != SendStatus.SEND_OK) {
   
                            	/* Indicate whether to retry another broker on sending failure internally. */
                                if (this.defaultMQProducer.isRetryAnotherBrokerWhenNotStoreOK()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供有关RocketMQ的一些笔记。这是一个开源的分布式消息中间件系统,由阿里巴巴集团开发和维护。RocketMQ具有高可用性、高吞吐量和可伸缩性,适用于构建实时数据处理、大规模消息系统和事件驱动架构等场景。 下面是一些关键点和要点: 1. 架构RocketMQ采用了主题(Topic)和队列(Queue)的概念。主题是消息的逻辑分类,队列则是主题的物理分区。每个队列都有自己的消费者组来处理消息。 2. 消息模型:RocketMQ支持两种消息模型:发布/订阅模型和点对点模型。在发布/订阅模型中,消息发送到主题,然后订阅者从主题订阅消息。在点对点模型中,消息发送到队列,然后消费者从队列中消费消息。 3. 可靠性:RocketMQ提供了多种机制来确保消息的可靠性传输,包括同步发送、异步发送和定时发送。还支持消息顺序发送和顺序消费。 4. 高可用性:RocketMQ通过主从复制和Broker集群来实现高可用性。每个主题的队列都可以在多个Broker之间进行复制,以实现数据冗余和容错。 5. 扩展性:RocketMQ可以通过添加更多的Broker节点来扩展系统容量和吞吐量。还支持动态扩展和缩减Broker集群。 6. 消息过滤:RocketMQ支持基于Tag或SQL表达式的消息过滤,以便订阅者只接收感兴趣的消息。 这只是RocketMQ的一些基本信息,还有很多其他特性和概念,如事务消息、消息轨迹、延迟消息等。如果您对RocketMQ有进一步的疑问,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值