±¾ÎÄÊÇϵÁÐÎÄÕµĵÚÈýƪ£¬µÚһƪ
"KafkaÉè¼Æ½âÎö£¨Ò»£©- Kafka±³¾°¼°¼Ü¹¹½éÉÜ"¡£µÚ¶þƪ
KafkaÉè¼Æ½âÎö£¨¶þ£©- Kafka High Availability £¨ÉÏ£©
±¾ÎÄÔÚÉÏÆªÎÄÕ»ù´¡ÉÏ£¬¸ü¼ÓÉîÈë½²½âÁËKafkaµÄHA»úÖÆ£¬Ö÷Òª²ûÊöÁËHAÏà¹Ø¸÷ÖÖ³¡¾°£¬ÈçBroker
failover£¬Controller failover£¬Topic´´½¨/ɾ³ý£¬BrokerÆô¶¯£¬Follower´ÓLeader
fetchÊý¾ÝµÈÏêϸ´¦Àí¹ý³Ì¡£
Controller¶ÔBroker FailureµÄ´¦Àí¹ý³Ì
ControllerÔÚZookeeperµÄ/brokers/ids½ÚµãÉÏ×¢²áWatch¡£Ò»µ©ÓÐBrokerå´»ú£¨±¾ÎÄÓÃå´»ú´ú±íÈκÎÈÃKafkaÈÏΪÆäBroker
dieµÄÇé¾°£¬°üÀ¨µ«²»ÏÞÓÚ»úÆ÷¶Ïµç£¬ÍøÂç²»¿ÉÓã¬GCµ¼ÖµÄStop The World£¬½ø³ÌcrashµÈ£©£¬ÆäÔÚZookeeper¶ÔÓ¦µÄZnode»á×Ô¶¯±»É¾³ý£¬Zookeeper»áfire
Controller×¢²áµÄWatch£¬Controller¼´¿É»ñÈ¡×îеÄÐÒ´æµÄBrokerÁÐ±í¡£ Controller¾ö¶¨set_p£¬¸Ã¼¯ºÏ°üº¬ÁËå´»úµÄËùÓÐBrokerÉϵÄËùÓÐPartition¡£ ¶Ôset_pÖеÄÿһ¸öPartition£º ´Ó/brokers/topics/[topic]/partitions/[partition]/state¶ÁÈ¡¸ÃPartitionµ±Ç°µÄISR¡£ ¾ö¶¨¸ÃPartitionµÄÐÂLeader¡£Èç¹ûµ±Ç°ISRÖÐÓÐÖÁÉÙÒ»¸öReplica»¹ÐҴ棬ÔòÑ¡ÔñÆäÖÐÒ»¸ö×÷ΪÐÂLeader£¬ÐµÄISRÔò°üº¬µ±Ç°ISRÖÐËùÓÐÐÒ´æµÄReplica¡£·ñÔòÑ¡Ôñ¸ÃPartitionÖÐÈÎÒâÒ»¸öÐÒ´æµÄReplica×÷ΪеÄLeaderÒÔ¼°ISR£¨¸Ã³¡¾°Ï¿ÉÄÜ»áÓÐDZÔÚµÄÊý¾Ý¶ªÊ§£©¡£Èç¹û¸ÃPartitionµÄËùÓÐReplica¶¼å´»úÁË£¬Ôò½«ÐµÄLeaderÉèÖÃΪ-1¡£ ½«ÐµÄLeader£¬ISRºÍеÄleader_epoch¼°controller_epochдÈë/brokers/topics/[topic]/partitions/[partition]/state¡£×¢Ò⣬¸Ã²Ù×÷Ö»ÓÐController°æ±¾ÔÚ3.1ÖÁ3.3µÄ¹ý³ÌÖÐÎޱ仯ʱ²Å»áÖ´ÐУ¬·ñÔòÌø×ªµ½3.1¡£ Ö±½Óͨ¹ýRPCÏòset_pÏà¹ØµÄBroker·¢ËÍLeaderAndISRRequestÃüÁî¡£Controller¿ÉÒÔÔÚÒ»¸öRPC²Ù×÷Öз¢ËͶà¸öÃüÁî´Ó¶øÌá¸ßЧÂÊ¡£ Broker failover˳ÐòͼÈçÏÂËùʾ¡£

LeaderAndIsrRequest½á¹¹ÈçÏÂ

LeaderAndIsrResponse½á¹¹ÈçÏÂ

´´½¨/ɾ³ýTopic
ControllerÔÚZookeeperµÄ/brokers/topics½ÚµãÉÏ×¢²áWatch£¬Ò»µ©Ä³¸öTopic±»´´½¨»òɾ³ý£¬ÔòController»áͨ¹ýWatchµÃµ½Ð´´½¨/ɾ³ýµÄTopicµÄPartition/Replica·ÖÅä¡£ ¶ÔÓÚɾ³ýTopic²Ù×÷£¬Topic¹¤¾ß»á½«¸ÃTopicÃû×Ö´æÓÚ/admin/delete_topics¡£Èôdelete.topic.enableΪtrue£¬ÔòController×¢²áÔÚ/admin/delete_topicsÉϵÄWatch±»fire£¬Controllerͨ¹ý»Øµ÷Ïò¶ÔÓ¦µÄBroker·¢ËÍStopReplicaRequest£»ÈôΪfalseÔòController²»»áÔÚ/admin/delete_topicsÉÏ×¢²áWatch£¬Ò²¾Í²»»á¶Ô¸Ãʼþ×÷³ö·´Ó¦£¬´ËʱTopic²Ù×÷Ö»±»¼Ç¼¶ø²»»á±»Ö´ÐС£ ¶ÔÓÚ´´½¨Topic²Ù×÷£¬Controller´Ó/brokers/ids¶ÁÈ¡µ±Ç°ËùÓпÉÓõÄBrokerÁÐ±í£¬¶ÔÓÚset_pÖеÄÿһ¸öPartition£º ´Ó·ÖÅ䏸¸ÃPartitionµÄËùÓÐReplica£¨³ÆÎªAR£©ÖÐÈÎѡһ¸ö¿ÉÓõÄBroker×÷ΪеÄLeader£¬²¢½«ARÉèÖÃΪеÄISR£¨ÒòΪ¸ÃTopicÊÇд´½¨µÄ£¬ËùÒÔARÖÐËùÓеÄReplica¶¼Ã»ÓÐÊý¾Ý£¬¿ÉÈÏΪËüÃǶ¼ÊÇͬ²½µÄ£¬Ò²¼´¶¼ÔÚISRÖУ¬ÈÎÒâÒ»¸öReplica¶¼¿É×÷ΪLeader£© ½«ÐµÄLeaderºÍISRдÈë/brokers/topics/[topic]/partitions/[partition] Ö±½Óͨ¹ýRPCÏòÏà¹ØµÄBroker·¢ËÍLeaderAndISRRequest¡£ ´´½¨Topic˳ÐòͼÈçÏÂËùʾ¡£

BrokerÏìÓ¦ÇëÇóÁ÷³Ì
Brokerͨ¹ýkafka.network.SocketServer¼°Ïà¹ØÄ£¿é½ÓÊܸ÷ÖÖÇëÇó²¢×÷³öÏìÓ¦¡£Õû¸öÍøÂçͨÐÅÄ£¿é»ùÓÚJava
NIO¿ª·¢£¬²¢²ÉÓÃReactorģʽ£¬ÆäÖаüº¬1¸öAcceptor¸ºÔð½ÓÊܿͻ§ÇëÇó£¬N¸öProcessor¸ºÔð¶ÁдÊý¾Ý£¬M¸öHandler´¦ÀíÒµÎñÂß¼¡£ AcceptorµÄÖ÷ÒªÖ°ÔðÊǼàÌý²¢½ÓÊܿͻ§¶Ë£¨ÇëÇó·¢Æð·½£¬°üÀ¨µ«²»ÏÞÓÚProducer£¬Consumer£¬Controller£¬Admin
Tool£©µÄÁ¬½ÓÇëÇ󣬲¢½¨Á¢ºÍ¿Í»§¶ËµÄÊý¾Ý´«ÊäͨµÀ£¬È»ºóΪ¸Ã¿Í»§¶ËÖ¸¶¨Ò»¸öProcessor£¬ÖÁ´ËËü¶Ô¸Ã¿Í»§¶Ë¸Ã´ÎÇëÇóµÄÈÎÎñ¾Í½áÊøÁË£¬Ëü¿ÉÒÔÈ¥ÏìÓ¦ÏÂÒ»¸ö¿Í»§¶ËµÄÁ¬½ÓÇëÇóÁË¡£ÆäºËÐÄ´úÂëÈçÏ¡£

ProcessorÖ÷Òª¸ºÔð´Ó¿Í»§¶Ë¶ÁÈ¡Êý¾Ý²¢½«ÏìÓ¦·µ»Ø¸ø¿Í»§¶Ë£¬Ëü±¾Éí²¢²»´¦Àí¾ßÌåµÄÒµÎñÂß¼£¬²¢ÇÒÆäÄÚ²¿Î¬»¤ÁËÒ»¸ö¶ÓÁÐÀ´±£´æ·ÖÅ䏸ËüµÄËùÓÐSocketChannel¡£ProcessorµÄrun·½·¨»áÑ»·´Ó¶ÓÁÐÖÐÈ¡³öеÄSocketChannel²¢½«ÆäSelectionKey.OP_READ×¢²áµ½selectorÉÏ£¬È»ºóÑ»·´¦ÀíÒѾÍÐ÷µÄ¶Á£¨ÇëÇ󣩺Íд£¨ÏìÓ¦£©¡£Processor¶ÁÈ¡ÍêÊý¾Ýºó£¬½«Æä·â×°³ÉRequest¶ÔÏó²¢½«Æä½»¸øRequestChannel¡£ RequestChannelÊÇProcessorºÍKafkaRequestHandler½»»»Êý¾ÝµÄµØ·½£¬Ëü°üº¬Ò»¸ö¶ÓÁÐrequestQueueÓÃÀ´´æ·ÅProcessor¼ÓÈëµÄRequest£¬KafkaRequestHandler»á´ÓÀïÃæÈ¡³öRequestÀ´´¦Àí£»Í¬Ê±Ëü»¹°üº¬Ò»¸örespondQueue£¬ÓÃÀ´´æ·ÅKafkaRequestHandler´¦ÀíÍêRequestºó·µ»¹¸ø¿Í»§¶ËµÄResponse¡£ Processor»áͨ¹ýprocessNewResponses·½·¨ÒÀ´Î½«requestChannelÖÐresponseQueue±£´æµÄResponseÈ¡³ö£¬²¢½«¶ÔÓ¦µÄSelectionKey.OP_WRITEʼþ×¢²áµ½selectorÉÏ¡£µ±selectorµÄselect·½·¨·µ»ØÊ±£¬¶Ô¼ì²âµ½µÄ¿ÉдͨµÀ£¬µ÷ÓÃwrite·½·¨½«Response·µ»Ø¸ø¿Í»§¶Ë¡£ KafkaRequestHandlerÑ»·´ÓRequestChannelÖÐÈ¡Request²¢½»¸økafka.server.KafkaApis´¦Àí¾ßÌåµÄÒµÎñÂß¼¡£
LeaderAndIsrRequestÏìÓ¦¹ý³Ì
¶ÔÓÚÊÕµ½µÄLeaderAndIsrRequest£¬BrokerÖ÷Ҫͨ¹ýReplicaManagerµÄbecomeLeaderOrFollower´¦Àí£¬Á÷³ÌÈçÏ£º ÈôÇëÇóÖÐcontrollerEpochСÓÚµ±Ç°×îеÄcontrollerEpoch£¬ÔòÖ±½Ó·µ»ØErrorMapping.StaleControllerEpochCode¡£ ¶ÔÓÚÇëÇóÖÐpartitionStateInfosÖеÄÿһ¸öÔªËØ£¬¼´((topic, partitionId),
partitionStateInfo)£º ÈôpartitionStateInfoÖеÄleader epoch´óÓÚµ±Ç°ReplicManagerÖд洢µÄ(topic,
partitionId)¶ÔÓ¦µÄpartitionµÄleader epoch£¬Ôò£º Èôµ±Ç°brokerid£¨»òÕß˵replica id£©ÔÚpartitionStateInfoÖУ¬Ôò½«¸Ãpartition¼°partitionStateInfo´æÈëÒ»¸öÃûΪpartitionStateµÄHashMapÖÐ ·ñÔò˵Ã÷¸ÃBroker²»ÔÚ¸ÃPartition·ÖÅäµÄReplica listÖУ¬½«¸ÃÐÅÏ¢¼Ç¼ÓÚlogÖÐ ·ñÔò½«ÏàÓ¦µÄError code£¨ErrorMapping.StaleLeaderEpochCode£©´æÈëResponseÖРɸѡ³öpartitionStateÖÐLeaderÓ뵱ǰBroker IDÏàµÈµÄËùÓмǼ´æÈëpartitionsTobeLeaderÖУ¬ÆäËü¼Ç¼´æÈëpartitionsToBeFollowerÖС£ ÈôpartitionsTobeLeader²»Îª¿Õ£¬Ôò¶ÔÆäÖ´ÐÐmakeLeaders·½¡£ ÈôpartitionsToBeFollower²»Îª¿Õ£¬Ôò¶ÔÆäÖ´ÐÐmakeFollowers·½·¨¡£ ÈôhighwatermakÏ̻߳¹Î´Æô¶¯£¬Ôò½«ÆäÆô¶¯£¬²¢½«hwThreadInitializedÉèΪtrue¡£ ¹Ø±ÕËùÓÐIdle״̬µÄFetcher¡£ LeaderAndIsrRequest´¦Àí¹ý³ÌÈçÏÂͼËùʾ

BrokerÆô¶¯¹ý³Ì
BrokerÆô¶¯ºóÊ×Ïȸù¾ÝÆäIDÔÚZookeeperµÄ/brokers/idszondeÏ´´½¨ÁÙʱ×ӽڵ㣨Ephemeral
node£©£¬´´½¨³É¹¦ºóControllerµÄReplicaStateMachine×¢²áÆäÉϵÄBroker
Change Watch»á±»fire£¬´Ó¶øÍ¨¹ý»Øµ÷KafkaController.onBrokerStartup·½·¨Íê³ÉÒÔϲ½Ö裺 1. ÏòËùÓÐÐÂÆô¶¯µÄBroker·¢ËÍUpdateMetadataRequest£¬Æä¶¨ÒåÈçÏÂ

2. ½«ÐÂÆô¶¯µÄBrokerÉϵÄËùÓÐReplicaÉèÖÃΪOnlineReplica״̬£¬Í¬Ê±ÕâЩBroker»áΪÕâЩPartitionÆô¶¯high
watermarkÏ̡߳£ 3. ͨ¹ýpartitionStateMachine´¥·¢OnlinePartitionStateChange¡£
Controller Failover
ControllerÒ²ÐèÒªFailover¡£Ã¿¸öBroker¶¼»áÔÚController Path
(/controller)ÉÏ×¢²áÒ»¸öWatch¡£µ±Ç°Controllerʧ°Üʱ£¬¶ÔÓ¦µÄController
Path»á×Ô¶¯Ïûʧ£¨ÒòΪËüÊÇEphemeral Node£©£¬´Ëʱ¸ÃWatch±»fire£¬ËùÓС°»î¡±×ŵÄBroker¶¼»áÈ¥¾ºÑ¡³ÉΪеÄController£¨´´½¨ÐµÄController
Path£©£¬µ«ÊÇÖ»»áÓÐÒ»¸ö¾ºÑ¡³É¹¦£¨ÕâµãÓÉZookeeper±£Ö¤£©¡£¾ºÑ¡³É¹¦Õß¼´ÎªÐµÄLeader£¬¾ºÑ¡Ê§°ÜÕßÔòÖØÐÂÔÚеÄController
PathÉÏ×¢²áWatch¡£ÒòΪZookeeperµÄWatchÊÇÒ»´ÎÐԵ쬱»fireÒ»´ÎÖ®ºó¼´Ê§Ð§£¬ËùÒÔÐèÒªÖØÐÂ×¢²á¡£ Broker³É¹¦¾ºÑ¡ÎªÐÂControllerºó»á´¥·¢KafkaController.onControllerFailover·½·¨£¬²¢Ôڸ÷½·¨ÖÐÍê³ÉÈçϲÙ×÷£º ¶ÁÈ¡²¢Ôö¼ÓController Epoch¡£ ÔÚReassignedPartitions Patch (/admin/reassign_partitions)ÉÏ×¢²áWatch¡£ ÔÚPreferredReplicaElection Path (/admin/preferred_replica_election)ÉÏ×¢²áWatch¡£ ͨ¹ýpartitionStateMachineÔÚBroker Topics Patch (/brokers/topics)ÉÏ×¢²áWatch¡£ Èôdelete.topic.enableÉèÖÃΪtrue£¨Ä¬ÈÏÖµÊÇfalse£©£¬ÔòpartitionStateMachineÔÚDelete
Topic Patch (/admin/delete_topics)ÉÏ×¢²áWatch¡£ ͨ¹ýreplicaStateMachineÔÚBroker Ids Patch (/brokers/ids)ÉÏ×¢²áWatch¡£ ³õʼ»¯ControllerContext¶ÔÏó£¬ÉèÖõ±Ç°ËùÓÐTopic£¬¡°»î¡±×ŵÄBrokerÁÐ±í£¬ËùÓÐPartitionµÄLeader¼°ISRµÈ¡£ Æô¶¯replicaStateMachineºÍpartitionStateMachine¡£ ½«brokerState״̬ÉèÖÃΪRunningAsController¡£ ½«Ã¿¸öPartitionµÄLeadershipÐÅÏ¢·¢Ë͸øËùÓС°»î¡±×ŵÄBroker¡£ Èôauto.leader.rebalance.enableÅäÖÃΪtrue£¨Ä¬ÈÏÖµÊÇtrue£©£¬ÔòÆô¶¯partition-rebalanceÏ̡߳£ Èôdelete.topic.enableÉèÖÃΪtrueÇÒDelete Topic Patch(/admin/delete_topics)ÖÐÓÐÖµ£¬Ôòɾ³ýÏàÓ¦µÄTopic¡£
PartitionÖØÐ·ÖÅä
¹ÜÀí¹¤¾ß·¢³öÖØÐ·ÖÅäPartitionÇëÇóºó£¬»á½«ÏàÓ¦ÐÅϢдµ½/admin/reassign_partitionsÉÏ£¬¶ø¸Ã²Ù×÷»á´¥·¢ReassignedPartitionsIsrChangeListener£¬´Ó¶øÍ¨¹ýÖ´Ðлص÷º¯ÊýKafkaController.onPartitionReassignmentÀ´Íê³ÉÒÔϲÙ×÷£º ½«ZookeeperÖеÄAR£¨Current Assigned Replicas£©¸üÐÂΪOAR£¨Original
list of replicas for partition£© + RAR£¨Reassigned replicas£©¡£ Ç¿ÖÆ¸üÐÂZookeeperÖеÄleader epoch£¬ÏòARÖеÄÿ¸öReplica·¢ËÍLeaderAndIsrRequest¡£ ½«RAR - OARÖеÄReplicaÉèÖÃΪNewReplica״̬¡£ µÈ´ýÖ±µ½RARÖÐËùÓеÄReplica¶¼ÓëÆäLeaderͬ²½¡£ ½«RARÖÐËùÓеÄReplica¶¼ÉèÖÃΪOnlineReplica״̬¡£ ½«CacheÖеÄARÉèÖÃΪRAR¡£ ÈôLeader²»ÔÚRARÖУ¬Ôò´ÓRARÖÐÖØÐÂÑ¡¾Ù³öÒ»¸öеÄLeader²¢·¢ËÍLeaderAndIsrRequest¡£ÈôеÄLeader²»ÊÇ´ÓRARÖÐÑ¡¾Ù¶ø³ö£¬Ôò»¹ÒªÔö¼ÓZookeeperÖеÄleader
epoch¡£ ½«OAR - RARÖеÄËùÓÐReplicaÉèÖÃΪOfflineReplica״̬£¬¸Ã¹ý³Ì°üº¬Á½²¿·Ö¡£µÚÒ»£¬½«ZookeeperÉÏISRÖеÄOAR
- RARÒÆ³ý²¢ÏòLeader·¢ËÍLeaderAndIsrRequest´Ó¶øÍ¨ÖªÕâЩReplicaÒѾ´ÓISRÖÐÒÆ³ý£»µÚ¶þ£¬ÏòOAR
- RARÖеÄReplica·¢ËÍStopReplicaRequest´Ó¶øÍ£Ö¹²»ÔÙ·ÖÅ䏸¸ÃPartitionµÄReplica¡£ ½«OAR - RARÖеÄËùÓÐReplicaÉèÖÃΪNonExistentReplica״̬´Ó¶ø½«Æä´Ó´ÅÅÌÉÏɾ³ý¡£ ½«ZookeeperÖеÄARÉèÖÃΪRAR¡£ ɾ³ý/admin/reassign_partition¡£ ×¢Ò⣺×îºóÒ»²½²Å½«ZookeeperÖеÄAR¸üУ¬ÒòΪÕâÊÇΨһһ¸ö³Ö¾Ã´æ´¢ARµÄµØ·½£¬Èç¹ûControllerÔÚÕâÒ»²½Ö®Ç°crash£¬ÐµÄControllerÈÔÈ»Äܹ»¼ÌÐøÍê³É¸Ã¹ý³Ì¡£
ÒÔÏÂÊÇPartitionÖØÐ·ÖÅäµÄ°¸Àý£¬OAR = {1£¬2£¬3}£¬RAR = {4£¬5£¬6}£¬PartitionÖØÐ·ÖÅä¹ý³ÌÖÐZookeeperÖеÄARºÍLeader/ISR·¾¶ÈçÏÂ

Follower´ÓLeader FetchÊý¾Ý
Followerͨ¹ýÏòLeader·¢ËÍFetchRequest»ñÈ¡ÏûÏ¢£¬FetchRequest½á¹¹ÈçÏÂ

´ÓFetchRequestµÄ½á¹¹¿ÉÒÔ¿´³ö£¬Ã¿¸öFetchÇëÇó¶¼ÒªÖ¸¶¨×î´óµÈ´ýʱ¼äºÍ×îС»ñÈ¡×Ö½ÚÊý£¬ÒÔ¼°ÓÉTopicAndPartitionºÍPartitionFetchInfo¹¹³ÉµÄMap¡£Êµ¼ÊÉÏ£¬Follower´ÓLeaderÊý¾ÝºÍConsumer´ÓBroker
FetchÊý¾Ý£¬¶¼ÊÇͨ¹ýFetchRequestÇëÇóÍê³É£¬ËùÒÔÔÚFetchRequest½á¹¹ÖУ¬ÆäÖÐÒ»¸ö×Ö¶ÎÊÇclientID£¬²¢ÇÒÆäĬÈÏÖµÊÇConsumerConfig.DefaultClientId¡£ LeaderÊÕµ½FetchÇëÇóºó£¬Kafkaͨ¹ýKafkaApis.handleFetchRequestÏìÓ¦¸ÃÇëÇó£¬ÏìÓ¦¹ý³ÌÈçÏ£º replicaManager¸ù¾ÝÇëÇó¶Á³öÊý¾Ý´æÈëdataReadÖС£ Èç¹û¸ÃÇëÇóÀ´×ÔFollowerÔò¸üÐÂÆäÏàÓ¦µÄLEO£¨log end offset£©ÒÔ¼°ÏàÓ¦PartitionµÄHigh
Watermark ¸ù¾ÝdataReadËã³ö¿É¶ÁÏûÏ¢³¤¶È£¨µ¥Î»Îª×Ö½Ú£©²¢´æÈëbytesReadableÖС£ Âú×ãÏÂÃæ4¸öÌõ¼þÖеÄ1¸ö£¬ÔòÁ¢¼´½«ÏàÓ¦µÄÊý¾Ý·µ»Ø FetchÇëÇó²»Ï£ÍûµÈ´ý£¬¼´fetchRequest.macWait <= 0 FetchÇëÇó²»ÒªÇóÒ»¶¨ÄÜÈ¡µ½ÏûÏ¢£¬¼´fetchRequest.numPartitions <=
0£¬Ò²¼´requestInfoΪ¿Õ ÓÐ×ã¹»µÄÊý¾Ý¿É¹©·µ»Ø£¬¼´bytesReadable >= fetchRequest.minBytes ¶ÁÈ¡Êý¾Ýʱ·¢ÉúÒì³£ Èô²»Âú×ãÒÔÉÏ4¸öÌõ¼þ£¬FetchRequest½«²»»áÁ¢¼´·µ»Ø£¬²¢½«¸ÃÇëÇó·â×°³ÉDelayedFetch¡£¼ì²é¸ÃDeplayedFetchÊÇ·ñÂú×㣬ÈôÂú×ãÔò·µ»ØÇëÇ󣬷ñÔò½«¸ÃÇëÇó¼ÓÈëWatchÁбí
Leaderͨ¹ýÒÔFetchResponseµÄÐÎʽ½«ÏûÏ¢·µ»Ø¸øFollower£¬FetchResponse½á¹¹ÈçÏÂ

|