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 使用读写锁的方式操作
ルートの削除
- ネームサーバーは10秒ごとにbrokerLiveTableをスキャンします。ハートビートパケットが120秒間受信されない場合、ネームサーバーはブローカーのルーティング情報を削除し、ソケット接続を閉じます。
- ブローカーは正常にオフラインになり、unregisterBroker命令を実行します
ルート発見
RocketMQルーティング検出は非リアルタイムです。トピックルーティングが変更されると、ネームサーバーはクライアントにアクティブにプッシュしませんが、クライアントは定期的にトピックの最新ルートをプルします。