<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>RocketMQ on 知识铺的博客</title>
    <link>https://index.zshipu.com/geek/tags/rocketmq/</link>
    <description>Recent content in RocketMQ on 知识铺的博客</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 06 Mar 2024 13:58:00 +0000</lastBuildDate>
    <atom:link href="https://index.zshipu.com/geek/tags/rocketmq/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>rocketmq-send-store</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-send-store/</link>
      <pubDate>Wed, 06 Mar 2024 13:58:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-send-store/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ 消息发送存储流程 第一步：检查消息存储状态 org.apache.rocketmq.store.DefaultMessageStore#checkStoreStatus 1、检查 broker 是否可用 1 2 3 4 if (this.shutdown) { log.warn(&amp;#34;message store has shutdown, so putMessage is forbidden&amp;#34;); return PutMessageStatus.SERVICE_NOT_AVAILABLE; } 2、检查 broker 的角色 1 2 3 4 5 6 7 if (BrokerRole.SLAVE== this.messageStoreConfig.getBrokerRole()) { long value = this.printTimes.getAndIncrement(); if ((value % 50000) == 0) { log.warn(&amp;#34;broke role is slave, so putMessage is forbidden&amp;#34;); } return PutMessageStatus.SERVICE_NOT_AVAILABLE; } 3、检查 messageStore 是否可写 1 2 3 4 5 6 7 8 9 10 if (!this.runningFlags.isWriteable()) { long value = this.printTimes.getAndIncrement(); if ((value % 50000) ==</description>
    </item>
    <item>
      <title>rocketmq-send-message</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-send-message/</link>
      <pubDate>Wed, 06 Mar 2024 13:57:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-send-message/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ 消息发送流程 这里以同步发送为示例讲解： 入口： org.apache.rocketmq.client.producer.DefaultMQProducer#send(org.apache.rocketmq.common.message.Message) 消息发送 默认超时时间 3 秒 第一步：验证 主题的长度不能大于 127，消息的大小不能大于 4M 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public static void checkMessage(Message msg, DefaultMQProducer defaultMQProducer) throws MQClientException { if (null == msg) { throw new MQClientException(ResponseCode.MESSAGE_ILLEGAL, &amp;#34;the message is null&amp;#34;); } // topic Validators.checkTopic(msg.getTopic()); Validators.isNotAllowedSendTopic(msg.getTopic()); // body if (null == msg.getBody()) { throw</description>
    </item>
    <item>
      <title>rocketmq-pullmessage</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-pullmessage/</link>
      <pubDate>Wed, 06 Mar 2024 13:56:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-pullmessage/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ 消息拉取流程 之前在消费者启动流程中描述过 MQClientInstance 的启动流程，在启动过程中会启动 PullMessageService，它继承了ServiceThread，并且 ServiceThread 实现了 Runnable 接口，所以是单独启动了一个线程 public class PullMessageService extends ServiceThread public abstract class ServiceThread implements Runnable PullMessageService 的 run 方法如下： protected volatile boolean stopped = false; 1</description>
    </item>
    <item>
      <title>rocketmq-pullmessage-processor</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-pullmessage-processor/</link>
      <pubDate>Wed, 06 Mar 2024 13:55:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-pullmessage-processor/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ broker 处理拉取消息请求流程 org.apache.rocketmq.broker.processor.PullMessageProcessor#processRequest(io.netty.channel.ChannelHandlerContext, org.apache.rocketmq.remoting.protocol.RemotingCommand) 第 1 步、校验broker是否可读 1 2 3 4 5 if (!PermName.isReadable(this.brokerController.getBrokerConfig().getBrokerPermission())) { response.setCode(ResponseCode.NO_PERMISSION); response.setRemark(String.format(&amp;#34;the broker[%s] pulling message is forbidden&amp;#34;, this.brokerController.getBrokerConfig().getBrokerIP1())); return response; } 第 2 步、根据消费组获取订阅信息 1 2 SubscriptionGroupConfig subscriptionGroupConfig = this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(requestHeader.getConsumerGroup()); 第 3 步、校验是否允许消费 1 2 3 4 5 if (!subscriptionGroupConfig.isConsumeEnable()) { response.setCode(ResponseCode.NO_PERMISSION); response.setRemark(&amp;#34;subscription group no permission, &amp;#34; + requestHeader.getConsumerGroup()); return response; } 第 4 步、根据主题获取对应的配置信息 1 2 3 4</description>
    </item>
    <item>
      <title>rocketmq-producer-start</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-producer-start/</link>
      <pubDate>Wed, 06 Mar 2024 13:54:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-producer-start/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ 生产者启动流程 入口： org.apache.rocketmq.client.producer.DefaultMQProducer#start 1 2 3 4 5 6 7 8 9 10 11 12 @Override public void start() throws MQClientException { this.setProducerGroup(withNamespace(this.producerGroup)); this.defaultMQProducerImpl.start(); if (null != traceDispatcher) { try { traceDispatcher.start(this.getNamesrvAddr(), this.getAccessChannel()); } catch (MQClientException e) { log.warn(&amp;#34;trace dispatcher start failed &amp;#34;, e); } } } 第一步、检查 producerGroup 1 2 3 4 5 6 7 8 9 10 11 private void checkConfig() throws MQClientException { Validators.checkGroup(this.defaultMQProducer.getProducerGroup()); if (null == this.defaultMQProducer.getProducerGroup()) { throw new MQClientException(&amp;#34;producerGroup is null&amp;#34;, null); } if (this.defaultMQProducer.getProducerGroup().equals(MixAll.DEFAULT_PRODUCER_GROUP)) { throw new MQClientException(&amp;#34;producerGroup can not equal &amp;#34; + MixAll.DEFAULT_PRODUCER_GROUP + &amp;#34;, please specify another one.&amp;#34;,null); } } 第二步、设置 instanceName 1 2</description>
    </item>
    <item>
      <title>rocketmq-nameserver-broker</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-nameserver-broker/</link>
      <pubDate>Wed, 06 Mar 2024 13:53:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-nameserver-broker/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RockerMQ Nameserver 如何与 Broker 进行通信的？ nameserver 每隔 10s 扫描一次 Broker，移除处于未激活状态的 Broker 核心代码： this.scheduledExecutorService.scheduleAtFixedRate(NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.*SECONDS*); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public int scanNotActiveBroker() { int removeCount = 0; Iterator&amp;lt;Entry&amp;lt;String, BrokerLiveInfo&amp;gt;&amp;gt; it = this.brokerLiveTable.entrySet().iterator(); while (it.hasNext()) { Entry&amp;lt;String, BrokerLiveInfo&amp;gt; next = it.next(); long last = next.getValue().getLastUpdateTimestamp(); if ((last +BROKER_CHANNEL_EXPIRED_TIME) &amp;lt; System.currentTimeMillis()) { RemotingUtil.closeChannel(next.getValue().getChannel()); it.remove(); log.warn(&amp;#34;The broker channel expired, {} {}ms&amp;#34;, next.getKey(),BROKER_CHANNEL_EXPIRED_TIME); this.onChannelDestroy(next.getKey(), next.getValue().getChannel()); removeCount++; } } return removeCount; } broker 每隔 30 秒会向集群</description>
    </item>
    <item>
      <title>rocketmq-mappedfile-detail</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-mappedfile-detail/</link>
      <pubDate>Wed, 06 Mar 2024 13:52:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-mappedfile-detail/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ MappedFile 内存映射文件详解 1、MappedFile 初始化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 private void init(final String fileName, final int fileSize) throws IOException { this.fileName = fileName; this.fileSize = fileSize; this.file = new File(fileName); this.fileFromOffset = Long.parseLong(this.file.getName()); boolean ok = false; ensureDirOK(this.file.getParent()); try { this.fileChannel = new RandomAccessFile(this.file, &amp;#34;rw&amp;#34;).getChannel(); this.mappedByteBuffer = this.fileChannel.map(MapMode.READ_WRITE, 0, fileSize); TOTAL_MAPPED_VIRTUAL_MEMORY.addAndGet(fileSize); TOTAL_MAPPED_FILES.incrementAndGet(); ok = true; } catch (FileNotFoundException e) { log.error(&amp;#34;Failed to create file &amp;#34; + this.fileName, e); throw e; } catch (IOException e) { log.error(&amp;#34;Failed to map file</description>
    </item>
    <item>
      <title>rocketmq-indexfile</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-indexfile/</link>
      <pubDate>Wed, 06 Mar 2024 13:51:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-indexfile/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ IndexFile 详解 首先明确一下 IndexFile 的文件结构 Index header + 哈希槽，每个槽下面挂载 index 索引,类似哈希表的结构 一个 Index 文件默认包含 500 万个哈希槽，一个哈希槽最多存储 4 个 index，也就是一个 IndexFile 默认最多包含 2000 万个 index Index header： 40byte Index header = 8byte 的 beginTimestamp（In</description>
    </item>
    <item>
      <title>rocketmq-consumer-start</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-consumer-start/</link>
      <pubDate>Wed, 06 Mar 2024 13:50:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-consumer-start/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ 消费者启动流程 org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#start 1、检查配置信息 org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#checkConfig 校验消费组的长度不能大于 255 public static final int CHARACTER_MAX_LENGTH = 255; 1 2 3 if (group.length() &amp;gt;CHARACTER_MAX_LENGTH) { throw new MQClientException(&amp;#34;the specified group is longer than group max length 255.&amp;#34;, null); } 消费组名称只能包含数字、字母、%、-、_、| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // regex: ^[%|a-zA-Z0-9_-]+$ // % VALID_CHAR_BIT_MAP[&amp;#39;%&amp;#39;] = true; // - VALID_CHAR_BIT_MAP[&amp;#39;-&amp;#39;] = true; // _ VALID_CHAR_BIT_MAP[&amp;#39;_&amp;#39;] = true; // |</description>
    </item>
    <item>
      <title>rocketmq-consumequeue</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-consumequeue/</link>
      <pubDate>Wed, 06 Mar 2024 13:49:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-consumequeue/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ ConsumeQueue 详解 RocketMQ 基于主题订阅模式实现消息消费，消费者关注每一个主题下的所有消息，但是同一主题下的消息是不连续地存储在 CommitLog 文件中的，如果消费者直接从消息存储文件中遍历查找主题下的消息，效率会特别低。所以为了在查找消息的时候效率更高一些，设计了 ConsumeQueue 文件，可以</description>
    </item>
    <item>
      <title>rocketmq-consume-message-process</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-consume-message-process/</link>
      <pubDate>Wed, 06 Mar 2024 13:48:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-consume-message-process/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ 消息消费流程 拉取消息 成功之后 会调用 org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService#submitConsumeRequest 组装 消费消息 请求 获取 consumeMessageBatchMaxSize,表示一个 ConsumeRequest 包含的消息 数量，默认为 1 入参 msgs 为拉取消息的最大值，默认为 32 如果 msgs 小于等于 consumeMessageBatchMaxSiz</description>
    </item>
    <item>
      <title>rocketmq-commitlog</title>
      <link>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-commitlog/</link>
      <pubDate>Wed, 06 Mar 2024 13:47:00 +0000</pubDate>
      <guid>https://index.zshipu.com/geek/post/code/docs/rocketmq/rocketmq-commitlog/</guid>
      <description>该文所涉及的 RocketMQ 源码版本为 4.9.3。 RocketMQ CommitLog 详解 commitlog 目录主要存储消息，为了保证性能，顺序写入，每一条消息的长度都不相同，每条消息的前面四个字节存储该条消息的总长度，每个文件大小默认为 1G，文件的命名是以 commitLog 起始偏移量命名的，可以通过修改 broker 配置文件中 mappedFileSizeCommitLog 属性改变文件大小 1、获取最小偏移量 org.apache.rocketmq.store.CommitLog#getMinOffset 1</description>
    </item>
    <item>
      <title>消息中间件消息消费三消息消费重试</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E4%B8%89%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E9%87%8D%E8%AF%95/</link>
      <pubDate>Tue, 15 Mar 2022 09:08:41 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E4%B8%89%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E9%87%8D%E8%AF%95/</guid>
      <description>摘要：如果Consumer端消费消息失败，那么RocketMQ是如何对失败的异常情况进行处理？ 前面两篇RocketMQ消息消费（一）/（二）篇，主要从Push/Pull两种消费模式的简要流程、长轮询机制和Consumer端负载均衡这几点内容出发，介绍了RocketMQ消息消费的正</description>
    </item>
    <item>
      <title>消息中间件消息存储一</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E5%AD%98%E5%82%A8%E4%B8%80/</link>
      <pubDate>Tue, 15 Mar 2022 09:06:38 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E5%AD%98%E5%82%A8%E4%B8%80/</guid>
      <description>文章摘要：MQ分布式消息队列大致流程在于消息的一发一收一存，本篇将为大家主要介绍下RocketMQ存储部分的架构 消息存储是MQ消息队列中最为复杂和最为重要的一部分，所以小编也就放在RocketMQ系列篇幅中最后一部分来进行阐述和介绍。本文先从目前几种比较常用的MQ消息队列存储方式</description>
    </item>
    <item>
      <title>消息中间件的通信二</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E7%9A%84%E9%80%9A%E4%BF%A1%E4%BA%8C/</link>
      <pubDate>Tue, 15 Mar 2022 09:06:30 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E7%9A%84%E9%80%9A%E4%BF%A1%E4%BA%8C/</guid>
      <description>文章摘要：如何设计RPC通信层模型是任何一款性能强劲的MQ所要重点考虑的问题 在（一）篇中主要介绍了RocketMQ的协议格式，消息编解码，通信方式(同步/异步/单向)、消息发送/接收以及异步回调的主要通信流程。而本篇将主要对RocketMQ消息队列RPC通信部分的Netty多线程</description>
    </item>
    <item>
      <title>消息中间件消息发送</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81/</link>
      <pubDate>Tue, 15 Mar 2022 09:05:14 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81/</guid>
      <description>大道至简，消息队列可以简单概括为：“一发一存一收”，在这三个过程中消息发送最为简单，也比较容易入手，适合初中阶童鞋作为MQ研究和学习的切入点。因此，本篇主要从一条消息发送为切入点，详细阐述在RocketMQ这款分布式消息队列中发送一条普通消息的大致流程和细节。在阅读本篇之前希望读</description>
    </item>
    <item>
      <title>消息中间件的通信一</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E7%9A%84%E9%80%9A%E4%BF%A1%E4%B8%80/</link>
      <pubDate>Tue, 15 Mar 2022 09:02:29 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E7%9A%84%E9%80%9A%E4%BF%A1%E4%B8%80/</guid>
      <description>文章摘要：借用小厮的一句话“消息队列的本质在于消息的发送、存储和接收”。那么，对于一款消息队列来说，如何做到消息的高效发送与接收是重点和关键 一、RocketMQ中Remoting通信模块概览 RocketMQ消息队列的整体部署架构如下图所示： 先来说下RocketMQ消息队列集群中的</description>
    </item>
    <item>
      <title>消息中间件消息消费一</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E4%B8%80/</link>
      <pubDate>Tue, 15 Mar 2022 08:59:36 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E4%B8%80/</guid>
      <description>文章摘要：在发送消息给RocketMQ后，消费者需要消费。消息的消费比发送要复杂一些，那么RocketMQ是如何来做的呢？ 在RocketMQ系列文章的前面几篇幅中已经对其“RPC通信部分”和“普通消息发送”两部分进行了详细的阐述，本文将主要从消息消费为切入点简要地介绍下“Rock</description>
    </item>
    <item>
      <title>消息中间件消息消费二模式实现</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E4%BA%8C%E6%A8%A1%E5%BC%8F%E5%AE%9E%E7%8E%B0/</link>
      <pubDate>Mon, 14 Mar 2022 17:45:49 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E4%BA%8C%E6%A8%A1%E5%BC%8F%E5%AE%9E%E7%8E%B0/</guid>
      <description>摘要：在RocketMQ中，消息消费都是基于Pull消息方式，那么Push模式中又是如何实现Consumer端准实时消费的呢？ 在上一篇—“消息中间件—RocketMQ消息消费（一）”中，已经简要地介绍了下RocketMQ中“Pull和Push两种消费方式的简要流程”以及“Push</description>
    </item>
    <item>
      <title>同程旅行网基于高可用架构实践</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E5%90%8C%E7%A8%8B%E6%97%85%E8%A1%8C%E7%BD%91%E5%9F%BA%E4%BA%8E%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84%E5%AE%9E%E8%B7%B5/</link>
      <pubDate>Mon, 14 Mar 2022 17:32:56 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E5%90%8C%E7%A8%8B%E6%97%85%E8%A1%8C%E7%BD%91%E5%9F%BA%E4%BA%8E%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84%E5%AE%9E%E8%B7%B5/</guid>
      <description>作者： 刘树东 背景介绍 为何选择 RocketMQ 我们在几年前决定引入 MQ 时，市场上已经有不少成熟的解决方案，比如 RabbitMQ , ActiveMQ，NSQ，Kafka 等。考虑到稳定性、维护成本、公司技术栈等因素，我们选择了 RocketMQ ： 纯 Java 开发，无依赖，使用简单，出现问题能 hold ； 经过阿里双十一考验，性能、稳定性可以保障； 功能</description>
    </item>
    <item>
      <title>消息中间件消息存储二</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E5%AD%98%E5%82%A8%E4%BA%8C/</link>
      <pubDate>Mon, 14 Mar 2022 17:32:43 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B6%88%E6%81%AF%E5%AD%98%E5%82%A8%E4%BA%8C/</guid>
      <description>http://www.6aiq.com/article/1563128272857 http://www.6aiq.com/article/1563128435731 http://www.6aiq.com/article/1563129642050 http://www.6aiq.com/article/1563129820252 http://www.6aiq.com/article/1563130068940 http://www.6aiq.com/article/1563130337444 http://www.6aiq.com/article/1563130479801 RokcetMQ文件存储设计架构_v2.jpg 上面图中假设Consumer端默认设置的是同一个ConsumerGroup，因此Consumer端线程采用的是负载订阅的方式进行消费。从架构图中可以总结出如下几个关键点： （1） 消息生产与消息消费相互分离，Producer</description>
    </item>
    <item>
      <title>滴滴出行基于构建企业级消息队列服务的实践</title>
      <link>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%BB%B4%E6%BB%B4%E5%87%BA%E8%A1%8C%E5%9F%BA%E4%BA%8E%E6%9E%84%E5%BB%BA%E4%BC%81%E4%B8%9A%E7%BA%A7%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%AE%9E%E8%B7%B5/</link>
      <pubDate>Mon, 14 Mar 2022 16:42:25 +0800</pubDate>
      <guid>https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%BB%B4%E6%BB%B4%E5%87%BA%E8%A1%8C%E5%9F%BA%E4%BA%8E%E6%9E%84%E5%BB%BA%E4%BC%81%E4%B8%9A%E7%BA%A7%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%AE%9E%E8%B7%B5/</guid>
      <description>作者： 江海挺 2018-11-20 本文整理自滴滴出行消息队列负责人 江海挺 在 Apache RocketMQ 开发者沙龙北京站的分享。 滴滴出行的消息技术选型 历史 初期，公司内部没有专门的团队维护消息队列服务，所以消息队列使用方式较多，主要以 Kafka 为主，有业务直连的，也有通过独立的服务转发消息的。另外有一些团队也会用 RocketMQ、Re</description>
    </item>
  </channel>
</rss>
