KafkaµÄ»ù±¾½éÉÜ
KafkaÊÇ×î³õÓÉLinkedin¹«Ë¾¿ª·¢£¬ÊÇÒ»¸ö·Ö²¼Ê½¡¢·ÖÇøµÄ¡¢¶à¸±±¾µÄ¡¢¶à¶©ÔÄÕߣ¬»ùÓÚzookeeperе÷µÄ·Ö²¼Ê½ÈÕ־ϵͳ£¨Ò²¿ÉÒÔµ±×öMQϵͳ£©£¬³£¼û¿ÉÒÔÓÃÓÚweb/nginxÈÕÖ¾¡¢·ÃÎÊÈÕÖ¾£¬ÏûÏ¢·þÎñµÈµÈ£¬LinkedinÓÚ2010Äê¹±Ï׸øÁËApache»ù½ð»á²¢³ÉΪ¶¥¼¶¿ªÔ´ÏîÄ¿¡£
Ö÷ÒªÓ¦Óó¡¾°ÊÇ£ºÈÕÖ¾ÊÕ¼¯ÏµÍ³ºÍÏûϢϵͳ¡£
KafkaÖ÷ÒªÉè¼ÆÄ¿±êÈçÏ£º
1.ÒÔʱ¼ä¸´ÔÓ¶ÈΪO(1)µÄ·½Ê½ÌṩÏûÏ¢³Ö¾Ã»¯ÄÜÁ¦£¬¼´Ê¹¶ÔTB¼¶ÒÔÉÏÊý¾ÝÒ²Äܱ£Ö¤³£Êýʱ¼äµÄ·ÃÎÊÐÔÄÜ¡£
2.¸ßÍÌÍÂÂÊ¡£¼´Ê¹Ôڷdz£Á®¼ÛµÄÉÌÓûúÆ÷ÉÏÒ²ÄÜ×öµ½µ¥»úÖ§³ÖÿÃë100KÌõÏûÏ¢µÄ´«Êä¡£
3.Ö§³ÖKafka Server¼äµÄÏûÏ¢·ÖÇø£¬¼°·Ö²¼Ê½Ïû·Ñ£¬Í¬Ê±±£Ö¤Ã¿¸öpartitionÄÚµÄÏûϢ˳Ðò´«Êä¡£
4.ͬʱ֧³ÖÀëÏßÊý¾Ý´¦ÀíºÍʵʱÊý¾Ý´¦Àí¡£
KafkaµÄÉè¼ÆÔÀí·ÖÎö

Ò»¸öµäÐ͵Äkafka¼¯ÈºÖаüº¬Èô¸Éproducer£¬Èô¸Ébroker£¬Èô¸Éconsumer£¬ÒÔ¼°Ò»¸öZookeeper¼¯Èº¡£Kafkaͨ¹ýZookeeper¹ÜÀí¼¯ÈºÅäÖã¬Ñ¡¾Ùleader£¬ÒÔ¼°ÔÚconsumer
group·¢Éú±ä»¯Ê±½øÐÐrebalance¡£producerʹÓÃpushģʽ½«ÏûÏ¢·¢²¼µ½broker£¬consumerʹÓÃpullģʽ´Óbroker¶©ÔIJ¢Ïû·ÑÏûÏ¢¡£
¡¡
KafkaרÓÃÊõÓ
1.Broker£ºÏûÏ¢Öмä¼þ´¦Àí½áµã£¬Ò»¸öKafka½Úµã¾ÍÊÇÒ»¸öbroker£¬¶à¸öbroker¿ÉÒÔ×é³ÉÒ»¸öKafka¼¯Èº¡£
2.Topic£ºÒ»ÀàÏûÏ¢£¬Kafka¼¯ÈºÄܹ»Í¬Ê±¸ºÔð¶à¸ötopicµÄ·Ö·¢¡£
3.Partition£ºtopicÎïÀíÉϵķÖ×飬һ¸ötopic¿ÉÒÔ·ÖΪ¶à¸öpartition£¬Ã¿¸öpartitionÊÇÒ»¸öÓÐÐòµÄ¶ÓÁС£
4.Segment£ºpartitionÎïÀíÉÏÓɶà¸ösegment×é³É¡£
5.offset£ºÃ¿¸öpartition¶¼ÓÉһϵÁÐÓÐÐòµÄ¡¢²»¿É±äµÄÏûÏ¢×é³É£¬ÕâЩÏûÏ¢±»Á¬ÐøµÄ×·¼Óµ½partitionÖС£partitionÖеÄÿ¸öÏûÏ¢¶¼ÓÐÒ»¸öÁ¬ÐøµÄÐòÁкŽÐ×öoffset£¬ÓÃÓÚpartitionΨһ±êʶһÌõÏûÏ¢¡£
6.Producer£º¸ºÔð·¢²¼ÏûÏ¢µ½Kafka broker¡£
7.Consumer£ºÏûÏ¢Ïû·ÑÕߣ¬ÏòKafka broker¶ÁÈ¡ÏûÏ¢µÄ¿Í»§¶Ë¡£
8.Consumer Group£ºÃ¿¸öConsumerÊôÓÚÒ»¸öÌØ¶¨µÄConsumer
Group¡£
KafkaÊý¾Ý´«ÊäµÄÊÂÎñÌØµã
at most once£º×î¶àÒ»´Î£¬Õâ¸öºÍJMSÖÐ"·Ç³Ö¾Ã»¯"ÏûÏ¢ÀàËÆ£¬·¢ËÍÒ»´Î£¬ÎÞÂ۳ɰܣ¬½«²»»áÖØ·¢¡£Ïû·ÑÕßfetchÏûÏ¢£¬È»ºó±£´æoffset£¬È»ºó´¦ÀíÏûÏ¢£»µ±client±£´æoffsetÖ®ºó£¬µ«ÊÇÔÚÏûÏ¢´¦Àí¹ý³ÌÖгöÏÖÁËÒì³££¬µ¼Ö²¿·ÖÏûϢδÄܼÌÐø´¦Àí¡£ÄÇô´Ëºó"δ´¦Àí"µÄÏûÏ¢½«²»Äܱ»fetchµ½£¬Õâ¾ÍÊÇ"at
most once"¡£
at least once£ºÏûÏ¢ÖÁÉÙ·¢ËÍÒ»´Î£¬Èç¹ûÏûϢδÄܽÓÊܳɹ¦£¬¿ÉÄÜ»áÖØ·¢£¬Ö±µ½½ÓÊճɹ¦¡£Ïû·ÑÕßfetchÏûÏ¢£¬È»ºó´¦ÀíÏûÏ¢£¬È»ºó±£´æoffset¡£Èç¹ûÏûÏ¢´¦Àí³É¹¦Ö®ºó£¬µ«ÊÇÔÚ±£´æoffset½×¶ÎzookeeperÒì³£µ¼Ö±£´æ²Ù×÷δÄÜÖ´Ðгɹ¦£¬Õâ¾Íµ¼Ö½ÓÏÂÀ´ÔÙ´Îfetchʱ¿ÉÄÜ»ñµÃÉÏ´ÎÒѾ´¦Àí¹ýµÄÏûÏ¢£¬Õâ¾ÍÊÇ"at
least once"£¬ÔÒòoffsetûÓм°Ê±µÄÌá½»¸øzookeeper£¬zookeeper»Ö¸´Õý³£»¹ÊÇ֮ǰoffset״̬¡£
exactly once£ºÏûÏ¢Ö»»á·¢ËÍÒ»´Î¡£kafkaÖв¢Ã»ÓÐÑϸñµÄȥʵÏÖ£¨»ùÓÚ2½×¶ÎÌá½»£©£¬ÎÒÃÇÈÏΪÕâÖÖ²ßÂÔÔÚkafkaÖÐÊÇûÓбØÒªµÄ¡£
ͨ³£Çé¿öÏÂ"at-least-once"ÊÇÎÒÃÇÊ×Ñ¡¡£
KafkaÏûÏ¢´æ´¢¸ñʽ
Topic & Partition
Ò»¸ötopic¿ÉÒÔÈÏΪһ¸öÒ»ÀàÏûÏ¢£¬Ã¿¸ötopic½«±»·Ö³É¶à¸öpartition£¬Ã¿¸öpartitionÔÚ´æ´¢²ãÃæÊÇappend
logÎļþ¡£

ÔÚKafkaÎļþ´æ´¢ÖУ¬Í¬Ò»¸ötopicÏÂÓжà¸ö²»Í¬partition£¬Ã¿¸öpartitionΪһ¸öĿ¼£¬partitonÃüÃû¹æÔòΪtopicÃû³Æ+ÓÐÐòÐòºÅ£¬µÚÒ»¸öpartitonÐòºÅ´Ó0¿ªÊ¼£¬ÐòºÅ×î´óֵΪpartitionsÊýÁ¿¼õ1¡£

1.ÿ¸öpartion£¨Ä¿Â¼£©Ï൱ÓÚÒ»¸ö¾ÞÐÍÎļþ±»Æ½¾ù·ÖÅäµ½¶à¸ö´óСÏàµÈsegment£¨¶Î£©Êý¾ÝÎļþÖС£µ«Ã¿¸ö¶Îsegment
fileÏûÏ¢ÊýÁ¿²»Ò»¶¨ÏàµÈ£¬ÕâÖÖÌØÐÔ·½±ãold segment file¿ìËÙ±»É¾³ý¡£
2.ÿ¸öpartitonÖ»ÐèÒªÖ§³Ö˳Ðò¶Áд¾ÍÐÐÁË£¬segmentÎļþÉúÃüÖÜÆÚÓÉ·þÎñ¶ËÅäÖòÎÊý¾ö¶¨¡£
3.ÕâÑù×öµÄºÃ´¦¾ÍÊÇÄÜ¿ìËÙɾ³ýÎÞÓÃÎļþ£¬ÓÐЧÌá¸ß´ÅÅÌÀûÓÃÂÊ¡£
4.segment file×é³É£ºÓÉ2´ó²¿·Ö×é³É£¬·Ö±ðΪindex
fileºÍdata file£¬´Ë2¸öÎļþÒ»Ò»¶ÔÓ¦£¬³É¶Ô³öÏÖ£¬ºó׺".index"ºÍ¡°.log¡±·Ö±ð±íʾΪsegmentË÷ÒýÎļþ¡¢Êý¾ÝÎļþ.
5.segmentÎļþÃüÃû¹æÔò£ºpartionÈ«¾ÖµÄµÚÒ»¸ösegment´Ó0¿ªÊ¼£¬ºóÐøÃ¿¸ösegmentÎļþÃûΪÉÏÒ»¸ösegmentÎļþ×îºóÒ»ÌõÏûÏ¢µÄoffsetÖµ¡£ÊýÖµ×î´óΪ64λlong´óС£¬19λÊý×Ö×Ö·û³¤¶È£¬Ã»ÓÐÊý×ÖÓÃ0Ìî³ä¡£

segmentÖÐindexÓëdata file¶ÔÓ¦¹ØÏµÎïÀí½á¹¹ÈçÏ£º

ÉÏͼÖÐË÷ÒýÎļþ´æ´¢´óÁ¿ÔªÊý¾Ý£¬Êý¾ÝÎļþ´æ´¢´óÁ¿ÏûÏ¢£¬Ë÷ÒýÎļþÖÐÔªÊý¾ÝÖ¸Ïò¶ÔÓ¦Êý¾ÝÎļþÖÐmessageµÄÎïÀíÆ«ÒÆµØÖ·¡£
ÆäÖÐÒÔË÷ÒýÎļþÖÐÔªÊý¾Ý3,497ΪÀý£¬ÒÀ´ÎÔÚÊý¾ÝÎļþÖбíʾµÚ3¸ömessage£¨ÔÚÈ«¾Öpartiton±íʾµÚ368772¸ömessage£©£¬ÒÔ¼°¸ÃÏûÏ¢µÄÎïÀíÆ«ÒÆµØÖ·Îª497¡£
Á˽⵽segment data fileÓÉÐí¶àmessage×é³É£¬ÏÂÃæÏêϸ˵Ã÷messageÎïÀí½á¹¹ÈçÏ£º

²ÎÊý˵Ã÷£º

¹Ø¼ü×Ö ½âÊÍ˵Ã÷
8 byte offset ÔÚparition(·ÖÇø)ÄÚµÄÿÌõÏûÏ¢¶¼ÓÐÒ»¸öÓÐÐòµÄidºÅ£¬Õâ¸öidºÅ±»³ÆÎªÆ«ÒÆ(offset),Ëü¿ÉÒÔΨһȷ¶¨Ã¿ÌõÏûÏ¢ÔÚparition(·ÖÇø)ÄÚµÄλÖ᣼´offset±íʾpartiionµÄµÚ¶àÉÙmessage
4 byte message size message´óС
4 byte CRC32 ÓÃcrc32УÑémessage
1 byte ¡°magic" ±íʾ±¾´Î·¢²¼Kafka·þÎñ³ÌÐòÐÒé°æ±¾ºÅ
1 byte ¡°attributes" ±íʾΪ¶ÀÁ¢°æ±¾¡¢»ò±êʶѹËõÀàÐÍ¡¢»ò±àÂëÀàÐÍ¡£
4 byte key length ±íʾkeyµÄ³¤¶È,µ±keyΪ-1ʱ£¬K byte key×ֶβ»Ìî
K byte key ¿ÉÑ¡
value bytes payload ±íʾʵ¼ÊÏûÏ¢Êý¾Ý¡£
¸±±¾£¨replication£©²ßÂÔ
KafkaµÄ¸ß¿É¿¿ÐԵı£ÕÏÀ´Ô´ÓÚÆä½¡×³µÄ¸±±¾£¨replication£©²ßÂÔ¡£
1) Êý¾Ýͬ²½
kafkaÔÚ0.8°æ±¾Ç°Ã»ÓÐÌṩPartitionµÄReplication»úÖÆ£¬Ò»µ©Brokerå´»ú£¬ÆäÉϵÄËùÓÐPartition¾Í¶¼ÎÞ·¨Ìṩ·þÎñ£¬¶øPartitionÓÖûÓб¸·ÝÊý¾Ý£¬Êý¾ÝµÄ¿ÉÓÃÐԾʹó´ó½µµÍÁË¡£ËùÒÔ0.8ºóÌṩÁËReplication»úÖÆÀ´±£Ö¤BrokerµÄfailover¡£
ÒýÈëReplicationÖ®ºó£¬Í¬Ò»¸öPartition¿ÉÄÜ»áÓжà¸öReplica£¬¶øÕâʱÐèÒªÔÚÕâЩReplicationÖ®¼äÑ¡³öÒ»¸öLeader£¬ProducerºÍConsumerÖ»ÓëÕâ¸öLeader½»»¥£¬ÆäËüReplica×÷ΪFollower´ÓLeaderÖи´ÖÆÊý¾Ý¡£

2) ¸±±¾·ÅÖòßÂÔ
ΪÁ˸üºÃµÄ×ö¸ºÔؾùºâ£¬Kafka¾¡Á¿½«ËùÓеÄPartition¾ùÔÈ·ÖÅäµ½Õû¸ö¼¯ÈºÉÏ¡£
Kafka·ÖÅäReplicaµÄËã·¨ÈçÏ£º
1.½«ËùÓдæ»îµÄN¸öBrokersºÍ´ý·ÖÅäµÄPartitionÅÅÐò
2.½«µÚi¸öPartition·ÖÅäµ½µÚ(i mod n)¸öBrokerÉÏ£¬Õâ¸öPartitionµÄµÚÒ»¸öReplica´æÔÚÓÚÕâ¸ö·ÖÅäµÄBrokerÉÏ£¬²¢ÇÒ»á×÷ΪpartitionµÄÓÅÏȸ±±¾
3.½«µÚi¸öPartitionµÄµÚj¸öReplica·ÖÅäµ½µÚ((i
+ j) mod n)¸öBrokerÉÏ
¼ÙÉ輯Ⱥһ¹²ÓÐ4¸öbrokers£¬Ò»¸ötopicÓÐ4¸öpartition£¬Ã¿¸öPartitionÓÐ3¸ö¸±±¾¡£ÏÂͼÊÇÿ¸öBrokerÉϵĸ±±¾·ÖÅäÇé¿ö¡£

3) ͬ²½²ßÂÔ
ProducerÔÚ·¢²¼ÏûÏ¢µ½Ä³¸öPartitionʱ£¬ÏÈͨ¹ýZooKeeperÕÒµ½¸ÃPartitionµÄLeader£¬È»ºóÎÞÂÛ¸ÃTopicµÄReplication
FactorΪ¶àÉÙ£¬ProducerÖ»½«¸ÃÏûÏ¢·¢Ë͵½¸ÃPartitionµÄLeader¡£Leader»á½«¸ÃÏûϢдÈëÆä±¾µØLog¡£Ã¿¸öFollower¶¼´ÓLeader
pullÊý¾Ý¡£ÕâÖÖ·½Ê½ÉÏ£¬Follower´æ´¢µÄÊý¾Ý˳ÐòÓëLeader±£³ÖÒ»Ö¡£FollowerÔÚÊÕµ½¸ÃÏûÏ¢²¢Ð´ÈëÆäLogºó£¬ÏòLeader·¢ËÍACK¡£Ò»µ©LeaderÊÕµ½ÁËISRÖеÄËùÓÐReplicaµÄACK£¬¸ÃÏûÏ¢¾Í±»ÈÏΪÒѾcommitÁË£¬Leader½«Ôö¼ÓHW²¢ÇÒÏòProducer·¢ËÍACK¡£
ΪÁËÌá¸ßÐÔÄÜ£¬Ã¿¸öFollowerÔÚ½ÓÊÕµ½Êý¾Ýºó¾ÍÁ¢ÂíÏòLeader·¢ËÍACK£¬¶ø·ÇµÈµ½Êý¾ÝдÈëLogÖС£Òò´Ë£¬¶ÔÓÚÒѾcommitµÄÏûÏ¢£¬KafkaÖ»Äܱ£Ö¤Ëü±»´æÓÚ¶à¸öReplicaµÄÄÚ´æÖУ¬¶ø²»Äܱ£Ö¤ËüÃDZ»³Ö¾Ã»¯µ½´ÅÅÌÖУ¬Ò²¾Í²»ÄÜÍêÈ«±£Ö¤Òì³£·¢Éúºó¸ÃÌõÏûÏ¢Ò»¶¨Äܱ»ConsumerÏû·Ñ¡£
Consumer¶ÁÏûÏ¢Ò²ÊÇ´ÓLeader¶ÁÈ¡£¬Ö»Óб»commit¹ýµÄÏûÏ¢²Å»á±©Â¶¸øConsumer¡£
Kafka ReplicationµÄÊý¾ÝÁ÷ÈçÏÂͼËùʾ£º

¶ÔÓÚKafka¶øÑÔ£¬¶¨ÒåÒ»¸öBrokerÊÇ·ñ¡°»î×Å¡±°üº¬Á½¸öÌõ¼þ£º
1.Ò»ÊÇËü±ØÐëά»¤ÓëZooKeeperµÄsession£¨Õâ¸öͨ¹ýZooKeeperµÄHeartbeat»úÖÆÀ´ÊµÏÖ£©¡£
2.¶þÊÇFollower±ØÐëÄܹ»¼°Ê±½«LeaderµÄÏûÏ¢¸´ÖƹýÀ´£¬²»ÄÜ¡°ÂäºóÌ«¶à¡±¡£
Leader»á¸ú×ÙÓëÆä±£³Öͬ²½µÄReplicaÁÐ±í£¬¸ÃÁÐ±í³ÆÎªISR£¨¼´in-sync
Replica£©¡£Èç¹ûÒ»¸öFollowerå´»ú£¬»òÕßÂäºóÌ«¶à£¬Leader½«°ÑËü´ÓISRÖÐÒÆ³ý¡£ÕâÀïËùÃèÊöµÄ¡°ÂäºóÌ«¶à¡±Ö¸Follower¸´ÖƵÄÏûÏ¢ÂäºóÓÚLeaderºóµÄÌõÊý³¬¹ýÔ¤¶¨Öµ»òÕßFollower³¬¹ýÒ»¶¨Ê±¼äδÏòLeader·¢ËÍfetchÇëÇó¡£
KafkaÖ»½â¾öfail/recover£¬Ò»ÌõÏûÏ¢Ö»Óб»ISRÀïµÄËùÓÐFollower¶¼´ÓLeader¸´ÖƹýÈ¥²Å»á±»ÈÏΪÒÑÌá½»¡£ÕâÑù¾Í±ÜÃâÁ˲¿·ÖÊý¾Ý±»Ð´½øÁËLeader£¬»¹Ã»À´µÃ¼°±»ÈκÎFollower¸´ÖƾÍå´»úÁË£¬¶øÔì³ÉÊý¾Ý¶ªÊ§£¨ConsumerÎÞ·¨Ïû·ÑÕâЩÊý¾Ý£©¡£¶ø¶ÔÓÚProducer¶øÑÔ£¬Ëü¿ÉÒÔÑ¡ÔñÊÇ·ñµÈ´ýÏûÏ¢commit¡£ÕâÖÖ»úÖÆÈ·±£ÁËÖ»ÒªISRÓÐÒ»¸ö»òÒÔÉϵÄFollower£¬Ò»Ìõ±»commitµÄÏûÏ¢¾Í²»»á¶ªÊ§¡£
4) leaderÑ¡¾Ù
LeaderÑ¡¾Ù±¾ÖÊÉÏÊÇÒ»¸ö·Ö²¼Ê½Ëø£¬ÓÐÁ½ÖÖ·½Ê½ÊµÏÖ»ùÓÚZooKeeperµÄ·Ö²¼Ê½Ëø£º
1.½ÚµãÃû³ÆÎ¨Ò»ÐÔ£º¶à¸ö¿Í»§¶Ë´´½¨Ò»¸ö½Úµã£¬Ö»Óгɹ¦´´½¨½ÚµãµÄ¿Í»§¶Ë²ÅÄÜ»ñµÃËø
2.ÁÙʱ˳Ðò½Úµã£ºËùÓпͻ§¶ËÔÚij¸öĿ¼Ï´´½¨×Ô¼ºµÄÁÙʱ˳Ðò½Úµã£¬Ö»ÓÐÐòºÅ×îСµÄ²Å»ñµÃËø
Majority VoteµÄÑ¡¾Ù²ßÂÔºÍZooKeeperÖеÄZabÑ¡¾ÙÊÇÀàËÆµÄ£¬Êµ¼ÊÉÏZooKeeperÄÚ²¿±¾Éí¾ÍʵÏÖÁËÉÙÊý·þ´Ó¶àÊýµÄÑ¡¾Ù²ßÂÔ¡£kafkaÖжÔÓÚPartitionµÄleader¸±±¾µÄÑ¡¾Ù²ÉÓÃÁ˵ÚÒ»ÖÖ·½·¨£ºÎªPartition·ÖÅ丱±¾£¬Ö¸¶¨Ò»¸öZNodeÁÙʱ½Úµã£¬µÚÒ»¸ö³É¹¦´´½¨½ÚµãµÄ¸±±¾¾ÍÊÇLeader½Úµã£¬ÆäËû¸±±¾»áÔÚÕâ¸öZNode½ÚµãÉÏ×¢²áWatcher¼àÌýÆ÷£¬Ò»µ©Leaderå´»ú£¬¶ÔÓ¦µÄÁÙʱ½Úµã¾Í»á±»×Ô¶¯É¾³ý£¬Õâʱע²áÔڸýڵãÉϵÄËùÓÐFollower¶¼»áÊÕµ½¼àÌýÆ÷ʼþ£¬ËüÃǶ¼»á³¢ÊÔ´´½¨¸Ã½Úµã£¬Ö»Óд´½¨³É¹¦µÄÄǸöfollower²Å»á³ÉΪLeader£¨ZooKeeper±£Ö¤¶ÔÓÚÒ»¸ö½ÚµãÖ»ÓÐÒ»¸ö¿Í»§¶ËÄÜ´´½¨³É¹¦£©£¬ÆäËûfollower¼ÌÐøÖØÐÂ×¢²á¼àÌýʼþ¡£
KafkaÏûÏ¢·Ö×飬ÏûÏ¢Ïû·ÑÔÀí
ͬһTopicµÄÒ»ÌõÏûÏ¢Ö»Äܱ»Í¬Ò»¸öConsumer GroupÄÚµÄÒ»¸öConsumerÏû·Ñ£¬µ«¶à¸öConsumer
Group¿ÉͬʱÏû·ÑÕâÒ»ÏûÏ¢¡£

ÕâÊÇKafkaÓÃÀ´ÊµÏÖÒ»¸öTopicÏûÏ¢µÄ¹ã²¥£¨·¢¸øËùÓеÄConsumer£©ºÍµ¥²¥£¨·¢¸øÄ³Ò»¸öConsumer£©µÄÊֶΡ£Ò»¸öTopic¿ÉÒÔ¶ÔÓ¦¶à¸öConsumer
Group¡£Èç¹ûÐèҪʵÏֹ㲥£¬Ö»ÒªÃ¿¸öConsumerÓÐÒ»¸ö¶ÀÁ¢µÄGroup¾Í¿ÉÒÔÁË¡£ÒªÊµÏÖµ¥²¥Ö»ÒªËùÓеÄConsumerÔÚͬһ¸öGroupÀï¡£ÓÃConsumer
Group»¹¿ÉÒÔ½«Consumer½øÐÐ×ÔÓɵķÖ×é¶ø²»ÐèÒª¶à´Î·¢ËÍÏûÏ¢µ½²»Í¬µÄTopic¡£
Push vs. Pull
×÷Ϊһ¸öÏûϢϵͳ£¬Kafka×ñÑÁË´«Í³µÄ·½Ê½£¬Ñ¡ÔñÓÉProducerÏòbroker pushÏûÏ¢²¢ÓÉConsumer´Óbroker
pullÏûÏ¢¡£
pushģʽºÜÄÑÊÊÓ¦Ïû·ÑËÙÂʲ»Í¬µÄÏû·ÑÕߣ¬ÒòΪÏûÏ¢·¢ËÍËÙÂÊÊÇÓÉbroker¾ö¶¨µÄ¡£pushģʽµÄÄ¿±êÊǾ¡¿ÉÄÜÒÔ×î¿ìËÙ¶È´«µÝÏûÏ¢£¬µ«ÊÇÕâÑùºÜÈÝÒ×Ôì³ÉConsumerÀ´²»¼°´¦ÀíÏûÏ¢£¬µäÐ͵ıíÏÖ¾ÍÊǾܾø·þÎñÒÔ¼°ÍøÂçÓµÈû¡£¶øpullģʽÔò¿ÉÒÔ¸ù¾ÝConsumerµÄÏû·ÑÄÜÁ¦ÒÔÊʵ±µÄËÙÂÊÏû·ÑÏûÏ¢¡£
¶ÔÓÚKafka¶øÑÔ£¬pullģʽ¸üºÏÊÊ¡£pullģʽ¿É¼ò»¯brokerµÄÉè¼Æ£¬Consumer¿É×ÔÖ÷¿ØÖÆÏû·ÑÏûÏ¢µÄËÙÂÊ£¬Í¬Ê±Consumer¿ÉÒÔ×Ô¼º¿ØÖÆÏû·Ñ·½Ê½¡ª¡ª¼´¿ÉÅúÁ¿Ïû·ÑÒ²¿ÉÖðÌõÏû·Ñ£¬Í¬Ê±»¹ÄÜÑ¡Ôñ²»Í¬µÄÌá½»·½Ê½´Ó¶øÊµÏÖ²»Í¬µÄ´«ÊäÓïÒå¡£
Kafak˳ÐòдÈëÓëÊý¾Ý¶ÁÈ¡
Éú²úÕߣ¨producer£©ÊǸºÔðÏòKafkaÌá½»Êý¾ÝµÄ£¬Kafka»á°ÑÊÕµ½µÄÏûÏ¢¶¼Ð´Èëµ½Ó²ÅÌÖУ¬Ëü¾ø¶Ô²»»á¶ªÊ§Êý¾Ý¡£ÎªÁËÓÅ»¯Ð´ÈëËÙ¶ÈKafak²ÉÓÃÁËÁ½¸ö¼¼Êõ£¬Ë³ÐòдÈëºÍMMFile¡£
˳ÐòдÈë
ÒòΪӲÅÌÊÇ»úе½á¹¹£¬Ã¿´Î¶Áд¶¼»áѰַ£¬Ð´È룬ÆäÖÐѰַÊÇÒ»¸ö¡°»úе¶¯×÷¡±£¬ËüÊÇ×îºÄʱµÄ¡£ËùÒÔÓ²ÅÌ×î¡°ÌÖÑá¡±Ëæ»úI/O£¬×îϲ»¶Ë³ÐòI/O¡£ÎªÁËÌá¸ß¶ÁдӲÅ̵ÄËÙ¶È£¬Kafka¾ÍÊÇʹÓÃ˳ÐòI/O¡£
ÿÌõÏûÏ¢¶¼±»appendµ½¸ÃPartitionÖУ¬ÊôÓÚ˳Ðòд´ÅÅÌ£¬Òò´ËЧÂʷdz£¸ß¡£

¶ÔÓÚ´«Í³µÄmessage queue¶øÑÔ£¬Ò»°ã»áɾ³ýÒѾ±»Ïû·ÑµÄÏûÏ¢£¬¶øKafkaÊDz»»áɾ³ýÊý¾ÝµÄ£¬Ëü»á°ÑËùÓеÄÊý¾Ý¶¼±£ÁôÏÂÀ´£¬Ã¿¸öÏû·ÑÕߣ¨Consumer£©¶Ôÿ¸öTopic¶¼ÓÐÒ»¸öoffsetÓÃÀ´±íʾ¶ÁÈ¡µ½Á˵ڼ¸ÌõÊý¾Ý¡£

¼´±ãÊÇ˳ÐòдÈëÓ²ÅÌ£¬Ó²Å̵ķÃÎÊËÙ¶È»¹ÊDz»¿ÉÄÜ×·ÉÏÄÚ´æ¡£ËùÒÔKafkaµÄÊý¾Ý²¢²»ÊÇʵʱµÄдÈëÓ²ÅÌ£¬Ëü³ä·ÖÀûÓÃÁËÏÖ´ú²Ù×÷ϵͳ·ÖÒ³´æ´¢À´ÀûÓÃÄÚ´æÌá¸ßI/OЧÂÊ¡£
ÔÚLinux Kernal 2.2Ö®ºó³öÏÖÁËÒ»ÖÖ½Ð×ö¡°Á㿽±´(zero-copy)¡±ÏµÍ³µ÷ÓûúÖÆ£¬¾ÍÊÇÌø¹ý¡°Óû§»º³åÇø¡±µÄ¿½±´£¬½¨Á¢Ò»¸ö´ÅÅ̿ռäºÍÄÚ´æ¿Õ¼äµÄÖ±½ÓÓ³É䣬Êý¾Ý²»ÔÙ¸´ÖƵ½¡°Óû§Ì¬»º³åÇø¡±ÏµÍ³ÉÏÏÂÎÄÇл»¼õÉÙ2´Î£¬¿ÉÒÔÌáÉýÒ»±¶ÐÔÄÜ¡£

ͨ¹ýmmap£¬½ø³ÌÏñ¶ÁдӲÅÌÒ»Ñù¶ÁдÄڴ棨µ±È»ÊÇÐéÄâ»úÄڴ棩¡£Ê¹ÓÃÕâÖÖ·½Ê½¿ÉÒÔ»ñÈ¡ºÜ´óµÄI/OÌáÉý£¬Ê¡È¥ÁËÓû§¿Õ¼äµ½ÄÚºË¿Õ¼ä¸´ÖÆµÄ¿ªÏú£¨µ÷ÓÃÎļþµÄread»á°ÑÊý¾ÝÏȷŵ½Äں˿ռäµÄÄÚ´æÖУ¬È»ºóÔÙ¸´ÖƵ½Óû§¿Õ¼äµÄÄÚ´æÖС£
Ïû·ÑÕߣ¨¶ÁÈ¡Êý¾Ý£©
ÊÔÏëһϣ¬Ò»¸öWeb Server´«ËÍÒ»¸ö¾²Ì¬Îļþ£¬ÈçºÎÓÅ»¯£¿´ð°¸ÊÇzero
copy¡£´«Í³Ä£Ê½ÏÂÎÒÃÇ´ÓÓ²Å̶Áȡһ¸öÎļþÊÇÕâÑùµÄ¡£

Ïȸ´ÖƵ½Äں˿ռ䣨readÊÇϵͳµ÷Ó㬷ŵ½ÁËDMA£¬ËùÒÔÓÃÄں˿ռ䣩£¬È»ºó¸´ÖƵ½Óû§¿Õ¼ä£¨1¡¢2£©£»´ÓÓû§¿Õ¼äÖØÐ¸´ÖƵ½Äں˿ռ䣨ÄãÓõÄsocketÊÇϵͳµ÷Óã¬ËùÒÔËüÒ²ÓÐ×Ô¼ºµÄÄں˿ռ䣩£¬×îºó·¢Ë͸øÍø¿¨£¨3¡¢4£©¡£

Zero CopyÖÐÖ±½Ó´ÓÄں˿ռ䣨DMAµÄ£©µ½Äں˿ռ䣨SocketµÄ£©£¬È»ºó·¢ËÍÍø¿¨¡£Õâ¸ö¼¼Êõ·Ç³£ÆÕ±é£¬NginxÒ²ÊÇÓõÄÕâÖÖ¼¼Êõ¡£
ʵ¼ÊÉÏ£¬Kafka°ÑËùÓеÄÏûÏ¢¶¼´æ·ÅÔÚÒ»¸öÒ»¸öµÄÎļþÖУ¬µ±Ïû·ÑÕßÐèÒªÊý¾ÝµÄʱºòKafkaÖ±½Ó°Ñ¡°Îļþ¡±·¢Ë͸øÏû·ÑÕß¡£µ±²»ÐèÒª°ÑÕû¸öÎļþ·¢³öÈ¥µÄʱºò£¬Kafkaͨ¹ýµ÷ÓÃZero
CopyµÄsendfileÕâ¸öº¯Êý£¬Õâ¸öº¯Êý°üÀ¨£º
1.out_fd×÷ΪÊä³ö£¨Ò»°ã¼°Ê±socketµÄ¾ä±ú£©
2.in_fd×÷ΪÊäÈëÎļþ¾ä±ú
3.off_t±íʾin_fdµÄÆ«ÒÆ£¨´ÓÄÄÀ↑ʼ¶ÁÈ¡£©
4.size_t±íʾ¶ÁÈ¡¶àÉÙ¸ö
5.¡¸ dz̸´ó¹æÄ£·Ö²¼Ê½ÏµÍ³ÖÐÄÇЩ¼¼Êõµã¡¹ÏµÁÐÎÄÕ£º
6.dz̸·Ö²¼Ê½ÊÂÎñ
7.dz̸·Ö²¼Ê½·þÎñе÷¼¼Êõ Zookeeper |