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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
KafkaÉè¼Æ½âÎö£¨Ò»£©- Kafka±³¾°¼°¼Ü¹¹½éÉÜ
 
À´Ô´£º¼¼ÊõÊÀ½ç ·¢²¼ÓÚ£º2017-9-18
  3444  次浏览      29
 

ÕªÒª

KafkaÊÇÓÉLinkedIn¿ª·¢²¢¿ªÔ´µÄ·Ö²¼Ê½ÏûϢϵͳ£¬ÒòÆä·Ö²¼Ê½¼°¸ßÍÌÍÂÂʶø±»¹ã·ºÊ¹Óã¬ÏÖÒÑÓëCloudera Hadoop£¬Apache Storm£¬Apache Spark¼¯³É¡£±¾ÎĽéÉÜÁËKafkaµÄ´´½¨±³¾°£¬Éè¼ÆÄ¿±ê£¬Ê¹ÓÃÏûϢϵͳµÄÓÅÊÆÒÔ¼°Ä¿Ç°Á÷ÐеÄÏûϢϵͳ¶Ô±È¡£²¢½éÉÜÁËKafkaµÄ¼Ü¹¹£¬ProducerÏûϢ·ÓÉ£¬Consumer GroupÒÔ¼°ÓÉÆäʵÏֵIJ»Í¬ÏûÏ¢·Ö·¢·½Ê½£¬Topic & Partition£¬×îºó½éÉÜÁËKafka ConsumerΪºÎʹÓÃpullģʽÒÔ¼°KafkaÌṩµÄÈýÖÖdelivery guarantee¡£

±³¾°½éÉÜ

Kafka´´½¨±³¾°

KafkaÊÇÒ»¸öÏûϢϵͳ£¬Ô­±¾¿ª·¢×ÔLinkedIn£¬ÓÃ×÷LinkedInµÄ»î¶¯Á÷£¨Activity Stream£©ºÍÔËÓªÊý¾Ý´¦Àí¹ÜµÀ£¨Pipeline£©µÄ»ù´¡¡£ÏÖÔÚËüÒѱ»¶à¼Ò²»Í¬ÀàÐ͵Ĺ«Ë¾ ×÷Ϊ¶àÖÖÀàÐ͵ÄÊý¾Ý¹ÜµÀºÍÏûϢϵͳʹÓá£

»î¶¯Á÷Êý¾ÝÊǼ¸ºõËùÓÐÕ¾µãÔÚ¶ÔÆäÍøÕ¾Ê¹ÓÃÇé¿ö×ö±¨±íʱ¶¼ÒªÓõ½µÄÊý¾ÝÖÐ×î³£¹æµÄ²¿·Ö¡£»î¶¯Êý¾Ý°üÀ¨Ò³Ãæ·ÃÎÊÁ¿£¨Page View£©¡¢±»²é¿´ÄÚÈÝ·½ÃæµÄÐÅÏ¢ÒÔ¼°ËÑË÷Çé¿öµÈÄÚÈÝ¡£ÕâÖÖÊý¾Ýͨ³£µÄ´¦Àí·½Ê½ÊÇÏȰѸ÷ÖֻÒÔÈÕÖ¾µÄÐÎʽдÈëijÖÖÎļþ£¬È»ºóÖÜÆÚÐԵضÔÕâЩÎļþ½øÐÐͳ¼Æ·ÖÎö¡£ÔËÓªÊý¾ÝÖ¸µÄÊÇ·þÎñÆ÷µÄÐÔÄÜÊý¾Ý£¨CPU¡¢IOʹÓÃÂÊ¡¢ÇëÇóʱ¼ä¡¢·þÎñÈÕÖ¾µÈµÈÊý¾Ý)¡£ÔËÓªÊý¾ÝµÄͳ¼Æ·½·¨ÖÖÀà·±¶à¡£

½üÄêÀ´£¬»î¶¯ºÍÔËÓªÊý¾Ý´¦ÀíÒѾ­³ÉΪÁËÍøÕ¾Èí¼þ²úÆ·ÌØÐÔÖÐÒ»¸öÖÁ¹ØÖØÒªµÄ×é³É²¿·Ö£¬Õâ¾ÍÐèÒªÒ»Ì×ÉÔ΢¸ü¼Ó¸´ÔӵĻù´¡ÉèÊ©¶ÔÆäÌṩ֧³Ö¡£ ¡¡¡¡

Kafka¼ò½é

KafkaÊÇÒ»ÖÖ·Ö²¼Ê½µÄ£¬»ùÓÚ·¢²¼/¶©ÔĵÄÏûϢϵͳ¡£Ö÷ÒªÉè¼ÆÄ¿±êÈçÏ£º

ÒÔʱ¼ä¸´ÔÓ¶ÈΪO(1)µÄ·½Ê½ÌṩÏûÏ¢³Ö¾Ã»¯ÄÜÁ¦£¬¼´Ê¹¶ÔTB¼¶ÒÔÉÏÊý¾ÝÒ²Äܱ£Ö¤³£Êýʱ¼ä¸´ÔӶȵķÃÎÊÐÔÄÜ

¸ßÍÌÍÂÂÊ¡£¼´Ê¹Ôڷdz£Á®¼ÛµÄÉÌÓûúÆ÷ÉÏÒ²ÄÜ×öµ½µ¥»úÖ§³ÖÿÃë100KÌõÒÔÉÏÏûÏ¢µÄ´«Êä

Ö§³ÖKafka Server¼äµÄÏûÏ¢·ÖÇø£¬¼°·Ö²¼Ê½Ïû·Ñ£¬Í¬Ê±±£Ö¤Ã¿¸öPartitionÄÚµÄÏûϢ˳Ðò´«Êä

ͬʱ֧³ÖÀëÏßÊý¾Ý´¦ÀíºÍʵʱÊý¾Ý´¦Àí

Scale out£ºÖ§³ÖÔÚÏßˮƽÀ©Õ¹

ΪºÎʹÓÃÏûϢϵͳ

½âñî

ÔÚÏîÄ¿Æô¶¯Ö®³õÀ´Ô¤²â½«À´ÏîÄ¿»áÅöµ½Ê²Ã´ÐèÇó£¬ÊǼ«ÆäÀ§Äѵġ£ÏûϢϵͳÔÚ´¦Àí¹ý³ÌÖмä²åÈëÁËÒ»¸öÒþº¬µÄ¡¢»ùÓÚÊý¾ÝµÄ½Ó¿Ú²ã£¬Á½±ßµÄ´¦Àí¹ý³Ì¶¼ÒªÊµÏÖÕâÒ»½Ó¿Ú¡£ÕâÔÊÐíÄã¶ÀÁ¢µÄÀ©Õ¹»òÐÞ¸ÄÁ½±ßµÄ´¦Àí¹ý³Ì£¬Ö»ÒªÈ·±£ËüÃÇ×ñÊØÍ¬ÑùµÄ½Ó¿ÚÔ¼Êø¡£

ÈßÓà

ÓÐЩÇé¿öÏ£¬´¦ÀíÊý¾ÝµÄ¹ý³Ì»áʧ°Ü¡£³ý·ÇÊý¾Ý±»³Ö¾Ã»¯£¬·ñÔò½«Ôì³É¶ªÊ§¡£ÏûÏ¢¶ÓÁаÑÊý¾Ý½øÐг־û¯Ö±µ½ËüÃÇÒѾ­±»ÍêÈ«´¦Àí£¬Í¨¹ýÕâÒ»·½Ê½¹æ±ÜÁËÊý¾Ý¶ªÊ§·çÏÕ¡£Ðí¶àÏûÏ¢¶ÓÁÐËù²ÉÓõġ±²åÈë-»ñÈ¡-ɾ³ý¡±·¶Ê½ÖУ¬ÔÚ°ÑÒ»¸öÏûÏ¢´Ó¶ÓÁÐÖÐɾ³ý֮ǰ£¬ÐèÒªÄãµÄ´¦ÀíϵͳÃ÷È·µÄÖ¸³ö¸ÃÏûÏ¢ÒѾ­±»´¦ÀíÍê±Ï£¬´Ó¶øÈ·±£ÄãµÄÊý¾Ý±»°²È«µÄ±£´æÖ±µ½ÄãʹÓÃÍê±Ï¡£

À©Õ¹ÐÔ

ÒòΪÏûÏ¢¶ÓÁнâñîÁËÄãµÄ´¦Àí¹ý³Ì£¬ËùÒÔÔö´óÏûÏ¢Èë¶ÓºÍ´¦ÀíµÄƵÂÊÊǺÜÈÝÒ׵ģ¬Ö»ÒªÁíÍâÔö¼Ó´¦Àí¹ý³Ì¼´¿É¡£²»ÐèÒª¸Ä±ä´úÂë¡¢²»ÐèÒªµ÷½Ú²ÎÊý¡£À©Õ¹¾ÍÏñµ÷´óµçÁ¦°´Å¥Ò»Ñù¼òµ¥¡£

Áé»îÐÔ & ·åÖµ´¦ÀíÄÜÁ¦

ÔÚ·ÃÎÊÁ¿¾çÔöµÄÇé¿öÏ£¬Ó¦ÓÃÈÔÈ»ÐèÒª¼ÌÐø·¢»Ó×÷Ó㬵«ÊÇÕâÑùµÄÍ»·¢Á÷Á¿²¢²»³£¼û£»Èç¹ûΪÒÔÄÜ´¦ÀíÕâÀà·åÖµ·ÃÎÊΪ±ê×¼À´Í¶Èë×ÊÔ´ËæÊ±´ýÃüÎÞÒÉÊǾ޴óµÄÀË·Ñ¡£Ê¹ÓÃÏûÏ¢¶ÓÁÐÄܹ»Ê¹¹Ø¼ü×é¼þ¶¥×¡Í»·¢µÄ·ÃÎÊѹÁ¦£¬¶ø²»»áÒòΪͻ·¢µÄ³¬¸ººÉµÄÇëÇó¶øÍêÈ«±ÀÀ£¡£

¿É»Ö¸´ÐÔ

ϵͳµÄÒ»²¿·Ö×é¼þʧЧʱ£¬²»»áÓ°Ïìµ½Õû¸öϵͳ¡£ÏûÏ¢¶ÓÁнµµÍÁ˽ø³Ì¼äµÄñîºÏ¶È£¬ËùÒÔ¼´Ê¹Ò»¸ö´¦ÀíÏûÏ¢µÄ½ø³Ì¹Òµô£¬¼ÓÈë¶ÓÁÐÖеÄÏûÏ¢ÈÔÈ»¿ÉÒÔÔÚϵͳ»Ö¸´ºó±»´¦Àí¡£

˳Ðò±£Ö¤

ÔÚ´ó¶àʹÓó¡¾°Ï£¬Êý¾Ý´¦ÀíµÄ˳Ðò¶¼ºÜÖØÒª¡£´ó²¿·ÖÏûÏ¢¶ÓÁб¾À´¾ÍÊÇÅÅÐòµÄ£¬²¢ÇÒÄܱ£Ö¤Êý¾Ý»á°´ÕÕÌØ¶¨µÄ˳ÐòÀ´´¦Àí¡£Kafka±£Ö¤Ò»¸öPartitionÄÚµÄÏûÏ¢µÄÓÐÐòÐÔ¡£

»º³å

ÔÚÈκÎÖØÒªµÄϵͳÖУ¬¶¼»áÓÐÐèÒª²»Í¬µÄ´¦Àíʱ¼äµÄÔªËØ¡£ÀýÈ磬¼ÓÔØÒ»ÕÅͼƬ±ÈÓ¦ÓùýÂËÆ÷»¨·Ñ¸üÉÙµÄʱ¼ä¡£ÏûÏ¢¶ÓÁÐͨ¹ýÒ»¸ö»º³å²ãÀ´°ïÖúÈÎÎñ×î¸ßЧÂʵÄÖ´ÐСª¡ª¡ªÐ´Èë¶ÓÁеĴ¦Àí»á¾¡¿ÉÄܵĿìËÙ¡£¸Ã»º³åÓÐÖúÓÚ¿ØÖƺÍÓÅ»¯Êý¾ÝÁ÷¾­¹ýϵͳµÄËÙ¶È¡£

Ò첽ͨÐÅ

ºÜ¶àʱºò£¬Óû§²»ÏëÒ²²»ÐèÒªÁ¢¼´´¦ÀíÏûÏ¢¡£ÏûÏ¢¶ÓÁÐÌṩÁËÒì²½´¦Àí»úÖÆ£¬ÔÊÐíÓû§°ÑÒ»¸öÏûÏ¢·ÅÈë¶ÓÁУ¬µ«²¢²»Á¢¼´´¦ÀíËü¡£ÏëÏò¶ÓÁÐÖзÅÈë¶àÉÙÏûÏ¢¾Í·Å¶àÉÙ£¬È»ºóÔÚÐèÒªµÄʱºòÔÙÈ¥´¦ÀíËüÃÇ¡£

³£ÓÃMessage Queue¶Ô±È

RabbitMQ

RabbitMQÊÇʹÓÃErlang±àдµÄÒ»¸ö¿ªÔ´µÄÏûÏ¢¶ÓÁУ¬±¾ÉíÖ§³ÖºÜ¶àµÄЭÒ飺AMQP£¬XMPP, SMTP, STOMP£¬Ò²ÕýÒòÈç´Ë£¬Ëü·Ç³£ÖØÁ¿¼¶£¬¸üÊʺÏÓÚÆóÒµ¼¶µÄ¿ª·¢¡£Í¬Ê±ÊµÏÖÁËBroker¹¹¼Ü£¬ÕâÒâζ×ÅÏûÏ¢ÔÚ·¢Ë͸ø¿Í»§¶ËʱÏÈÔÚÖÐÐĶÓÁÐÅŶӡ£¶Ô·ÓÉ£¬¸ºÔؾùºâ»òÕßÊý¾Ý³Ö¾Ã»¯¶¼ÓкܺõÄÖ§³Ö¡£

Redis

RedisÊÇÒ»¸ö»ùÓÚKey-Value¶ÔµÄNoSQLÊý¾Ý¿â£¬¿ª·¢Î¬»¤ºÜ»îÔ¾¡£ËäÈ»ËüÊÇÒ»¸öKey-ValueÊý¾Ý¿â´æ´¢ÏµÍ³£¬µ«Ëü±¾ÉíÖ§³ÖMQ¹¦ÄÜ£¬ËùÒÔÍêÈ«¿ÉÒÔµ±×öÒ»¸öÇáÁ¿¼¶µÄ¶ÓÁзþÎñÀ´Ê¹Ó᣶ÔÓÚRabbitMQºÍRedisµÄÈë¶ÓºÍ³ö¶Ó²Ù×÷£¬¸÷Ö´ÐÐ100Íò´Î£¬Ã¿10Íò´Î¼Ç¼һ´ÎÖ´ÐÐʱ¼ä¡£²âÊÔÊý¾Ý·ÖΪ128Bytes¡¢512Bytes¡¢1KºÍ10KËĸö²»Í¬´óСµÄÊý¾Ý¡£ÊµÑé±íÃ÷£ºÈë¶Óʱ£¬µ±Êý¾Ý±È½ÏСʱRedisµÄÐÔÄÜÒª¸ßÓÚRabbitMQ£¬¶øÈç¹ûÊý¾Ý´óС³¬¹ýÁË10K£¬RedisÔòÂýµÄÎÞ·¨ÈÌÊÜ£»³ö¶Óʱ£¬ÎÞÂÛÊý¾Ý´óС£¬Redis¶¼±íÏÖ³ö·Ç³£ºÃµÄÐÔÄÜ£¬¶øRabbitMQµÄ³ö¶ÓÐÔÄÜÔòÔ¶µÍÓÚRedis¡£

ZeroMQ

ZeroMQºÅ³Æ×î¿ìµÄÏûÏ¢¶ÓÁÐϵͳ£¬ÓÈÆäÕë¶Ô´óÍÌÍÂÁ¿µÄÐèÇ󳡾°¡£ZMQÄܹ»ÊµÏÖRabbitMQ²»Éó¤µÄ¸ß¼¶/¸´ÔӵĶÓÁУ¬µ«ÊÇ¿ª·¢ÈËÔ±ÐèÒª×Ô¼º×éºÏ¶àÖÖ¼¼Êõ¿ò¼Ü£¬¼¼ÊõÉϵĸ´ÔÓ¶ÈÊǶÔÕâMQÄܹ»Ó¦Óóɹ¦µÄÌôÕ½¡£ZeroMQ¾ßÓÐÒ»¸ö¶ÀÌØµÄ·ÇÖмä¼þµÄģʽ£¬Äã²»ÐèÒª°²×°ºÍÔËÐÐÒ»¸öÏûÏ¢·þÎñÆ÷»òÖмä¼þ£¬ÒòΪÄãµÄÓ¦ÓóÌÐò½«°çÑÝÕâ¸ö·þÎñÆ÷½ÇÉ«¡£ÄãÖ»ÐèÒª¼òµ¥µÄÒýÓÃZeroMQ³ÌÐò¿â£¬¿ÉÒÔʹÓÃNuGet°²×°£¬È»ºóÄã¾Í¿ÉÒÔÓä¿ìµÄÔÚÓ¦ÓóÌÐòÖ®¼ä·¢ËÍÏûÏ¢ÁË¡£µ«ÊÇZeroMQ½öÌṩ·Ç³Ö¾ÃÐԵĶÓÁУ¬Ò²¾ÍÊÇ˵Èç¹ûå´»ú£¬Êý¾Ý½«»á¶ªÊ§¡£ÆäÖУ¬TwitterµÄStorm 0.9.0ÒÔǰµÄ°æ±¾ÖÐĬÈÏʹÓÃZeroMQ×÷ΪÊý¾ÝÁ÷µÄ´«Ê䣨Storm´Ó0.9°æ±¾¿ªÊ¼Í¬Ê±Ö§³ÖZeroMQºÍNetty×÷Ϊ´«ÊäÄ£¿é£©¡£

ActiveMQ

ActiveMQÊÇApacheϵÄÒ»¸ö×ÓÏîÄ¿¡£ ÀàËÆÓÚZeroMQ£¬ËüÄܹ»ÒÔ´úÀíÈ˺͵ã¶ÔµãµÄ¼¼ÊõʵÏÖ¶ÓÁС£Í¬Ê±ÀàËÆÓÚRabbitMQ£¬ËüÉÙÁ¿´úÂë¾Í¿ÉÒÔ¸ßЧµØÊµÏָ߼¶Ó¦Óó¡¾°¡£

Kafka/Jafka

KafkaÊÇApacheϵÄÒ»¸ö×ÓÏîÄ¿£¬ÊÇÒ»¸ö¸ßÐÔÄÜ¿çÓïÑÔ·Ö²¼Ê½·¢²¼/¶©ÔÄÏûÏ¢¶ÓÁÐϵͳ£¬¶øJafkaÊÇÔÚKafkaÖ®ÉÏ·õ»¯¶øÀ´µÄ£¬¼´KafkaµÄÒ»¸öÉý¼¶°æ¡£¾ßÓÐÒÔÏÂÌØÐÔ£º¿ìËٳ־û¯£¬¿ÉÒÔÔÚO(1)µÄϵͳ¿ªÏúϽøÐÐÏûÏ¢³Ö¾Ã»¯£»¸ßÍÌÍ£¬ÔÚһ̨ÆÕͨµÄ·þÎñÆ÷ÉϼȿÉÒÔ´ïµ½10W/sµÄÍÌÍÂËÙÂÊ£»ÍêÈ«µÄ·Ö²¼Ê½ÏµÍ³£¬Broker¡¢Producer¡¢Consumer¶¼Ô­Éú×Ô¶¯Ö§³Ö·Ö²¼Ê½£¬×Ô¶¯ÊµÏÖ¸ºÔؾùºâ£»Ö§³ÖHadoopÊý¾Ý²¢ÐмÓÔØ£¬¶ÔÓÚÏñHadoopµÄÒ»ÑùµÄÈÕÖ¾Êý¾ÝºÍÀëÏß·ÖÎöϵͳ£¬µ«ÓÖÒªÇóʵʱ´¦ÀíµÄÏÞÖÆ£¬ÕâÊÇÒ»¸ö¿ÉÐеĽâ¾ö·½°¸¡£Kafkaͨ¹ýHadoopµÄ²¢ÐмÓÔØ»úÖÆÍ³Ò»ÁËÔÚÏߺÍÀëÏßµÄÏûÏ¢´¦Àí¡£Apache KafkaÏà¶ÔÓÚActiveMQÊÇÒ»¸ö·Ç³£ÇáÁ¿¼¶µÄÏûϢϵͳ£¬³ýÁËÐÔÄܷdz£ºÃÖ®Í⣬»¹ÊÇÒ»¸ö¹¤×÷Á¼ºÃµÄ·Ö²¼Ê½ÏµÍ³¡£

Kafka¼Ü¹¹

Terminology

Broker

Kafka¼¯Èº°üº¬Ò»¸ö»ò¶à¸ö·þÎñÆ÷£¬ÕâÖÖ·þÎñÆ÷±»³ÆÎªbroker

Topic

ÿÌõ·¢²¼µ½Kafka¼¯ÈºµÄÏûÏ¢¶¼ÓÐÒ»¸öÀà±ð£¬Õâ¸öÀà±ð±»³ÆÎªTopic¡££¨ÎïÀíÉϲ»Í¬TopicµÄÏûÏ¢·Ö¿ª´æ´¢£¬Âß¼­ÉÏÒ»¸öTopicµÄÏûÏ¢ËäÈ»±£´æÓÚÒ»¸ö»ò¶à¸öbrokerÉϵ«Óû§Ö»ÐèÖ¸¶¨ÏûÏ¢µÄTopic¼´¿ÉÉú²ú»òÏû·ÑÊý¾Ý¶ø²»±Ø¹ØÐÄÊý¾Ý´æÓں䦣©

Partition

ParitionÊÇÎïÀíÉϵĸÅÄÿ¸öTopic°üº¬Ò»¸ö»ò¶à¸öPartition.

Producer

¸ºÔð·¢²¼ÏûÏ¢µ½Kafka broker

Consumer

ÏûÏ¢Ïû·ÑÕߣ¬ÏòKafka broker¶ÁÈ¡ÏûÏ¢µÄ¿Í»§¶Ë¡£

Consumer Group

ÿ¸öConsumerÊôÓÚÒ»¸öÌØ¶¨µÄConsumer Group£¨¿ÉΪÿ¸öConsumerÖ¸¶¨group name£¬Èô²»Ö¸¶¨group nameÔòÊôÓÚĬÈϵÄgroup£©¡£

KafkaÍØÆË½á¹¹

ÈçÉÏͼËùʾ£¬Ò»¸öµäÐ͵ÄKafka¼¯ÈºÖаüº¬Èô¸ÉProducer£¨¿ÉÒÔÊÇwebǰ¶Ë²úÉúµÄPage View£¬»òÕßÊÇ·þÎñÆ÷ÈÕÖ¾£¬ÏµÍ³CPU¡¢MemoryµÈ£©£¬Èô¸Ébroker£¨KafkaÖ§³ÖˮƽÀ©Õ¹£¬Ò»°ãbrokerÊýÁ¿Ô½¶à£¬¼¯ÈºÍÌÍÂÂÊÔ½¸ß£©£¬Èô¸ÉConsumer Group£¬ÒÔ¼°Ò»¸öZookeeper¼¯Èº¡£Kafkaͨ¹ýZookeeper¹ÜÀí¼¯ÈºÅäÖã¬Ñ¡¾Ùleader£¬ÒÔ¼°ÔÚConsumer Group·¢Éú±ä»¯Ê±½øÐÐrebalance¡£ProducerʹÓÃpushģʽ½«ÏûÏ¢·¢²¼µ½broker£¬ConsumerʹÓÃpullģʽ´Óbroker¶©ÔIJ¢Ïû·ÑÏûÏ¢¡£ ¡¡¡¡

Topic & Partition

TopicÔÚÂß¼­ÉÏ¿ÉÒÔ±»ÈÏΪÊÇÒ»¸öqueue£¬Ã¿ÌõÏû·Ñ¶¼±ØÐëÖ¸¶¨ËüµÄTopic£¬¿ÉÒÔ¼òµ¥Àí½âΪ±ØÐëÖ¸Ã÷°ÑÕâÌõÏûÏ¢·Å½øÄĸöqueueÀΪÁËʹµÃKafkaµÄÍÌÍÂÂÊ¿ÉÒÔÏßÐÔÌá¸ß£¬ÎïÀíÉϰÑTopic·Ö³ÉÒ»¸ö»ò¶à¸öPartition£¬Ã¿¸öPartitionÔÚÎïÀíÉ϶ÔÓ¦Ò»¸öÎļþ¼Ð£¬¸ÃÎļþ¼ÐÏ´洢Õâ¸öPartitionµÄËùÓÐÏûÏ¢ºÍË÷ÒýÎļþ¡£Èô´´½¨topic1ºÍtopic2Á½¸ötopic£¬ÇÒ·Ö±ðÓÐ13¸öºÍ19¸ö·ÖÇø£¬ÔòÕû¸ö¼¯ÈºÉÏ»áÏàÓ¦»áÉú³É¹²32¸öÎļþ¼Ð£¨±¾ÎÄËùÓü¯Èº¹²8¸ö½Úµã£¬´Ë´¦topic1ºÍtopic2 replication-factor¾ùΪ1£©£¬ÈçÏÂͼËùʾ¡£

ÿ¸öÈÕÖ¾Îļþ¶¼ÊÇÒ»¸ölog entryÐòÁУ¬Ã¿¸ölog entry°üº¬Ò»¸ö4×Ö½ÚÕûÐÍÊýÖµ£¨ÖµÎªN+5£©£¬1¸ö×ֽڵġ±magic value¡±£¬4¸ö×Ö½ÚµÄCRCУÑéÂ룬Æäºó¸úN¸ö×Ö½ÚµÄÏûÏ¢Ì塣ÿÌõÏûÏ¢¶¼ÓÐÒ»¸öµ±Ç°PartitionÏÂΨһµÄ64×Ö½ÚµÄoffset£¬ËüÖ¸Ã÷ÁËÕâÌõÏûÏ¢µÄÆðʼλÖᣴÅÅÌÉÏ´æ´¢µÄÏûÏ¢¸ñʽÈçÏ£º

message length £º 4 bytes (value: 1+4+n)

¡°magic¡± value £º 1 byte

crc £º 4 bytes

payload £º n bytes

Õâ¸ölog entry²¢·ÇÓÉÒ»¸öÎļþ¹¹³É£¬¶øÊǷֳɶà¸ösegment£¬Ã¿¸ösegmentÒÔ¸ÃsegmentµÚÒ»ÌõÏûÏ¢µÄoffsetÃüÃû²¢ÒÔ¡°.kafka¡±Îªºó׺¡£ÁíÍâ»áÓÐÒ»¸öË÷ÒýÎļþ£¬Ëü±êÃ÷ÁËÿ¸ösegmentϰüº¬µÄlog entryµÄoffset·¶Î§£¬ÈçÏÂͼËùʾ¡£

ÒòΪÿÌõÏûÏ¢¶¼±»appendµ½¸ÃPartitionÖУ¬ÊôÓÚ˳Ðòд´ÅÅÌ£¬Òò´ËЧÂʷdz£¸ß£¨¾­ÑéÖ¤£¬Ë³Ðòд´ÅÅÌЧÂʱÈËæ»úдÄڴ滹Ҫ¸ß£¬ÕâÊÇKafka¸ßÍÌÍÂÂʵÄÒ»¸öºÜÖØÒªµÄ±£Ö¤£©¡£

¶ÔÓÚ´«Í³µÄmessage queue¶øÑÔ£¬Ò»°ã»áɾ³ýÒѾ­±»Ïû·ÑµÄÏûÏ¢£¬¶øKafka¼¯Èº»á±£ÁôËùÓеÄÏûÏ¢£¬ÎÞÂÛÆä±»Ïû·ÑÓë·ñ¡£µ±È»£¬ÒòΪ´ÅÅÌÏÞÖÆ£¬²»¿ÉÄÜÓÀ¾Ã±£ÁôËùÓÐÊý¾Ý£¨Êµ¼ÊÉÏҲû±ØÒª£©£¬Òò´ËKafkaÌṩÁ½ÖÖ²ßÂÔɾ³ý¾ÉÊý¾Ý¡£Ò»ÊÇ»ùÓÚʱ¼ä£¬¶þÊÇ»ùÓÚPartitionÎļþ´óС¡£ÀýÈç¿ÉÒÔͨ¹ýÅäÖÃ$KAFKA_HOME/config/server.properties£¬ÈÃKafkaɾ³ýÒ»ÖÜǰµÄÊý¾Ý£¬Ò²¿ÉÔÚPartitionÎļþ³¬¹ý1GBʱɾ³ý¾ÉÊý¾Ý£¬ÅäÖÃÈçÏÂËùʾ¡£

# The minimum age of a log file to be eligible for deletion
log.retention.hours=168
# The maximum size of a log segment file. When this size is reached a new log segment will be created.
log.segment.bytes=1073741824
# The interval at which log segments are checked to see if they can be deleted according to the retention policies
log.retention.check.interval.ms=300000
# If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction.
log.cleaner.enable=false

ÕâÀïҪעÒ⣬ÒòΪKafka¶ÁÈ¡ÌØ¶¨ÏûÏ¢µÄʱ¼ä¸´ÔÓ¶ÈΪO(1)£¬¼´ÓëÎļþ´óСÎ޹أ¬ËùÒÔÕâÀïɾ³ý¹ýÆÚÎļþÓëÌá¸ßKafkaÐÔÄÜÎ޹ء£Ñ¡ÔñÔõÑùµÄɾ³ý²ßÂÔÖ»Óë´ÅÅÌÒÔ¼°¾ßÌåµÄÐèÇóÓйء£ÁíÍ⣬Kafka»áΪÿһ¸öConsumer Group±£ÁôһЩmetadataÐÅÏ¢¡ª¡ªµ±Ç°Ïû·ÑµÄÏûÏ¢µÄposition£¬Ò²¼´offset¡£Õâ¸öoffsetÓÉConsumer¿ØÖÆ¡£Õý³£Çé¿öÏÂConsumer»áÔÚÏû·ÑÍêÒ»ÌõÏûÏ¢ºóµÝÔö¸Ãoffset¡£µ±È»£¬ConsumerÒ²¿É½«offsetÉè³ÉÒ»¸ö½ÏСµÄÖµ£¬ÖØÐÂÏû·ÑһЩÏûÏ¢¡£ÒòΪoffetÓÉConsumer¿ØÖÆ£¬ËùÒÔKafka brokerÊÇÎÞ״̬µÄ£¬Ëü²»ÐèÒª±ê¼ÇÄÄЩÏûÏ¢±»ÄÄЩÏû·Ñ¹ý£¬Ò²²»ÐèҪͨ¹ýbrokerÈ¥±£Ö¤Í¬Ò»¸öConsumer GroupÖ»ÓÐÒ»¸öConsumerÄÜÏû·ÑijһÌõÏûÏ¢£¬Òò´ËÒ²¾Í²»ÐèÒªËø»úÖÆ£¬ÕâҲΪKafkaµÄ¸ßÍÌÍÂÂÊÌṩÁËÓÐÁ¦±£ÕÏ¡£ ¡¡¡¡

ProducerÏûϢ·ÓÉ

Producer·¢ËÍÏûÏ¢µ½brokerʱ£¬»á¸ù¾ÝParitition»úÖÆÑ¡Ôñ½«Æä´æ´¢µ½ÄÄÒ»¸öPartition¡£Èç¹ûPartition»úÖÆÉèÖúÏÀí£¬ËùÓÐÏûÏ¢¿ÉÒÔ¾ùÔÈ·Ö²¼µ½²»Í¬µÄPartitionÀÕâÑù¾ÍʵÏÖÁ˸ºÔؾùºâ¡£Èç¹ûÒ»¸öTopic¶ÔÓ¦Ò»¸öÎļþ£¬ÄÇÕâ¸öÎļþËùÔڵĻúÆ÷I/O½«»á³ÉΪÕâ¸öTopicµÄÐÔÄÜÆ¿¾±£¬¶øÓÐÁËPartitionºó£¬²»Í¬µÄÏûÏ¢¿ÉÒÔ²¢ÐÐдÈ벻ͬbrokerµÄ²»Í¬PartitionÀ¼«´óµÄÌá¸ßÁËÍÌÍÂÂÊ¡£¿ÉÒÔÔÚ$KAFKA_HOME/config/server.propertiesÖÐͨ¹ýÅäÖÃÏînum.partitionsÀ´Ö¸¶¨Ð½¨TopicµÄĬÈÏPartitionÊýÁ¿£¬Ò²¿ÉÔÚ´´½¨Topicʱͨ¹ý²ÎÊýÖ¸¶¨£¬Í¬Ê±Ò²¿ÉÒÔÔÚTopic´´½¨Ö®ºóͨ¹ýKafkaÌṩµÄ¹¤¾ßÐ޸ġ£

ÔÚ·¢ËÍÒ»ÌõÏûϢʱ£¬¿ÉÒÔÖ¸¶¨ÕâÌõÏûÏ¢µÄkey£¬Producer¸ù¾ÝÕâ¸ökeyºÍPartition»úÖÆÀ´ÅжÏÓ¦¸Ã½«ÕâÌõÏûÏ¢·¢Ë͵½ÄĸöParition¡£Paritition»úÖÆ¿ÉÒÔͨ¹ýÖ¸¶¨ProducerµÄparitition. classÕâÒ»²ÎÊýÀ´Ö¸¶¨£¬¸Ãclass±ØÐëʵÏÖkafka.producer.Partitioner½Ó¿Ú¡£±¾ÀýÖÐÈç¹ûkey¿ÉÒÔ±»½âÎöΪÕûÊýÔò½«¶ÔÓ¦µÄÕûÊýÓëPartition×ÜÊýÈ¡Ó࣬¸ÃÏûÏ¢»á±»·¢Ë͵½¸ÃÊý¶ÔÓ¦µÄPartition¡££¨Ã¿¸öParition¶¼»áÓиöÐòºÅ,ÐòºÅ´Ó0¿ªÊ¼£©

import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;
public class JasonPartitioner<T> implements Partitioner {
public JasonPartitioner(VerifiableProperties verifiableProperties) {}

@Override
public int partition(Object key, int numPartitions) {
try {
int partitionNum = Integer.parseInt((String) key);
return Math.abs(Integer.parseInt((String) key) % numPartitions);
} catch (Exception e) {
return Math.abs(key.hashCode() % numPartitions);
}
}
}

Èç¹û½«ÉÏÀýÖеÄÀà×÷Ϊpartition.class£¬²¢Í¨¹ýÈçÏ´úÂë·¢ËÍ20ÌõÏûÏ¢£¨key·Ö±ðΪ0£¬1£¬2£¬3£©ÖÁtopic3£¨°üº¬4¸öPartition£©¡£

public void sendMessage() throws InterruptedException{
¡¡¡¡for(int i = 1; i <= 5; i++){
¡¡¡¡ List messageList = new ArrayList<KeyedMessage<String, String>>();
¡¡¡¡ for(int j = 0; j < 4; j++£©{
¡¡¡¡ messageList.add(new KeyedMessage<String, String>("topic2", String.valueOf(j), String.format("The %d message for key %d", i, j));
¡¡¡¡ }
¡¡¡¡ producer.send(messageList);
}
¡¡¡¡producer.close();
}

ÔòkeyÏàͬµÄÏûÏ¢»á±»·¢ËͲ¢´æ´¢µ½Í¬Ò»¸öpartitionÀ¶øÇÒkeyµÄÐòºÅÕýºÃºÍPartitionÐòºÅÏàͬ¡££¨PartitionÐòºÅ´Ó0¿ªÊ¼£¬±¾ÀýÖеÄkeyÒ²´Ó0¿ªÊ¼£©¡£ÏÂͼËùʾÊÇͨ¹ýJava³ÌÐòµ÷ÓÃConsumerºó´òÓ¡³öµÄÏûÏ¢ÁÐ±í¡£

Consumer Group

£¨±¾½ÚËùÓÐÃèÊö¶¼ÊÇ»ùÓÚConsumer hight level API¶ø·Çlow level API£©¡£

ʹÓÃConsumer high level APIʱ£¬Í¬Ò»TopicµÄÒ»ÌõÏûÏ¢Ö»Äܱ»Í¬Ò»¸öConsumer GroupÄÚµÄÒ»¸öConsumerÏû·Ñ£¬µ«¶à¸öConsumer Group¿ÉͬʱÏû·ÑÕâÒ»ÏûÏ¢¡£

ÕâÊÇKafkaÓÃÀ´ÊµÏÖÒ»¸öTopicÏûÏ¢µÄ¹ã²¥£¨·¢¸øËùÓеÄConsumer£©ºÍµ¥²¥£¨·¢¸øÄ³Ò»¸öConsumer£©µÄÊֶΡ£Ò»¸öTopic¿ÉÒÔ¶ÔÓ¦¶à¸öConsumer Group¡£Èç¹ûÐèҪʵÏֹ㲥£¬Ö»ÒªÃ¿¸öConsumerÓÐÒ»¸ö¶ÀÁ¢µÄGroup¾Í¿ÉÒÔÁË¡£ÒªÊµÏÖµ¥²¥Ö»ÒªËùÓеÄConsumerÔÚͬһ¸öGroupÀï¡£ÓÃConsumer Group»¹¿ÉÒÔ½«Consumer½øÐÐ×ÔÓɵķÖ×é¶ø²»ÐèÒª¶à´Î·¢ËÍÏûÏ¢µ½²»Í¬µÄTopic¡£

ʵ¼ÊÉÏ£¬KafkaµÄÉè¼ÆÀíÄîÖ®Ò»¾ÍÊÇͬʱÌṩÀëÏß´¦ÀíºÍʵʱ´¦Àí¡£¸ù¾ÝÕâÒ»ÌØÐÔ£¬¿ÉÒÔʹÓÃStormÕâÖÖʵʱÁ÷´¦Àíϵͳ¶ÔÏûÏ¢½øÐÐʵʱÔÚÏß´¦Àí£¬Í¬Ê±Ê¹ÓÃHadoopÕâÖÖÅú´¦Àíϵͳ½øÐÐÀëÏß´¦Àí£¬»¹¿ÉÒÔͬʱ½«Êý¾Ýʵʱ±¸·Ýµ½ÁíÒ»¸öÊý¾ÝÖÐÐÄ£¬Ö»ÐèÒª±£Ö¤ÕâÈý¸ö²Ù×÷ËùʹÓõÄConsumerÊôÓÚ²»Í¬µÄConsumer Group¼´¿É¡£ÏÂͼÊÇKafkaÔÚLinkedinµÄÒ»ÖÖ¼ò»¯²¿ÊðʾÒâͼ¡£

ÏÂÃæÕâ¸öÀý×Ó¸üÇåÎúµØÕ¹Ê¾ÁËKafka Consumer GroupµÄÌØÐÔ¡£Ê×ÏÈ´´½¨Ò»¸öTopic (ÃûΪtopic1£¬°üº¬3¸öPartition)£¬È»ºó´´½¨Ò»¸öÊôÓÚgroup1µÄConsumerʵÀý£¬²¢´´½¨Èý¸öÊôÓÚgroup2µÄConsumerʵÀý£¬×îºóͨ¹ýProducerÏòtopic1·¢ËÍkey·Ö±ðΪ1£¬2£¬3µÄÏûÏ¢¡£½á¹û·¢ÏÖÊôÓÚgroup1µÄConsumerÊÕµ½ÁËËùÓеÄÕâÈýÌõÏûÏ¢£¬Í¬Ê±group2ÖеÄ3¸öConsumer·Ö±ðÊÕµ½ÁËkeyΪ1£¬2£¬3µÄÏûÏ¢¡£ÈçÏÂͼËùʾ¡£

Push vs. Pull¡¡¡¡

×÷Ϊһ¸öÏûϢϵͳ£¬Kafka×ñÑ­ÁË´«Í³µÄ·½Ê½£¬Ñ¡ÔñÓÉProducerÏòbroker pushÏûÏ¢²¢ÓÉConsumer´Óbroker pullÏûÏ¢¡£Ò»Ð©logging-centric system£¬±ÈÈçFacebookµÄScribeºÍClouderaµÄFlume£¬²ÉÓÃpushģʽ¡£ÊÂʵÉÏ£¬pushģʽºÍpullģʽ¸÷ÓÐÓÅÁÓ¡£

pushģʽºÜÄÑÊÊÓ¦Ïû·ÑËÙÂʲ»Í¬µÄÏû·ÑÕߣ¬ÒòΪÏûÏ¢·¢ËÍËÙÂÊÊÇÓÉbroker¾ö¶¨µÄ¡£pushģʽµÄÄ¿±êÊǾ¡¿ÉÄÜÒÔ×î¿ìËÙ¶È´«µÝÏûÏ¢£¬µ«ÊÇÕâÑùºÜÈÝÒ×Ôì³ÉConsumerÀ´²»¼°´¦ÀíÏûÏ¢£¬µäÐ͵ıíÏÖ¾ÍÊǾܾø·þÎñÒÔ¼°ÍøÂçÓµÈû¡£¶øpullģʽÔò¿ÉÒÔ¸ù¾ÝConsumerµÄÏû·ÑÄÜÁ¦ÒÔÊʵ±µÄËÙÂÊÏû·ÑÏûÏ¢¡£

¶ÔÓÚKafka¶øÑÔ£¬pullģʽ¸üºÏÊÊ¡£pullģʽ¿É¼ò»¯brokerµÄÉè¼Æ£¬Consumer¿É×ÔÖ÷¿ØÖÆÏû·ÑÏûÏ¢µÄËÙÂÊ£¬Í¬Ê±Consumer¿ÉÒÔ×Ô¼º¿ØÖÆÏû·Ñ·½Ê½¡ª¡ª¼´¿ÉÅúÁ¿Ïû·ÑÒ²¿ÉÖðÌõÏû·Ñ£¬Í¬Ê±»¹ÄÜÑ¡Ôñ²»Í¬µÄÌá½»·½Ê½´Ó¶øÊµÏÖ²»Í¬µÄ´«ÊäÓïÒå¡£ ¡¡¡¡

Kafka delivery guarantee

ÓÐÕâô¼¸ÖÖ¿ÉÄܵÄdelivery guarantee£º

At most once ÏûÏ¢¿ÉÄܻᶪ£¬µ«¾ø²»»áÖØ¸´´«Êä

At least one ÏûÏ¢¾ø²»»á¶ª£¬µ«¿ÉÄÜ»áÖØ¸´´«Êä

Exactly once ÿÌõÏûÏ¢¿Ï¶¨»á±»´«ÊäÒ»´ÎÇÒ½ö´«ÊäÒ»´Î£¬ºÜ¶àʱºòÕâÊÇÓû§ËùÏëÒªµÄ¡£

µ±ProducerÏòbroker·¢ËÍÏûϢʱ£¬Ò»µ©ÕâÌõÏûÏ¢±»commit£¬ÒòÊýreplicationµÄ´æÔÚ£¬Ëü¾Í²»»á¶ª¡£µ«ÊÇÈç¹ûProducer·¢ËÍÊý¾Ý¸øbrokerºó£¬Óöµ½ÍøÂçÎÊÌâ¶øÔì³ÉͨÐÅÖжϣ¬ÄÇProducer¾ÍÎÞ·¨ÅжϸÃÌõÏûÏ¢ÊÇ·ñÒѾ­commit¡£ËäÈ»KafkaÎÞ·¨È·¶¨ÍøÂç¹ÊÕÏÆÚ¼ä·¢ÉúÁËʲô£¬µ«ÊÇProducer¿ÉÒÔÉú³ÉÒ»ÖÖÀàËÆÓÚÖ÷¼üµÄ¶«Î÷£¬·¢Éú¹ÊÕÏʱÃݵÈÐÔµÄÖØÊÔ¶à´Î£¬ÕâÑù¾Í×öµ½ÁËExactly once¡£½ØÖ¹µ½Ä¿Ç°(Kafka 0.8.2°æ±¾£¬2015-03-04)£¬ÕâÒ»Feature»¹²¢Î´ÊµÏÖ£¬ÓÐÏ£ÍûÔÚKafkaδÀ´µÄ°æ±¾ÖÐʵÏÖ¡££¨ËùÒÔĿǰĬÈÏÇé¿öÏÂÒ»ÌõÏûÏ¢´ÓProducerµ½brokerÊÇÈ·±£ÁËAt least once£¬¿Éͨ¹ýÉèÖÃProducerÒì²½·¢ËÍʵÏÖAt most once£©¡£

½ÓÏÂÀ´ÌÖÂÛµÄÊÇÏûÏ¢´Óbrokerµ½ConsumerµÄdelivery guaranteeÓïÒå¡££¨½öÕë¶ÔKafka consumer high level API£©¡£ConsumerÔÚ´Óbroker¶ÁÈ¡ÏûÏ¢ºó£¬¿ÉÒÔÑ¡Ôñcommit£¬¸Ã²Ù×÷»áÔÚZookeeperÖб£´æ¸ÃConsumerÔÚ¸ÃPartitionÖжÁÈ¡µÄÏûÏ¢µÄoffset¡£¸ÃConsumerÏÂÒ»´ÎÔÙ¶Á¸ÃPartitionʱ»á´ÓÏÂÒ»Ìõ¿ªÊ¼¶ÁÈ¡¡£Èçδcommit£¬ÏÂÒ»´Î¶ÁÈ¡µÄ¿ªÊ¼Î»Öûá¸úÉÏÒ»´ÎcommitÖ®ºóµÄ¿ªÊ¼Î»ÖÃÏàͬ¡£µ±È»¿ÉÒÔ½«ConsumerÉèÖÃΪautocommit£¬¼´ConsumerÒ»µ©¶Áµ½Êý¾ÝÁ¢¼´×Ô¶¯commit¡£Èç¹ûÖ»ÌÖÂÛÕâÒ»¶ÁÈ¡ÏûÏ¢µÄ¹ý³Ì£¬ÄÇKafkaÊÇÈ·±£ÁËExactly once¡£µ«Êµ¼ÊʹÓÃÖÐÓ¦ÓóÌÐò²¢·ÇÔÚConsumer¶ÁÈ¡ÍêÊý¾Ý¾Í½áÊøÁË£¬¶øÊÇÒª½øÐнøÒ»²½´¦Àí£¬¶øÊý¾Ý´¦ÀíÓëcommitµÄ˳ÐòÔںܴó³Ì¶ÈÉϾö¶¨ÁËÏûÏ¢´ÓbrokerºÍconsumerµÄdelivery guarantee semantic¡£

¶ÁÍêÏûÏ¢ÏÈcommitÔÙ´¦ÀíÏûÏ¢¡£ÕâÖÖģʽÏ£¬Èç¹ûConsumerÔÚcommitºó»¹Ã»À´µÃ¼°´¦ÀíÏûÏ¢¾ÍcrashÁË£¬Ï´ÎÖØÐ¿ªÊ¼¹¤×÷ºó¾ÍÎÞ·¨¶Áµ½¸Õ¸ÕÒÑÌá½»¶øÎ´´¦ÀíµÄÏûÏ¢£¬Õâ¾Í¶ÔÓ¦ÓÚAt most once

¶ÁÍêÏûÏ¢ÏÈ´¦ÀíÔÙcommit¡£ÕâÖÖģʽÏ£¬Èç¹ûÔÚ´¦ÀíÍêÏûÏ¢Ö®ºócommit֮ǰConsumer crashÁË£¬Ï´ÎÖØÐ¿ªÊ¼¹¤×÷ʱ»¹»á´¦Àí¸Õ¸ÕδcommitµÄÏûÏ¢£¬Êµ¼ÊÉϸÃÏûÏ¢ÒѾ­±»´¦Àí¹ýÁË¡£Õâ¾Í¶ÔÓ¦ÓÚAt least once¡£ÔںܶàʹÓó¡¾°Ï£¬ÏûÏ¢¶¼ÓÐÒ»¸öÖ÷¼ü£¬ËùÒÔÏûÏ¢µÄ´¦ÀíÍùÍù¾ßÓÐÃݵÈÐÔ£¬¼´¶à´Î´¦ÀíÕâÒ»ÌõÏûÏ¢¸úÖ»´¦ÀíÒ»´ÎÊǵÈЧµÄ£¬ÄǾͿÉÒÔÈÏΪÊÇExactly once¡££¨±ÊÕßÈÏΪÕâÖÖ˵·¨±È½Ïǣǿ£¬±Ï¾¹Ëü²»ÊÇKafka±¾ÉíÌṩµÄ»úÖÆ£¬Ö÷¼ü±¾ÉíÒ²²¢²»ÄÜÍêÈ«±£Ö¤²Ù×÷µÄÃݵÈÐÔ¡£¶øÇÒʵ¼ÊÉÏÎÒÃÇ˵delivery guarantee ÓïÒåÊÇÌÖÂÛ±»´¦Àí¶àÉٴΣ¬¶ø·Ç´¦Àí½á¹ûÔõÑù£¬ÒòΪ´¦Àí·½Ê½¶àÖÖ¶àÑù£¬ÎÒÃDz»Ó¦¸Ã°Ñ´¦Àí¹ý³ÌµÄÌØÐÔ¡ª¡ªÈçÊÇ·ñÃݵÈÐÔ£¬µ±³ÉKafka±¾ÉíµÄFeature£©

Èç¹ûÒ»¶¨Òª×öµ½Exactly once£¬¾ÍÐèҪЭµ÷offsetºÍʵ¼Ê²Ù×÷µÄÊä³ö¡£¾­µäµÄ×ö·¨ÊÇÒýÈëÁ½½×¶ÎÌá½»¡£Èç¹ûÄÜÈÃoffsetºÍ²Ù×÷ÊäÈë´æÔÚͬһ¸öµØ·½£¬»á¸ü¼ò½àºÍͨÓá£ÕâÖÖ·½Ê½¿ÉÄܸüºÃ£¬ÒòΪÐí¶àÊä³öϵͳ¿ÉÄܲ»Ö§³ÖÁ½½×¶ÎÌá½»¡£±ÈÈ磬ConsumerÄõ½Êý¾Ýºó¿ÉÄܰÑÊý¾Ý·Åµ½HDFS£¬Èç¹û°Ñ×îеÄoffsetºÍÊý¾Ý±¾ÉíÒ»Æðдµ½HDFS£¬ÄǾͿÉÒÔ±£Ö¤Êý¾ÝµÄÊä³öºÍoffsetµÄ¸üÐÂҪô¶¼Íê³É£¬ÒªÃ´¶¼²»Íê³É£¬¼ä½ÓʵÏÖExactly once¡££¨Ä¿Ç°¾Íhigh level API¶øÑÔ£¬offsetÊÇ´æÓÚZookeeperÖеģ¬ÎÞ·¨´æÓÚHDFS£¬¶ølow level APIµÄoffsetÊÇÓÉ×Ô¼ºÈ¥Î¬»¤µÄ£¬¿ÉÒÔ½«Ö®´æÓÚHDFSÖУ©

×ÜÖ®£¬KafkaĬÈϱ£Ö¤At least once£¬²¢ÇÒÔÊÐíͨ¹ýÉèÖÃProducerÒì²½Ìá½»À´ÊµÏÖAt most once¡£¶øExactly onceÒªÇóÓëÍⲿ´æ´¢ÏµÍ³Ð­×÷£¬ÐÒÔ˵ÄÊÇKafkaÌṩµÄoffset¿ÉÒԷdz£Ö±½Ó·Ç³£ÈÝÒ×µÃʹÓÃÕâÖÖ·½Ê½¡£

   
3444 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

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

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

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