RocketMQ-NameSrv

Namesrv機能の概要

ネームサーバーは、プロデューサーとコンシューマーの構成情報とステータス情報を維持し、さまざまな役割の共同実行を調整する責任があります。ネームサーバーの役割を通じて、クラスターの全体的な情報を理解することができ、ネームサーバーにステータスを定期的に報告します

NamesrvStartupスタートアップ構成

// NamesrvConfig 默认配置
// private String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV));

// private String kvConfigPath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "kvConfig.json";
    
// private String configStorePath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "namesrv.properties";
    
// private String productEnvName = "center";
// private boolean clusterTest = false;
// private boolean orderMessageEnable = false;
final NamesrvConfig namesrvConfig = new NamesrvConfig();

// NettyServerConfig 默认配置
// private int listenPort = 8888;
// private int serverWorkerThreads = 8;
// private int serverCallbackExecutorThreads = 0;
// private int serverSelectorThreads = 3;
// private int serverOnewaySemaphoreValue = 256;
// private int serverAsyncSemaphoreValue = 64;
// private int serverChannelMaxIdleTimeSeconds = 120;

// private int serverSocketSndBufSize = NettySystemConfig.socketSndbufSize;
// private int serverSocketRcvBufSize = NettySystemConfig.socketRcvbufSize;
// private boolean serverPooledByteBufAllocatorEnable = true;
final NettyServerConfig nettyServerConfig = new NettyServerConfig();
nettyServerConfig.setListenPort(9876);

Namesrvルーティング機能

https://www.jianshu.com/p/5161c16a0a29
namesrvはクラスターモードをサポートしますが、各namesrvは独立しており、相互に通信しません。そのマルチポイント災害耐性は、プロデューサー/コンシューマーがnamesrvにアクセスするときに情報をポーリングすることによって取得されます。 (現在のノードがアクセスに失敗した場合は、次のノードに移動します)

登録センターとして、namesrvはブローカーの定期的な登録情報を受け取り、それらをメモリに保持する責任があります。Namesrvには永続化機能がありません。すべてのデータはメモリに保存されます。ブローカーの登録プロセスもすべてのnamesrvをループして登録します。

Namesrvルーティング情報管理クラス

org.apache.rocketmq.namesrv.routeinfo。RouteInfoManager

    private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
    private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
    private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
    private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
    private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

クラスター情報:クラスター->ブローカー->トピック->キュー
アクティブブローカー情報:brokerLiveTable
メッセージフィルタリングサーバー:filterServerTable

public class BrokerData implements Comparable<BrokerData> {
    
    
    private String cluster;
    private String brokerName;
    private HashMap<Long/* brokerId */, String/* broker address */> brokerAddrs;
}

public class QueueData implements Comparable<QueueData> {
    
    
    private String brokerName;
    private int readQueueNums;
    private int writeQueueNums;
    private int perm;
    private int topicSynFlag;
}

class BrokerLiveInfo {
    
    
    private long lastUpdateTimestamp;  // 存储上次收到Broker 心跳包的时间
    private DataVersion dataVersion;
    private Channel channel;
    private String haServerAddr;
}

ルート登録

ブローカーが起動すると、クラスター内のすべて
のネームサーバーにハートビートステートメントを送信し、30秒ごとにクラスター内のすべてのネームサーバーにハートビートパケットを送信します。ネームサーバーは、ブローカーハートビートパケットを受信した後、brokerLiveTableキャッシュ内のBrokerLiveInfoのlastUpdateTimestampを更新し、
クラスターを維持します- >ブローカー->トピック->キューの関係
brokerLiveTable 使用读写锁的方式操作

ルートの削除

  1. ネームサーバーは10秒ごとにbrokerLiveTableをスキャンします。ハートビートパケットが120秒間受信されない場合、ネームサーバーはブローカーのルーティング情報を削除し、ソケット接続を閉じます。
  2. ブローカーは正常にオフラインになり、unregisterBroker命令を実行します

ルート発見

RocketMQルーティング検出は非リアルタイムです。トピックルーティングが変更されると、ネームサーバーはクライアントにアクティブにプッシュしませんが、クライアントは定期的にトピックの最新ルートをプルします。

おすすめ

転載: blog.csdn.net/lewee0215/article/details/111936932