RocketMQ -------核心NameServer

RocketMQ-NameServer:
    
    一、作用
            作为整个MQ的核心,主要负责服务发现,提供Broker节点的增删改查,提供给生产者和消费者;
            多台NameServer之间不会互相通信,所以有可能在某一时刻,数据并不完全相同,但是不影响消息的发送;    
    二、启动
            主要是两个配置
                NameServerConfig(有用参数):
                        rocketmqhome:rocketmq主目录,可以通过-Drocketmq.home.dir=path或通过设置环境变量ROCKETMQ_HOME来配置RocketMQ 的主目录。
                        kvConfigPath: NameServer存储KV配置属性的持久化路径。
                        configStorePath:nameServer默认配置文件路径,不生效。nameServer启动时如果要通过配置文件配置NameServer 启动属性的话,请使用-c选项。
                        orderMessageEnable:是否支持顺序消息,默认是不支持。
                NettyServerConfig(有用参数):
                        listenPort: NameServer监昕端口
                        serverWorkerThreads: Netty业务线程池线程个数。
                        serverCallbackExecutorThreads : Netty的public任务线程池线程个数,Netty网络设计,根据业务类型会创建不同的线程池,比如处理消息发送、消息消费、心跳检测等。如果该业务类型(RequestCode)未注册线程池,则由public 线程池执行。
                        serverSelectorThreads: IO 线程池线程个数,主要是NameServer、Broker端解析请求、返回相应的线程个数,这类线程主要是处理网络请求的,解析请求包,然后转发到各个业务线程池完成具体的业务操作,然后将结果再返回调用方。
                        serverOnewaySemaphoreValue:send oneway消息请求井发度(Broker端参数)。
                        serverAsyncSemaphoreValue:异步消息发送最大并发度(Broker端参数)。
                        serverChannelMaxldleTimeSeconds:网络连接最大空闲时间,默认120s 。如果连接
                        空闲时间超过该参数设置的值,连接将被关闭。
                        serverSocketSndBufSize:网络socket发送缓存区大小,默认64k 。
                        serverSocketRcvBufSize:网络socket接收缓存区大小,默认64k 。
                        serverPooledByteBufAllocatorEnable: ByteBuffer是否开启缓存,建议开启。
                        useEpollNativeSelector:是否启用EpollIO模型,Linux环境建议开启。
            在启动的时候会创建NettyServer网络处理对象,开启检测停用Broker的定时任务和打印KV配置的任务,然后向JVM注册一个钩子函数用来优雅关闭线程池,停机;
    三、路由管理
            路由存储    
                RoutelnfoManager保存路由信息:
                    1.Topic消息队列路由信息,消息发送时根据路由表进行负载均衡。
                    2.Broker 基础信息,包含brokerName、所属集群名称、主备Broker地址。
                    3.Broker 集群信息,存储集群中所有Broker 名称。    
                    4.Broker 状态信息。NameServer 每次收到心跳包时会替换该信息。
                    5.Broker 上的FilterServer 列表,用于类模式消息过滤
                PS:一个Topic有多个消息队列,一个Broker为每一主题默认创建4个读队列和4个写队列;多个Name相同的Broker组成集群,BrokerID为0代表Master,BrokerID为1代表Salve;
            路由注册
                路由注册是通过Broker与NameServer的心跳功能实现的,Broker启动的时候会向所有的NameServer发送心跳语句并每隔30S发一次心跳;
                NameSever每10秒去管理一次存储活跃Broker的,如果连续120S没有收到心跳,则移除该Broker
                网络传输基于Netty,每个请求都有专门的RequestCode;
                Broker中Topic默认存储在${RocketHome}/store/confg/topic.json中。
                PS:NameServer与Broker保持长连接,Broker的状态存储在brokerLiveTable中,每收到一个心跳包,就更新table中关于Broker的状态信息以及路由表(topicQueueTable、brokerAddrTable、brokerLiveTable、filterServerTable),在更新的时候使用了所力度较少的读写锁,允许多个消息发送者并发读,保证了说个消息发送者并发读,保证了消息发送时的高并发,但是处理心跳包的时候是串行执行的
            路由删除
                NameServer定时扫描brokerliveTable检测上次心跳包与当前系统时间的时间差,如果大于120S,则移除Broker信息
                Broker正常关闭的时候,执行UnregisterBroker指令;
            路由发现
                RoketMQ路由发现是非实时的,党Topic路由出现变化之后,NameServer不主动推送给客户端,而是有客户端定时根据主题名称拉取主题最新的路由;
                调用RouterlnfoManager的方法,从路由表topicQueueTable、brokerAddrTable、filterServerTable中分别填充TopicRouteData中的List                 如果找到主题对应的路由信息并且该主题为顺序消息,则从NameServerKVconfig中获取关于顺序消息相关的配置填充路由信息。
                如果找不到路由信息CODE,则使用TOPIC NOT_EXISTS ,表示没有找到对应的路由

    四、消息发送
            发送方式:
                同步(sync):发送消息执行API时,同步等待直到消息服务器返回发送结果;
                异步(async):发送消息执行API时,指定回调函数,立即返回,当前线程不阻塞,直到运行结束,消息发送成功的回调任务在一个新的线程中执行;
                单向(oneway):发送消息执行API时,直接返回,不在乎消息是否成功存储到消息服务器上
            消息体:
                1.消息主题:topic
                2.消息Flag(RocketMQ不做处理)
                3.扩展属性存储在Message的properties中:
                    tag:消息TAG,用于消息过滤。
                    keys:Message索引键,多个用空格隔开,RocketMQ 可以根据这些key快速检索到消息。
                    waitStoreMsgOK:消息发送时是否等消息存储完成后再返回。
                    delayTimeLevel:消息延迟级别,用于定时消息或消息重试。
                4.消息体:byte数组
    五、生产者:
            DefaultMQProducer是默认的消息生产者实现类,它实现MQAdmin的接口;
                核心属性:
                    producerGroup:生产者所属组,消息服务器在回查事务状态时会随机选择该组中任何一个生产者发起事务回查请求。
                    createTopicKey:默认topicKey。
                    defaultTopicQu巳ueNums:默认主题在每一个Broker队列数量。
                    sendMsgTimeout:发送消息默认超时时间,默认3s。
                    compressMsgBodyOverHowmuch:消息体超过该值则启用压缩,默认4K。
                    retryTimesWhenSendFailed:同步方式发送消息重试次数,默认为2,总共执行3次。
                    retryTimesWhens巳ndAsyncFailed:异步方式发送消息重试次数,默认为2。
                    retryAnotherBrokerWhenNotStoreOK:消息重试时选择另外一个Broker时是否不等待存储结果就返回,默认为false。
                    maxMessageSize:允许发送的最大消息长度,默认为4M,眩值最大值为2"32-1。
    六、消息发送流程:
            1.验证消息
            2.查找主题路由信息
                TopicPublishinfo:
                    orderTopic:是否是顺序消息。
                    ListmessageQueueList:该主题队列的消息队列。
                    sendWhichQueue:每选择一次消息队列,该值会自增l,如果Integer.MAX_VALUE,则重置为0,用于选择消息队列。
                    ListqueueData:topic队列元数据。
                    ListbrokerDatas:topic分布的broker元数据。
                    HashMap/*filterServer*/>:broker上过滤服务器
                    地址列表。 

待续........   

你可能感兴趣的:(使用技术)