Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Kafka Exactly OnceÓïÒåÓëÊÂÎñ»úÖÆÔ­Àí
 
  2408  次浏览      28
 2017-12-5 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ´óÊý¾Ý¼Ü¹¹£¬±¾ÎÄÏêϸ·ÖÎöÁËKafkaÊÂÎñ»úÖÆµÄʵÏÖÔ­Àí£¬²¢½éÉÜÁËKafkaÈçºÎ´¦ÀíÊÂÎñÏà¹ØµÄÒì³£Çé¿ö£¬ÈçTransaction Coordinatorå´»ú¡£

дÔÚÇ°ÃæµÄ»°

±¾ÎÄËùÓÐKafkaÔ­ÀíÐÔµÄÃèÊö³ýÌØÊâ˵Ã÷Íâ¾ù»ùÓÚ Kafka 1.0.0 °æ±¾¡£

ΪʲôҪÌṩÊÂÎñ»úÖÆ

KafkaÊÂÎñ»úÖÆµÄʵÏÖÖ÷ÒªÊÇΪÁËÖ§³Ö

1.Exactly Once¼´ÕýºÃÒ»´ÎÓïÒå

2.²Ù×÷µÄÔ­×ÓÐÔ

3.ÓÐ״̬²Ù×÷µÄ¿É»Ö¸´ÐÔ

Exactly Once

¡¶Kafka±³¾°¼°¼Ü¹¹½éÉÜ¡·Ò»ÎÄÖÐÓÐ˵Ã÷KafkaÔÚ0.11.0.0֮ǰµÄ°æ±¾ÖÐÖ»Ö§³ÖAt Least Once ºÍ At Most OnceÓïÒ壬Éв»Ö§³ÖExactly OnceÓïÒå¡£

µ«ÊÇÔںܶàÒªÇóÑϸñµÄ³¡¾°Ï£¬ÈçʹÓÃKafka´¦Àí½»Ò×Êý¾Ý£¬Exactly OnceÓïÒåÊDZØÐëµÄ¡£ÎÒÃÇ¿ÉÒÔͨ¹ýÈÃÏÂÓÎϵͳ¾ßÓÐÃݵÈÐÔÀ´ÅäºÏKafkaµÄAt Least OnceÓïÒåÀ´¼ä½ÓʵÏÖExactly Once¡£µ«ÊÇ£º

1.¸Ã·½°¸ÒªÇóÏÂÓÎϵͳ֧³ÖÃݵȲÙ×÷£¬ÏÞÖÆÁËKafkaµÄÊÊÓó¡¾°

2.ʵÏÖÃż÷Ïà¶Ô½Ï¸ß£¬ÐèÒªÓû§¶ÔKafkaµÄ¹¤×÷»úÖÆ·Ç³£Á˽â

3.¶ÔÓÚKafka Stream¶øÑÔ£¬Kafka±¾Éí¼´ÊÇ×Ô¼ºµÄÏÂÓÎϵͳ£¬µ«KafkaÔÚ0.11.0.0°æ±¾Ö®Ç°²»¾ßÓÐÃݵȷ¢ËÍÄÜÁ¦

Òò´Ë£¬Kafka±¾Éí¶ÔExactly OnceÓïÒåµÄÖ§³Ö¾Í·Ç³£±ØÒª¡£

¡£¡£¡£¡£¡£¡£

²Ù×÷Ô­×ÓÐÔ

²Ù×÷µÄÔ­×ÓÐÔÊÇÖ¸£¬¶à¸ö²Ù×÷Ҫôȫ²¿³É¹¦ÒªÃ´È«²¿Ê§°Ü£¬²»´æÔÚ²¿·Ö³É¹¦²¿·Öʧ°ÜµÄ¿ÉÄÜ¡£

ʵÏÖÔ­×ÓÐÔ²Ù×÷µÄÒâÒåÔÚÓÚ£º

1.²Ù×÷½á¹û¸ü¿É¿Ø£¬ÓÐÖúÓÚÌáÉýÊý¾ÝÒ»ÖÂÐÔ

2.±ãÓÚ¹ÊÕϻָ´¡£ÒòΪ²Ù×÷ÊÇÔ­×ӵ쬴ӹÊÕÏÖлָ´Ê±Ö»ÐèÒªÖØÊԸòÙ×÷£¨Èç¹ûÔ­²Ù×÷ʧ°Ü£©»òÕßÖ±½ÓÌø¹ý¸Ã²Ù×÷£¨Èç¹ûÔ­²Ù×÷³É¹¦£©£¬¶ø²»ÐèÒª¼Ç¼Öмä״̬£¬¸ü²»ÐèÒªÕë¶ÔÖмä״̬×÷ÌØÊâ´¦Àí

ʵÏÖÊÂÎñ»úÖÆµÄ¼¸¸ö½×¶Î

ÃݵÈÐÔ·¢ËÍ

ÉÏÎÄÌáµ½£¬ÊµÏÖExactly OnceµÄÒ»ÖÖ·½·¨ÊÇÈÃÏÂÓÎϵͳ¾ßÓÐÃݵȴ¦ÀíÌØÐÔ£¬¶øÔÚKafka StreamÖУ¬Kafka PRODUCER ±¾Éí¾ÍÊÇ¡°ÏÂÓΡ±ÏµÍ³£¬Òò´ËÈç¹ûÄÜÈà PRODUCER ¾ßÓÐÃݵȴ¦ÀíÌØÐÔ£¬ÄǾͿÉÒÔÈÃKafka StreamÔÚÒ»¶¨³Ì¶ÈÉÏÖ§³ÖExactly onceÓïÒå¡£

ΪÁËʵÏÖ PRODUCER µÄÃݵÈÓïÒ壬KafkaÒýÈëÁË PRODUCER ID£¨¼´PID£©ºÍSequence Number¡£Ã¿¸öÐ嵀 PRODUCER ÔÚ³õʼ»¯µÄʱºò»á±»·ÖÅäÒ»¸öΨһµÄPID£¬¸ÃPID¶ÔÓû§Íêȫ͸Ã÷¶ø²»»á±©Â¶¸øÓû§¡£

¶ÔÓÚÿ¸öPID£¬¸Ã PRODUCER ·¢ËÍÊý¾ÝµÄÿ¸ö<Topic, Partition>¶¼¶ÔÓ¦Ò»¸ö´Ó0¿ªÊ¼µ¥µ÷µÝÔöµÄSequence Number¡£

ÀàËÆµØ£¬Broker¶ËÒ²»áΪÿ¸ö<PID, Topic, Partition>ά»¤Ò»¸öÐòºÅ£¬²¢ÇÒÿ´ÎCommitÒ»ÌõÏûϢʱ½«Æä¶ÔÓ¦ÐòºÅµÝÔö¡£¶ÔÓÚ½ÓÊÕµÄÿÌõÏûÏ¢£¬Èç¹ûÆäÐòºÅ±ÈBrokerά»¤µÄÐòºÅ£¨¼´×îºóÒ»´ÎCommitµÄÏûÏ¢µÄÐòºÅ£©´óÒ»£¬ÔòBroker»á½ÓÊÜËü£¬·ñÔò½«Æä¶ªÆú£º

1.Èç¹ûÏûÏ¢ÐòºÅ±ÈBrokerά»¤µÄÐòºÅ´óÒ»ÒÔÉÏ£¬ËµÃ÷ÖмäÓÐÊý¾ÝÉÐδдÈ룬Ҳ¼´ÂÒÐò£¬´ËʱBroker¾Ü¾ø¸ÃÏûÏ¢£¬ PRODUCER Å׳öInvalidSequenceNumber

2.Èç¹ûÏûÏ¢ÐòºÅСÓÚµÈÓÚBrokerά»¤µÄÐòºÅ£¬ËµÃ÷¸ÃÏûÏ¢Òѱ»±£´æ£¬¼´ÎªÖظ´ÏûÏ¢£¬BrokerÖ±½Ó¶ªÆú¸ÃÏûÏ¢£¬ PRODUCER Å׳öDuplicateSequenceNumber

ÉÏÊöÉè¼Æ½â¾öÁË0.11.0.0֮ǰ°æ±¾ÖеÄÁ½¸öÎÊÌ⣺

1.Broker±£´æÏûÏ¢ºó£¬·¢ËÍACKǰ崻ú£¬ PRODUCER ÈÏΪÏûϢδ·¢Ëͳɹ¦²¢ÖØÊÔ£¬Ôì³ÉÊý¾ÝÖØ¸´

2.ǰһÌõÏûÏ¢·¢ËÍʧ°Ü£¬ºóÒ»ÌõÏûÏ¢·¢Ëͳɹ¦£¬Ç°Ò»ÌõÏûÏ¢ÖØÊÔºó³É¹¦£¬Ôì³ÉÊý¾ÝÂÒÐò

ÊÂÎñÐÔ±£Ö¤

ÉÏÊöÃݵÈÉè¼ÆÖ»Äܱ£Ö¤µ¥¸ö PRODUCER ¶ÔÓÚͬһ¸ö <Topic, Partition> µÄ Exactly Once ÓïÒå¡£

ÁíÍ⣬Ëü²¢²»Äܱ£Ö¤Ð´²Ù×÷µÄÔ­×ÓÐÔ¡ª¡ª¼´¶à¸öд²Ù×÷£¬ÒªÃ´È«²¿±»CommitҪôȫ²¿²»±»Commit¡£

¸ü²»Äܱ£Ö¤¶à¸ö¶Áд²Ù×÷µÄµÄÔ­×ÓÐÔ¡£ÓÈÆä¶ÔÓÚKafka StreamÓ¦ÓöøÑÔ£¬µäÐ͵IJÙ×÷¼´ÊÇ´Óij¸öTopicÏû·ÑÊý¾Ý£¬¾­¹ýһϵÁÐת»»ºóд»ØÁíÒ»¸öTopic£¬±£Ö¤´ÓÔ´TopicµÄ¶ÁÈ¡ÓëÏòÄ¿±êTopicµÄдÈëµÄÔ­×ÓÐÔÓÐÖúÓÚ´Ó¹ÊÕÏÖлָ´¡£

ÊÂÎñ±£Ö¤¿ÉʹµÃÓ¦ÓóÌÐò½«Éú²úÊý¾ÝºÍÏû·ÑÊý¾Ýµ±×÷Ò»¸öÔ­×Óµ¥ÔªÀ´´¦Àí£¬ÒªÃ´È«²¿³É¹¦£¬ÒªÃ´È«²¿Ê§°Ü£¬¼´Ê¹¸ÃÉú²ú»òÏû·Ñ¿ç¶à¸ö<Topic, Partition>¡£

ÁíÍ⣬ÓÐ״̬µÄÓ¦ÓÃÒ²¿ÉÒÔ±£Ö¤ÖØÆôºó´Ó¶Ïµã´¦¼ÌÐø´¦Àí£¬Ò²¼´ÊÂÎñ»Ö¸´¡£

ΪÁËʵÏÖÕâÖÖЧ¹û£¬Ó¦ÓóÌÐò±ØÐëÌṩһ¸öÎȶ¨µÄ£¨ÖØÆôºó²»±ä£©Î¨Ò»µÄID£¬Ò²¼´Transaction ID¡£Transactin IDÓëPID¿ÉÄÜÒ»Ò»¶ÔÓ¦¡£Çø±ðÔÚÓÚTransaction IDÓÉÓû§Ìṩ£¬¶øPIDÊÇÄÚ²¿µÄʵÏÖ¶ÔÓû§Í¸Ã÷¡£

ÁíÍ⣬ΪÁ˱£Ö¤Ð嵀 PRODUCER Æô¶¯ºó£¬¾ÉµÄ¾ßÓÐÏàͬ Transaction IDµÄ PRODUCER ¼´Ê§Ð§£¬Ã¿´Î PRODUCER ͨ¹ýTransaction IDÄõ½PIDµÄͬʱ£¬»¹»á»ñȡһ¸öµ¥µ÷µÝÔöµÄepoch¡£ÓÉÓÚ¾ÉµÄ PRODUCER µÄ epoch ±ÈРPRODUCER µÄepochС£¬Kafka¿ÉÒÔºÜÈÝÒ×ʶ±ð³ö¸Ã PRODUCER ÊÇÀ쵀 PRODUCER ²¢¾Ü¾øÆäÇëÇó¡£

ÓÐÁËTransaction IDºó£¬Kafka¿É±£Ö¤£º

1.¿çSessionµÄÊý¾ÝÃݵȷ¢ËÍ¡£µ±¾ßÓÐÏàͬ Transaction IDµÄÐ嵀 PRODUCER ʵÀý±»´´½¨ÇÒ¹¤×÷ʱ£¬¾ÉµÄÇÒÓµÓÐÏàͬTransaction IDµÄ PRODUCER ½«²»ÔÙ¹¤×÷¡£

2.¿çSessionµÄÊÂÎñ»Ö¸´¡£Èç¹ûij¸öÓ¦ÓÃʵÀýå´»ú£¬ÐµÄʵÀý¿ÉÒÔ±£Ö¤ÈκÎδÍê³ÉµÄ¾ÉµÄÊÂÎñҪôCommitҪôAbort£¬Ê¹µÃÐÂʵÀý´ÓÒ»¸öÕý³£×´Ì¬¿ªÊ¼¹¤×÷¡£

ÐèҪעÒâµÄÊÇ£¬ÉÏÊöµÄÊÂÎñ±£Ö¤ÊÇ´Ó PRODUCER µÄ½Ç¶ÈÈ¥¿¼Âǵġ£´ÓConsumerµÄ½Ç¶ÈÀ´¿´£¬¸Ã±£Ö¤»áÏà¶ÔÈõһЩ¡£ÓÈÆäÊDz»Äܱ£Ö¤ËùÓб»Ä³ÊÂÎñCommit¹ýµÄËùÓÐÏûÏ¢¶¼±»Ò»ÆðÏû·Ñ£¬ÒòΪ£º

1.¶ÔÓÚѹËõµÄTopic¶øÑÔ£¬Í¬Ò»ÊÂÎñµÄijЩÏûÏ¢¿ÉÄܱ»ÆäËü°æ±¾¸²¸Ç

2.ÊÂÎñ°üº¬µÄÏûÏ¢¿ÉÄÜ·Ö²¼ÔÚ¶à¸öSegmentÖУ¨¼´Ê¹ÔÚͬһ¸öPartitionÄÚ£©£¬µ±ÀϵÄSegment±»É¾³ýʱ£¬¸ÃÊÂÎñµÄ²¿·ÖÊý¾Ý¿ÉÄܻᶪʧ

3.ConsumerÔÚÒ»¸öÊÂÎñÄÚ¿ÉÄÜͨ¹ýseek·½·¨·ÃÎÊÈÎÒâOffsetµÄÏûÏ¢£¬´Ó¶ø¿ÉÄܶªÊ§²¿·ÖÏûÏ¢

4.Consumer¿ÉÄܲ¢²»ÐèÒªÏû·ÑijһÊÂÎñÄÚµÄËùÓÐPartition£¬Òò´ËËü½«ÓÀÔ¶²»»á¶ÁÈ¡×é³É¸ÃÊÂÎñµÄËùÓÐÏûÏ¢

ÊÂÎñ»úÖÆÔ­Àí

ÊÂÎñÐÔÏûÏ¢´«µÝ

ÕâÒ»½ÚËù˵µÄÊÂÎñÖ÷ÒªÖ¸Ô­×ÓÐÔ£¬Ò²¼´ PRODUCER ½«¶àÌõÏûÏ¢×÷Ϊһ¸öÊÂÎñÅúÁ¿·¢ËÍ£¬ÒªÃ´È«²¿³É¹¦ÒªÃ´È«²¿Ê§°Ü¡£

ΪÁËʵÏÖÕâÒ»µã£¬Kafka 0.11.0.0ÒýÈëÁËÒ»¸ö·þÎñÆ÷¶ËµÄÄ£¿é£¬ÃûΪ Transaction Coordinator £¬ÓÃÓÚ¹ÜÀí PRODUCER ·¢Ë͵ÄÏûÏ¢µÄÊÂÎñÐÔ¡£

¸Ã Transaction Coordinatorά»¤ Transaction Log£¬¸Ãlog´æÓÚÒ»¸öÄÚ²¿µÄTopicÄÚ¡£ÓÉÓÚTopicÊý¾Ý¾ßÓг־ÃÐÔ£¬Òò´ËÊÂÎñµÄ״̬Ҳ¾ßÓг־ÃÐÔ¡£

PRODUCER ²¢²»Ö±½Ó¶Áд Transaction Log£¬ËüÓë Transaction CoordinatorͨÐÅ£¬È»ºóÓÉTransaction Coordinator½«¸ÃÊÂÎñµÄ״̬²åÈëÏàÓ¦µÄ Transaction Log¡£

Transaction LogµÄÉè¼ÆÓëOffset LogÓÃÓÚ±£´æConsumerµÄOffsetÀàËÆ¡£

ÊÂÎñÖÐOffsetµÄÌá½»

Ðí¶à»ùÓÚKafkaµÄÓ¦Óã¬ÓÈÆäÊÇKafka StreamÓ¦ÓÃÖÐͬʱ°üº¬ConsumerºÍ PRODUCER £¬Ç°Õ߸ºÔð´ÓKafkaÖлñÈ¡ÏûÏ¢£¬ºóÕ߸ºÔ𽫴¦ÀíÍêµÄÊý¾Ýд»ØKafkaµÄÆäËüTopicÖС£

ΪÁËʵÏָ󡾰ϵÄÊÂÎñµÄÔ­×ÓÐÔ£¬KafkaÐèÒª±£Ö¤¶ÔConsumer OffsetµÄCommitÓë PRODUCER ¶Ô·¢ËÍÏûÏ¢µÄCommit°üº¬ÔÚͬһ¸öÊÂÎñÖС£·ñÔò£¬Èç¹ûÔÚ¶þÕßCommitÖм䷢ÉúÒì³££¬¸ù¾Ý¶þÕßCommitµÄ˳Ðò¿ÉÄÜ»áÔì³ÉÊý¾Ý¶ªÊ§ºÍÊý¾ÝÖØ¸´£º

1.Èç¹ûÏÈCommit PRODUCER ·¢ËÍÊý¾ÝµÄÊÂÎñÔÙCommit ConsumerµÄOffset£¬¼´At Least OnceÓïÒ壬¿ÉÄÜÔì³ÉÊý¾ÝÖØ¸´¡£

2.Èç¹ûÏÈCommit ConsumerµÄOffset£¬ÔÙCommit PRODUCER Êý¾Ý·¢ËÍÊÂÎñ£¬¼´At Most OnceÓïÒ壬¿ÉÄÜÔì³ÉÊý¾Ý¶ªÊ§¡£

ÓÃÓÚÊÂÎñÌØÐԵĿØÖÆÐÍÏûÏ¢

ΪÁËÇø·ÖдÈëPartitionµÄÏûÏ¢±»Commit»¹ÊÇAbort£¬KafkaÒýÈëÁËÒ»ÖÖÌØÊâÀàÐ͵ÄÏûÏ¢£¬¼´Control Message¡£¸ÃÀàÏûÏ¢µÄValueÄÚ²»°üº¬ÈκÎÓ¦ÓÃÏà¹ØµÄÊý¾Ý£¬²¢ÇÒ²»»á±©Â¶¸øÓ¦ÓóÌÐò¡£ËüÖ»ÓÃÓÚBrokerÓëClient¼äµÄÄÚ²¿Í¨ÐÅ¡£

¶ÔÓÚ PRODUCER ¶ËÊÂÎñ£¬KafkaÒÔControl MessageµÄÐÎʽÒýÈëһϵÁÐµÄ Transaction Marker¡£Consumer¼´¿Éͨ¹ý¸Ã±ê¼ÇÅж¨¶ÔÓ¦µÄÏûÏ¢±»CommitÁË»¹ÊÇAbortÁË£¬È»ºó½áºÏ¸ÃConsumerÅäÖõĸôÀë¼¶±ð¾ö¶¨ÊÇ·ñÓ¦¸Ã½«¸ÃÏûÏ¢·µ»Ø¸øÓ¦ÓóÌÐò¡£

ÊÂÎñ´¦ÀíÑùÀý´úÂë

PRODUCER <String, String> PRODUCER = new Kafka PRODUCER <String, String>(props);
// ³õʼ»¯ÊÂÎñ£¬°üÀ¨½áÊø¸Ã Transaction ID¶ÔÓ¦µÄδÍê³ÉµÄÊÂÎñ£¨Èç¹ûÓУ©
// ±£Ö¤ÐµÄÊÂÎñÔÚÒ»¸öÕýÈ·µÄ״̬ÏÂÆô¶¯
PRODUCER .init Transactions ();
// ¿ªÊ¼ÊÂÎñ
PRODUCER .begin Transaction ();
// Ïû·ÑÊý¾Ý
ConsumerRecords<String, String> records = consumer.poll(100);
try{
// ·¢ËÍÊý¾Ý
PRODUCER .send(new PRODUCER Record<String, String>("Topic", "Key", "Value"));
// ·¢ËÍÏû·ÑÊý¾ÝµÄOffset£¬½«ÉÏÊöÊý¾ÝÏû·ÑÓëÊý¾Ý·¢ËÍÄÉÈëͬһ¸ö Transaction ÄÚ
PRODUCER . sendOffsetsTo Transaction(offsets, "group1");
// Êý¾Ý·¢Ëͼ°Offset·¢Ë;ù³É¹¦µÄÇé¿öÏ£¬Ìá½»ÊÂÎñ
PRODUCER .commit Transaction ();
} catch ( PRODUCER FencedException | OutOfOrderSequenceException | AuthorizationException e) {
// Êý¾Ý·¢ËÍ»òÕßOffset·¢ËͳöÏÖÒ쳣ʱ£¬ÖÕÖ¹ÊÂÎñ
PRODUCER .abort Transaction();
} finally {
// ¹Ø±Õ PRODUCER ºÍConsumer
PRODUCER .close();
consumer.close();
}

ÍêÕûÊÂÎñ¹ý³Ì

1. ÕÒµ½ Transaction Coordinator

ÓÉÓÚ Transaction CoordinatorÊÇ·ÖÅäPIDºÍ¹ÜÀíÊÂÎñµÄºËÐÄ£¬Òò´Ë PRODUCER Òª×öµÄµÚÒ»¼þÊÂÇé¾ÍÊÇͨ¹ýÏòÈÎÒâÒ»¸öBroker·¢ËÍFindCoordinatorÇëÇóÕÒµ½ Transaction CoordinatorµÄλÖá£

×¢Ò⣺ֻÓÐÓ¦ÓóÌÐòΪ PRODUCER ÅäÖÃÁË Transaction IDʱ²Å¿ÉʹÓÃÊÂÎñÌØÐÔ£¬Ò²²ÅÐèÒªÕâÒ»²½¡£ÁíÍ⣬ÓÉÓÚÊÂÎñÐÔÒªÇó PRODUCER ¿ªÆôÃݵÈÌØÐÔ£¬Òò´Ëͨ¹ý½« transactional.idÉèÖÃΪ·Ç¿Õ´Ó¶ø¿ªÆôÊÂÎñÌØÐÔµÄͬʱҲÐèҪͨ¹ý½«enable.idempotenceÉèÖÃΪtrueÀ´¿ªÆôÃݵÈÌØÐÔ¡£

2. »ñÈ¡PID

ÕÒµ½ Transaction Coordinatorºó£¬¾ßÓÐÃݵÈÌØÐ﵀ PRODUCER ±ØÐë·¢ÆðInitPidRequestÇëÇóÒÔ»ñÈ¡PID¡£

×¢Ò⣺ֻҪ¿ªÆôÁËÃݵÈÌØÐÔ¼´±ØÐëÖ´ÐиòÙ×÷£¬¶øÎÞÐ뿼ÂǸà PRODUCER ÊÇ·ñ¿ªÆôÁËÊÂÎñÌØÐÔ¡£

Èç¹ûÊÂÎñÌØÐÔ±»¿ªÆô£¬InitPidRequest»á·¢Ë͸ø Transaction Coordinator ¡£Èç¹û Transaction Coordinator ÊǵÚÒ»´ÎÊÕµ½°üº¬Óиà Transaction IDµÄInitPidRequestÇëÇó£¬Ëü½«»á°Ñ¸Ã<TransactionID, PID>´æÈë Transaction Log£¬ÈçÉÏͼÖв½Öè2.1Ëùʾ¡£ÕâÑù¿É±£Ö¤¸Ã¶ÔÓ¦¹ØÏµ±»³Ö¾Ã»¯£¬´Ó¶ø±£Ö¤¼´Ê¹Transaction Coordinatorå´»ú¸Ã¶ÔÓ¦¹ØÏµÒ²²»»á¶ªÊ§¡£

³ýÁË·µ»ØPIDÍ⣬InitPidRequest»¹»áÖ´ÐÐÈçÏÂÈÎÎñ£º

Ôö¼Ó¸ÃPID¶ÔÓ¦µÄepoch¡£¾ßÓÐÏàͬPIDµ«epochСÓÚ¸ÃepochµÄÆäËü PRODUCER £¨Èç¹ûÓУ©Ð¿ªÆôµÄÊÂÎñ½«±»¾Ü¾ø¡£

»Ö¸´£¨Commit»òAbort£©Ö®Ç°µÄ PRODUCER δÍê³ÉµÄÊÂÎñ£¨Èç¹ûÓУ©¡£

×¢Ò⣺InitPidRequestµÄ´¦Àí¹ý³ÌÊÇͬ²½×èÈûµÄ¡£Ò»µ©¸Ãµ÷ÓÃÕýÈ··µ»Ø£¬ PRODUCER ¼´¿É¿ªÊ¼ÐµÄÊÂÎñ¡£

ÁíÍ⣬Èç¹ûÊÂÎñÌØÐÔ먦Æô£¬InitPidRequest¿É·¢ËÍÖÁÈÎÒâBroker£¬²¢ÇÒ»áµÃµ½Ò»¸öȫеÄΨһµÄPID¡£¸Ã PRODUCER ½«Ö»ÄÜʹÓÃÃݵÈÌØÐÔÒÔ¼°µ¥Ò»SessionÄÚµÄÊÂÎñÌØÐÔ£¬¶ø²»ÄÜʹÓÿçSessionµÄÊÂÎñÌØÐÔ¡£

3. ¿ªÆôÊÂÎñ

Kafka´Ó0.11.0.0°æ±¾¿ªÊ¼£¬Ìṩ beginTransaction() ·½·¨ÓÃÓÚ¿ªÆôÒ»¸öÊÂÎñ¡£µ÷Óø÷½·¨ºó£¬ PRODUCER ±¾µØ»á¼Ç¼ÒѾ­¿ªÆôÁËÊÂÎñ£¬µ«Transaction CoordinatorÖ»ÓÐÔÚ PRODUCER ·¢Ë͵ÚÒ»ÌõÏûÏ¢ºó²ÅÈÏΪÊÂÎñÒѾ­¿ªÆô¡£

4. Consume-Transform-Produce

ÕâÒ»½×¶Î£¬°üº¬ÁËÕû¸öÊÂÎñµÄÊý¾Ý´¦Àí¹ý³Ì£¬²¢ÇÒ°üº¬Á˶àÖÖÇëÇó¡£

AddPartitionsToTxnRequest

Ò»¸ö PRODUCER ¿ÉÄÜ»á¸ø¶à¸ö<Topic, Partition>·¢ËÍÊý¾Ý£¬¸øÒ»¸öеÄ<Topic, Partition>·¢ËÍÊý¾Ýǰ£¬ËüÐèÒªÏÈÏò Transaction Coordinator·¢ËÍAddPartitionsToTxnRequest¡£

Transaction Coordinator»á½«¸Ã< Transaction , Topic, Partition>´æÓÚ Transaction LogÄÚ£¬²¢½«Æä״̬ÖÃΪBEGIN£¬ÈçÉÏͼÖв½Öè4.1Ëùʾ¡£ÓÐÁ˸ÃÐÅÏ¢ºó£¬ÎÒÃDzſÉÒÔÔÚºóÐø²½ÖèÖÐΪÿ¸öTopic, Partition>ÉèÖÃCOMMIT»òÕßABORT±ê¼Ç£¨ÈçÉÏͼÖв½Öè5.2Ëùʾ£©¡£

ÁíÍ⣬Èç¹û¸Ã<Topic, Partition>Ϊ¸ÃÊÂÎñÖеÚÒ»¸ö<Topic, Partition>£¬ Transaction Coordinator»¹»áÆô¶¯¶Ô¸ÃÊÂÎñµÄ¼ÆÊ±£¨Ã¿¸öÊÂÎñ¶¼ÓÐ×Ô¼ºµÄ³¬Ê±Ê±¼ä£©¡£

PRODUCER equest

PRODUCER ͨ¹ýÒ»¸ö»ò¶à¸ö PRODUCER equest·¢ËÍһϵÁÐÏûÏ¢¡£³ýÁËÓ¦ÓÃÊý¾ÝÍ⣬¸ÃÇëÇó»¹°üº¬ÁËPID£¬epoch£¬ºÍSequence Number¡£¸Ã¹ý³ÌÈçÉÏͼÖв½Öè4.2Ëùʾ¡£

AddOffsetsToTxnRequest

ΪÁËÌṩÊÂÎñÐÔ£¬ PRODUCER ÐÂÔöÁËsendOffsetsTo Transaction·½·¨£¬¸Ã·½·¨½«¶à×éÏûÏ¢µÄ·¢ËͺÍÏû·Ñ·ÅÈëͬһÅú´¦ÀíÄÚ¡£

¸Ã·½·¨ÏÈÅжÏÔÚµ±Ç°ÊÂÎñÖи÷½·¨ÊÇ·ñÒѾ­±»µ÷Óò¢´«ÈëÁËÏàͬµÄGroup ID¡£ÈôÊÇ£¬Ö±½ÓÌøµ½ÏÂÒ»²½£»Èô²»ÊÇ£¬ÔòÏò Transaction Coordinator·¢ËÍAddOffsetsToTxnRequestsÇëÇó£¬Transaction Coordinator½«¶ÔÓ¦µÄËùÓÐ<Topic, Partition>´æÓÚTransaction LogÖУ¬²¢½«Æä״̬¼ÇΪBEGIN£¬ÈçÉÏͼÖв½Öè4.3Ëùʾ¡£¸Ã·½·¨»á×èÈûÖ±µ½ÊÕµ½ÏìÓ¦¡£

TxnOffsetCommitRequest

×÷ΪsendOffsetsToTransaction·½·¨µÄÒ»²¿·Ö£¬ÔÚ´¦ÀíÍêAddOffsetsToTxnRequestºó£¬ PRODUCER Ò²»á·¢ËÍTxnOffsetCommitÇëÇó¸øConsumer Coordinator´Ó¶ø½«±¾ÊÂÎñ°üº¬µÄÓë¶Á²Ù×÷Ïà¹ØµÄ¸÷<Topic, Partition>µÄOffset³Ö¾Ã»¯µ½ÄÚ²¿µÄ__consumer_offsetsÖУ¬ÈçÉÏͼ²½Öè4.4Ëùʾ¡£

Ôڴ˹ý³ÌÖУ¬Consumer Coordinator»áͨ¹ýPIDºÍ¶ÔÓ¦µÄepochÀ´ÑéÖ¤ÊÇ·ñÓ¦¸ÃÔÊÐí¸Ã PRODUCER µÄ¸ÃÇëÇó¡£

ÕâÀïÐèҪעÒ⣺

дÈë__consumer_offsetsµÄOffsetÐÅÏ¢ÔÚµ±Ç°ÊÂÎñCommitǰ¶ÔÍâÊDz»¿É¼ûµÄ¡£Ò²¼´ÔÚµ±Ç°ÊÂÎñ±»Commitǰ£¬¿ÉÈÏΪ¸ÃOffsetÉÐδCommit£¬Ò²¼´¶ÔÓ¦µÄÏûÏ¢ÉÐδ±»Íê³É´¦Àí¡£

Consumer Coordinator²¢²»»áÁ¢¼´¸üлº´æÖÐÏàÓ¦<Topic, Partition>µÄOffset£¬ÒòΪ´ËʱÕâЩ¸üвÙ×÷ÉÐδ±»COMMIT»òABORT¡£

5. Commit»òAbortÊÂÎñ

Ò»µ©ÉÏÊöÊý¾ÝдÈë²Ù×÷Íê³É£¬Ó¦ÓóÌÐò±ØÐëµ÷Óà Kafka PRODUCER µÄ commitTransaction ·½·¨»òÕßabortTransaction·½·¨ÒÔ½áÊøµ±Ç°ÊÂÎñ¡£

EndTxnRequest

commitTransaction·½·¨Ê¹µÃ PRODUCER дÈëµÄÊý¾Ý¶ÔÏÂÓÎ Consumer ¿É¼û¡£abortTransaction ·½·¨Í¨¹ýTransaction Marker½« PRODUCER дÈëµÄÊý¾Ý±ê¼ÇΪAborted״̬¡£ÏÂÓεÄConsumerÈç¹û½«isolation.levelÉèÖÃΪREAD_COMMITTED£¬ÔòËü¶Áµ½±»AbortµÄÏûÏ¢ºóÖ±½Ó½«Æä¶ªÆú¶ø²»»á·µ»Ø¸ø¿Í»§³ÌÐò£¬Ò²¼´±»AbortµÄÏûÏ¢¶ÔÓ¦ÓóÌÐò²»¿É¼û¡£

ÎÞÂÛÊÇCommit»¹ÊÇAbort£¬ PRODUCER ¶¼»á·¢ËÍEndTxnRequestÇëÇó¸ø Transaction Coordinator£¬²¢Í¨¹ý±ê־λ±êʶÊÇÓ¦¸ÃCommit»¹ÊÇAbort¡£

ÊÕµ½¸ÃÇëÇóºó£¬Transaction Coordinator»á½øÐÐÈçϲÙ×÷

1.½«PREPARE_COMMIT»òPREPARE_ABORTÏûϢдÈë Transaction Log£¬ÈçÉÏͼÖв½Öè5.1Ëùʾ

2.ͨ¹ýWriteTxnMarkerÇëÇóÒÔ Transaction MarkerµÄÐÎʽ½«COMMIT»òABORTÐÅϢдÈëÓû§Êý¾ÝÈÕÖ¾ÒÔ¼°Offset LogÖУ¬ÈçÉÏͼÖв½Öè5.2Ëùʾ

3.×îºó½«COMPLETE_COMMIT»òCOMPLETE_ABORTÐÅϢдÈë Transaction LogÖУ¬ÈçÉÏͼÖв½Öè5.3Ëùʾ

²¹³ä˵Ã÷£º¶ÔÓÚcommit Transaction·½·¨£¬Ëü»áÔÚ·¢ËÍEndTxnRequest֮ǰÏȵ÷ÓÃflush·½·¨ÒÔÈ·±£ËùÓз¢ËͳöÈ¥µÄÊý¾Ý¶¼µÃµ½ÏàÓ¦µÄACK¡£¶ÔÓÚabortTransaction·½·¨£¬ÔÚ·¢ËÍEndTxnRequest֮ǰֱ½Ó½«µ±Ç°BufferÖеÄÊÂÎñÐÔÏûÏ¢£¨Èç¹ûÓУ©È«²¿¶ªÆú£¬µ«±ØÐëµÈ´ýËùÓб»·¢Ë͵«ÉÐδÊÕµ½ACKµÄÏûÏ¢·¢ËÍÍê³É¡£

ÉÏÊöµÚ¶þ²½ÊÇʵÏÖ½«Ò»×é¶Á²Ù×÷Óëд²Ù×÷×÷Ϊһ¸öÊÂÎñ´¦ÀíµÄ¹Ø¼ü¡£ÒòΪ PRODUCER дÈëµÄÊý¾ÝTopicÒÔ¼°¼Ç¼Comsumer OffsetµÄTopic»á±»Ð´ÈëÏàͬµÄTransactin Marker£¬ËùÒÔÕâÒ»×é¶Á²Ù×÷Óëд²Ù×÷Ҫôȫ²¿COMMITҪôȫ²¿ABORT¡£

WriteTxnMarkerRequest

ÉÏÃæÌáµ½µÄWriteTxnMarkerRequestÓÉ Transaction Coordinator·¢Ë͸øµ±Ç°ÊÂÎñÉæ¼°µ½µÄÿ¸ö<Topic, Partition>µÄLeader¡£ÊÕµ½¸ÃÇëÇóºó£¬¶ÔÓ¦µÄLeader»á½«¶ÔÓ¦µÄCOMMIT(PID)»òÕßABORT(PID)¿ØÖÆÐÅϢдÈëÈÕÖ¾£¬ÈçÉÏͼÖв½Öè5.2Ëùʾ¡£

¸Ã¿ØÖÆÏûÏ¢ÏòBrokerÒÔ¼°Consumer±íÃ÷¶ÔÓ¦PIDµÄÏûÏ¢±»CommitÁË»¹ÊDZ»AbortÁË¡£

ÕâÀïҪעÒ⣬Èç¹ûÊÂÎñÒ²Éæ¼°µ½__consumer_offsets£¬¼´¸ÃÊÂÎñÖÐÓÐÏû·ÑÊý¾ÝµÄ²Ù×÷ÇÒ½«¸ÃÏû·ÑµÄOffset´æÓÚ__consumer_offsetsÖУ¬Transaction CoordinatorÒ²ÐèÒªÏò¸ÃÄÚ²¿TopicµÄ¸÷PartitionµÄLeader·¢ËÍWriteTxnMarkerRequest´Ó¶øÐ´ÈëCOMMIT(PID)»òCOMMIT(PID)¿ØÖÆÐÅÏ¢¡£

дÈë×îÖÕµÄCOMPLETE_COMMIT»òCOMPLETE_ABORTÏûÏ¢

дÍêËùÓÐµÄ Transaction Markerºó£¬Transaction Coordinator»á½«×îÖÕµÄCOMPLETE_COMMIT»òCOMPLETE_ABORTÏûϢдÈëTransaction LogÖÐÒÔ±êÃ÷¸ÃÊÂÎñ½áÊø£¬ÈçÉÏͼÖв½Öè5.3Ëùʾ¡£

´Ëʱ£¬Transaction LogÖÐËùÓйØÓÚ¸ÃÊÂÎñµÄÏûϢȫ²¿¿ÉÒÔÒÆ³ý¡£µ±È»£¬ÓÉÓÚKafkaÄÚÊý¾ÝÊÇAppend OnlyµÄ£¬²»¿ÉÖ±½Ó¸üкÍɾ³ý£¬ÕâÀï˵µÄÒÆ³ýÖ»Êǽ«Æä±ê¼ÇΪnull´Ó¶øÔÚLog Compactʱ²»ÔÙ±£Áô¡£

ÁíÍ⣬COMPLETE_COMMIT»òCOMPLETE_ABORTµÄдÈë²¢²»ÐèÒªµÃµ½ËùÓÐRreplicaµÄACK£¬ÒòΪÈç¹û¸ÃÏûÏ¢¶ªÊ§£¬¿ÉÒÔ¸ù¾ÝÊÂÎñЭÒéÖØ·¢¡£

²¹³ä˵Ã÷£¬Èç¹û²ÎÓë¸ÃÊÂÎñµÄijЩ<Topic, Partition>ÔÚ±»Ð´Èë Transaction Markerǰ²»¿ÉÓã¬Ëü¶ÔREAD_COMMITTEDµÄConsumer²»¿É¼û£¬µ«²»Ó°ÏìÆäËü¿ÉÓÃ<Topic, Partition>µÄCOMMIT»òABORT¡£ÔÚ¸Ã<Topic, Partition>»Ö¸´¿ÉÓúó£¬Transaction Coordinator»áÖØÐ¸ù¾ÝPREPARE_COMMIT»òPREPARE_ABORTÏò¸Ã<Topic, Partition>·¢ËÍ Transaction Marker¡£

×ܽá

1.PIDÓëSequence NumberµÄÒýÈëʵÏÖÁËд²Ù×÷µÄÃݵÈÐÔ

2.д²Ù×÷µÄÃݵÈÐÔ½áºÏAt Least OnceÓïÒåʵÏÖÁ˵¥Ò»SessionÄÚµÄExactly OnceÓïÒå

3.Transaction MarkerÓëPIDÌṩÁËʶ±ðÏûÏ¢ÊÇ·ñÓ¦¸Ã±»¶ÁÈ¡µÄÄÜÁ¦£¬´Ó¶øÊµÏÖÁËÊÂÎñµÄ¸ôÀëÐÔ

4.OffsetµÄ¸üбê¼ÇÁËÏûÏ¢ÊÇ·ñ±»¶ÁÈ¡£¬´Ó¶ø½«¶Ô¶Á²Ù×÷µÄÊÂÎñ´¦Àíת»»³ÉÁ˶Ôд£¨Offset£©²Ù×÷µÄÊÂÎñ´¦Àí

5.KafkaÊÂÎñµÄ±¾ÖÊÊÇ£¬½«Ò»×éд²Ù×÷£¨Èç¹ûÓУ©¶ÔÓ¦µÄÏûÏ¢ÓëÒ»×é¶Á²Ù×÷£¨Èç¹ûÓУ©¶ÔÓ¦µÄOffsetµÄ¸üнøÐÐͬÑùµÄ±ê¼Ç£¨¼´Transaction Marker£©À´ÊµÏÖÊÂÎñÖÐÉæ¼°µÄËùÓжÁд²Ù×÷ͬʱ¶ÔÍâ¿É¼û»òͬʱ¶ÔÍâ²»¿É¼û

6.KafkaÖ»Ìṩ¶ÔKafka±¾ÉíµÄ¶Áд²Ù×÷µÄÊÂÎñÐÔ£¬²»Ìṩ°üº¬ÍⲿϵͳµÄÊÂÎñÐÔ

Exception´¦Àí

Invalid PRODUCER Epoch

ÕâÊÇÒ»ÖÖFatal Error£¬Ëü˵Ã÷µ±Ç° PRODUCER ÊÇÒ»¸ö¹ýÆÚµÄʵÀý£¬ÓÐTransaction IDÏàͬµ«epoch¸üÐ嵀 PRODUCER ʵÀý±»´´½¨²¢Ê¹ÓᣴËʱ PRODUCER »áÍ£Ö¹²¢Å׳öException¡£

InvalidPidMapping

Transaction CoordinatorûÓÐÓë¸Ã Transaction ID¶ÔÓ¦µÄPID¡£´Ëʱ PRODUCER »áͨ¹ý°üº¬ÓÐTransaction IDµÄInitPidRequestÇëÇó´´½¨Ò»¸öеÄPID¡£

NotCorrdinatorForGTransactionalId

¸ÃTransaction Coordinator²»¸ºÔð¸Ãµ±Ç°ÊÂÎñ¡£ PRODUCER »áͨ¹ýFindCoordinatorRequestÇëÇóÖØÐÂѰÕÒ¶ÔÓ¦µÄTransaction Coordinator¡£

InvalidTxnRequest

Î¥·´ÁËÊÂÎñЭÒé¡£ÕýÈ·µÄClientʵÏÖ²»Ó¦¸Ã³öÏÖÕâÖÖException¡£Èç¹û¸ÃÒì³£·¢ÉúÁË£¬Óû§ÐèÒª¼ì²é×Ô¼ºµÄ¿Í»§¶ËʵÏÖÊÇ·ñÓÐÎÊÌâ¡£

CoordinatorNotAvailable

Transaction CoordinatorÈÔÔÚ³õʼ»¯ÖС£ PRODUCER Ö»ÐèÒªÖØÊÔ¼´¿É¡£

DuplicateSequenceNumber

·¢Ë͵ÄÏûÏ¢µÄÐòºÅµÍÓÚBrokerÔ¤ÆÚ¡£¸ÃÒ쳣˵Ã÷¸ÃÏûÏ¢ÒѾ­±»³É¹¦´¦Àí¹ý£¬ PRODUCER ¿ÉÒÔÖ±½ÓºöÂÔ¸ÃÒì³£²¢´¦ÀíÏÂÒ»ÌõÏûÏ¢

InvalidSequenceNumber

ÕâÊÇÒ»¸öFatal Error£¬Ëü˵Ã÷·¢Ë͵ÄÏûÏ¢ÖеÄÐòºÅ´óÓÚBrokerÔ¤ÆÚ¡£´ËʱÓÐÁ½ÖÖ¿ÉÄÜ

Êý¾ÝÂÒÐò¡£±ÈÈçÇ°ÃæµÄÏûÏ¢·¢ËÍʧ°ÜºóÖØÊÔÆÚ¼ä£¬ÐµÄÏûÏ¢±»½ÓÊÕ¡£Õý³£Çé¿öϲ»Ó¦¸Ã³öÏÖ¸ÃÎÊÌ⣬ÒòΪµ±Ãݵȷ¢ËÍÆôÓÃʱ£¬max.inflight.requests.per.connection±»Ç¿ÖÆÉèÖÃΪ1£¬¶øacks±»Ç¿ÖÆÉèÖÃΪall¡£¹ÊÇ°ÃæÏûÏ¢ÖØÊÔÆÚ¼ä£¬ºóÐøÏûÏ¢²»»á±»·¢ËÍ£¬Ò²¼´²»»á·¢ÉúÂÒÐò¡£²¢ÇÒÖ»ÓÐISRÖÐËùÓÐReplica¶¼ACK£¬ PRODUCER ²Å»áÈÏΪÏûÏ¢ÒѾ­±»·¢ËÍ£¬Ò²¼´²»´æÔÚBroker¶ËÊý¾Ý¶ªÊ§ÎÊÌâ¡£

·þÎñÆ÷ÓÉÓÚÈÕÖ¾±»Truncate¶øÔì³ÉÊý¾Ý¶ªÊ§¡£´ËʱӦ¸ÃÍ£Ö¹ PRODUCER ²¢½«´ËFatal Error±¨¸æ¸øÓû§¡£

InvalidTransactionTimeout

InitPidRequestµ÷ÓóöÏÖµÄFatal Error¡£Ëü±íÃ÷ PRODUCER ´«ÈëµÄtimeoutʱ¼ä²»ÔڿɽÓÊÜ·¶Î§ÄÚ£¬Ó¦¸ÃÍ£Ö¹ PRODUCER ²¢±¨¸æ¸øÓû§¡£

´¦ÀíTransaction Coordinatorʧ°Ü

дPREPARE_COMMIT/PREPARE_ABORTǰʧ°Ü

PRODUCER ͨ¹ýFindCoordinatorRequestÕÒµ½ÐµÄTransaction Coordinator£¬²¢Í¨¹ýEndTxnRequestÇëÇ󷢯ðCOMMIT»òABORTÁ÷³Ì£¬ÐµÄTransaction Coordinator¼ÌÐø´¦ÀíEndTxnRequestÇëÇ󡪡ªÐ´PREPARE_COMMIT»òPREPARE_ABORT£¬Ð´Transaction Marker£¬Ð´COMPLETE_COMMIT»òCOMPLETE_ABORT¡£

дÍêPREPARE_COMMIT/PREPARE_ABORTºóʧ°Ü

´Ëʱ¾ÉµÄTransaction Coordinator¿ÉÄÜÒѾ­³É¹¦Ð´È벿·ÖTransaction Marker¡£ÐµÄTransaction Coordinator»áÖØ¸´ÕâЩ²Ù×÷£¬ËùÒÔ²¿·ÖPartitionÖпÉÄÜ»á´æÔÚÖØ¸´µÄCOMMIT»òABORT£¬µ«Ö»Òª¸Ã PRODUCER ÔÚ´ËÆÚ¼äûÓз¢ÆðеÄÊÂÎñ£¬ÕâÐ©ÖØ¸´µÄTransaction Marker¾Í²»ÊÇÎÊÌâ¡£

дÍêCOMPLETE_COMMIT/ABORTºóʧ°Ü

¾ÉµÄTransaction Coordinator¿ÉÄÜÒѾ­Ð´ÍêÁËCOMPLETE_COMMIT»òCOMPLETE_ABORTµ«ÔÚ·µ»ØEndTxnRequest֮ǰʧ°Ü¡£¸Ã³¡¾°Ï£¬ÐµÄTransaction Coordinator»áÖ±½Ó¸ø PRODUCER ·µ»Ø³É¹¦¡£

ÊÂÎñ¹ýÆÚ»úÖÆ

ÊÂÎñ³¬Ê±

transaction.timeout.ms

ÖÕÖ¹¹ýÆÚÊÂÎñ

µ± PRODUCER ʧ°Üʱ£¬Transaction Coordinator±ØÐëÄܹ»Ö÷¶¯µÄÈÃijЩ½øÐÐÖеÄÊÂÎñ¹ýÆÚ¡£·ñÔòûÓÐ PRODUCER µÄ²ÎÓ룬Transaction CoordinatorÎÞ·¨ÅжÏÕâЩÊÂÎñÓ¦¸ÃÈçºÎ´¦Àí£¬Õâ»áÔì³É£º

1.Èç¹ûÕâÖÖ½øÐÐÖÐÊÂÎñÌ«¶à£¬»áÔì³ÉTransaction CoordinatorÐèҪά»¤´óÁ¿µÄÊÂÎñ״̬£¬´óÁ¿Õ¼ÓÃÄÚ´æ

2.Transaction LogÄÚÒ²»á´æÔÚ´óÁ¿Êý¾Ý£¬Ôì³ÉеÄTransaction CoordinatorÆô¶¯»ºÂý

3.READ_COMMITTEDµÄConsumerÐèÒª»º´æ´óÁ¿µÄÏûÏ¢£¬Ôì³É²»±ØÒªµÄÄÚ´æÀË·ÑÉõÖÁÊÇOOM

Èç¹û¶à¸öTransaction ID²»Í¬µÄ PRODUCER ½»²æÐ´Í¬Ò»¸öPartition£¬µ±Ò»¸ö PRODUCER µÄÊÂÎñ״̬²»¸üÐÂʱ£¬READ_COMMITTEDµÄConsumerΪÁ˱£Ö¤Ë³ÐòÏû·Ñ¶ø±»×èÈû

5.ΪÁ˱ÜÃâÉÏÊöÎÊÌ⣬Transaction Coordinator»áÖÜÆÚÐÔ±éÀúÄÚ´æÖеÄÊÂÎñ״̬Map£¬²¢Ö´ÐÐÈçϲÙ×÷

1.Èç¹û״̬ÊÇBEGIN²¢ÇÒÆä×îºó¸üÐÂʱ¼äÓ뵱ǰʱ¼ä²î´óÓÚtransaction.remove.expired.transaction.cleanup.interval.ms£¨Ä¬ÈÏֵΪ1Сʱ£©£¬ÔòÖ÷¶¯½«ÆäÖÕÖ¹£º1£©Î´±ÜÃâÔ­ PRODUCER ÁÙʱ»Ö¸´Ó뵱ǰÖÕÖ¹Á÷³Ì³åÍ»£¬Ôö¼Ó¸Ã PRODUCER ¶ÔÓ¦µÄPIDµÄepoch£¬²¢È·±£½«¸Ã¸üеÄÐÅϢдÈëTransaction Log£»2£©ÒÔ¸üкóµÄepoch»Ø¹öÊÂÎñ£¬´Ó¶øÊ¹µÃ¸ÃÊÂÎñÏà¹ØµÄËùÓÐBroker¶¼¸üÐ宊ȼ´æµÄ¸ÃPIDµÄepoch´Ó¶ø¾Ü¾ø¾É PRODUCER µÄд²Ù×÷

2.Èç¹û״̬ÊÇPREPARE_COMMIT£¬Íê³ÉºóÐøµÄCOMMITÁ÷³Ì¡ª¡ª¡ª¡ªÏò¸÷<Topic, Partition>дÈëTransaction Marker£¬ÔÚTransaction LogÄÚдÈëCOMPLETE_COMMIT

3.Èç¹û״̬ÊÇPREPARE_ABORT£¬Íê³ÉºóÐøABORTÁ÷³Ì

ÖÕÖ¹Transaction ID

ijTransaction IDµÄ PRODUCER ¿ÉÄܺܳ¤Ê±¼ä²»ÔÙ·¢ËÍÊý¾Ý£¬Transaction Coordinatorû±ØÒªÔÙ±£´æ¸ÃTransaction IDÓëPIDµÈµÄÓ³É䣬·ñÔò¿ÉÄÜ»áÔì³É´óÁ¿µÄ×ÊÔ´ÀË·Ñ¡£Òò´ËÐèÒªÓÐÒ»¸ö»úÖÆÌ½²â²»ÔÙ»îÔ¾µÄTransaction ID²¢½«ÆäÐÅϢɾ³ý¡£

Transaction Coordinator»áÖÜÆÚÐÔ±éÀúÄÚ´æÖеÄTransaction IDÓëPIDÓ³É䣬Èç¹ûijTransaction IDûÓжÔÓ¦µÄÕýÔÚ½øÐÐÖеÄÊÂÎñ²¢ÇÒËü¶ÔÓ¦µÄ×îºóÒ»¸öÊÂÎñµÄ½áÊøÊ±¼äÓ뵱ǰʱ¼ä²î´óÓÚtransactional.id.expiration.ms£¨Ä¬ÈÏÖµÊÇ7Ì죩£¬Ôò½«Æä´ÓÄÚ´æÖÐɾ³ý²¢ÔÚTransaction LogÖн«Æä¶ÔÓ¦µÄÈÕÖ¾µÄÖµÉèÖÃΪnull´Ó¶øÊ¹µÃLog Compact¿É½«Æä¼Ç¼ɾ³ý¡£

ÓëÆäËüϵͳÊÂÎñ»úÖÆ¶Ô±È

PostgreSQL MVCC

KafkaµÄÊÂÎñ»úÖÆÓë¡¶MVCC PostgreSQLʵÏÖÊÂÎñºÍ¶à°æ±¾²¢·¢¿ØÖƵľ«»ª¡·Ò»ÎÄÖнéÉܵÄPostgreSQLͨ¹ýMVCCʵÏÖÊÂÎñµÄ»úÖÆ·Ç³£ÀàËÆ£¬¶ÔÓÚÊÂÎñµÄ»Ø¹ö£¬²¢²»ÐèҪɾ³ýÒÑдÈëµÄÊý¾Ý£¬¶¼Êǽ«Ð´ÈëÊý¾ÝµÄÊÂÎñ±ê¼ÇΪRollback/Abort´Ó¶øÔÚ¶ÁÊý¾Ýʱ¹ýÂ˸ÃÊý¾Ý¡£

Á½½×¶ÎÌá½»

KafkaµÄÊÂÎñ»úÖÆÓë¡¶·Ö²¼Ê½ÊÂÎñ£¨Ò»£©Á½½×¶ÎÌá½»¼°JTA¡·Ò»ÎÄÖÐËù½éÉܵÄÁ½½×¶ÎÌá½»»úÖÆ¿´ËÆÏàËÆ£¬¶¼·ÖPREPARE½×¶ÎºÍ×îÖÕCOMMIT½×¶Î£¬µ«ÓÖÓкܴó²»Í¬

1.KafkaÊÂÎñ»úÖÆÖУ¬PREPAREʱ¼´ÒªÖ¸Ã÷ÊÇPREPARE_COMMIT»¹ÊÇPREPARE_ABORT£¬²¢ÇÒÖ»ÐëÔÚTransaction LogÖбê¼Ç¼´¿É£¬ÎÞÐëÆäËü×é¼þ²ÎÓë¡£¶øÁ½½×¶ÎÌá½»µÄPREPAREÐèÒª·¢Ë͸øËùÓеķֲ¼Ê½ÊÂÎñ²ÎÓë·½£¬²¢ÇÒÊÂÎñ²ÎÓë·½ÐèÒª¾¡¿ÉÄÜ×¼±¸ºÃ£¬²¢¸ù¾Ý×¼±¸Çé¿ö·µ»ØPrepared»òNon-Prepared״̬¸øÊÂÎñ¹ÜÀíÆ÷¡£

2.KafkaÊÂÎñÖУ¬Ò»µ«·¢ÆðPREPARE_COMMIT»òPREPARE_ABORT£¬ÔòÈ·¶¨¸ÃÊÂÎñ×îÖյĽá¹ûÓ¦¸ÃÊDZ»COMMIT»òABORT¡£¶ø·Ö²¼Ê½ÊÂÎñÖУ¬PREPAREºóÓɸ÷ÊÂÎñ²ÎÓë·½·µ»Ø×´Ì¬£¬Ö»ÓÐËùÓвÎÓë·½¾ù·µ»ØPrepared״̬²Å»áÕæÕýÖ´ÐÐCOMMIT£¬·ñÔòÖ´ÐÐROLLBACK

3.KafkaÊÂÎñ»úÖÆÖУ¬Ä³¼¸¸öPartitionÔÚCOMMIT»òABORT¹ý³ÌÖбäΪ²»¿ÉÓã¬Ö»Ó°Ïì¸ÃPartition²»Ó°ÏìÆäËüPartition¡£Á½½×¶ÎÌá½»ÖУ¬ÈôΨһÊÕµ½COMMITÃüÁî²ÎÓëÕßCrash£¬ÆäËüÊÂÎñ²ÎÓë·½ÎÞ·¨ÅжÏÊÂÎñ״̬´Ó¶øÊ¹µÃÕû¸öÊÂÎñ×èÈû

4.KafkaÊÂÎñ»úÖÆÒýÈëÊÂÎñ³¬Ê±»úÖÆ£¬ÓÐЧ±ÜÃâÁË¹ÒÆðµÄÊÂÎñÓ°ÏìÆäËüÊÂÎñµÄÎÊÌâ

5.KafkaÊÂÎñ»úÖÆÖдæÔÚ¶à¸öTransaction CoordinatorʵÀý£¬¶ø·Ö²¼Ê½ÊÂÎñÖÐÖ»ÓÐÒ»¸öÊÂÎñ¹ÜÀíÆ÷

Zookeeper

ZookeeperµÄÔ­×ӹ㲥ЭÒéÓëÁ½½×¶ÎÌá½»ÒÔ¼°KafkaÊÂÎñ»úÖÆÓÐÏàËÆÖ®´¦£¬µ«ÓÖÓи÷×ÔµÄÌØµã

1.KafkaÊÂÎñ¿ÉCOMMITÒ²¿ÉABORT¡£¶øZookeeperÔ­×ӹ㲥ЭÒéÖ»ÓÐCOMMITûÓÐABORT¡£µ±È»£¬Zookeeper²»COMMITijÏûÏ¢Ò²¼´µÈЧÓÚABORT¸ÃÏûÏ¢µÄ¸üС£

2.Kafka´æÔÚ¶à¸öTransaction CoordinatorʵÀý£¬À©Õ¹ÐԽϺ᣶øZookeeperд²Ù×÷Ö»ÄÜÔÚLeader½Úµã½øÐУ¬ËùÒÔÆäдÐÔÄÜÔ¶µÍÓÚ¶ÁÐÔÄÜ¡£

3.KafkaÊÂÎñÊÇCOMMIT»¹ÊÇABORTÍêȫȡ¾öÓÚ PRODUCER ¼´¿Í»§¶Ë¡£¶øZookeeperÔ­×ӹ㲥ЭÒéÖÐijÌõÏûÏ¢ÊÇ·ñ±»COMMITÈ¡¾öÓÚÊÇ·ñÓÐÒ»´ó°ëFOLLOWER ACK¸ÃÏûÏ¢¡£

 

 

   
2408 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ