±à¼ÍƼö: |
ÔÚ±¾ÎÄÖУ¬ÎÒ½«½øÒ»²½Ì½ÌÖÕâЩÏë·¨£¬²¢Õ¹Ê¾Á÷´¦Àí£¨ÓÈÆäÊÇKafka Streams£©ÈçºÎ°ïÖú½«Ê¼þÔ´ºÍCQRS¸¶Öîʵ¼ù¡£
À´×ÔÓÚ³¬¼¶¼Ü¹¹Ê¦
,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
ʼþËÝÔ´×÷ΪһÖÖÓ¦ÓóÌÐò¼Ü¹¹Ä£Ê½Ô½À´Ô½Á÷ÐС£Ê¼þÔ´Éæ¼°½«Ó¦ÓóÌÐò½øÐеÄ״̬¸ü¸Ä½¨Ä£ÎªÊ¼þµÄ²»¿É±äÐòÁлò¡°ÈÕÖ¾¡±¡£Ê¼þÔ´²»ÊÇÔÚÏÖ³¡ÐÞ¸ÄÓ¦ÓóÌÐòµÄ״̬£¬¶øÊǽ«´¥·¢×´Ì¬¸ü¸ÄµÄʼþ´æ´¢ÔÚ²»¿É±äµÄÈÕÖ¾ÖУ¬²¢½«×´Ì¬¸ü¸Ä½¨Ä£Îª¶ÔÈÕÖ¾ÖÐʼþµÄÏìÓ¦¡£ÎÒÃÇÖ®Ç°ÔøÐ´¹ýÓйØÊ¼þÔ´£¬Apache Kafka¼°ÆäÏà¹ØÐÔµÄÎÄÕ¡£ÔÚ±¾ÎÄÖУ¬ÎÒ½«½øÒ»²½Ì½ÌÖÕâЩÏë·¨£¬²¢Õ¹Ê¾Á÷´¦Àí£¨ÓÈÆäÊÇKafka Streams£©ÈçºÎ°ïÖú½«Ê¼þÔ´ºÍCQRS¸¶Öîʵ¼ù¡£
ÈÃÎÒÃǾٸöÀý×Ó¡£¿¼ÂÇÒ»¸öÀàËÆÓÚFacebookµÄÉç½»ÍøÂçÓ¦ÓóÌÐò£¨¾¡¹ÜÍêÈ«ÊǼÙÉèµÄ£©£¬µ±Óû§¸üÐÂÆäFacebook¸öÈË×ÊÁÏʱ»á¸üиöÈË×ÊÁÏÊý¾Ý¿â¡£µ±Óû§¸üÐÂÆä¸öÈË×ÊÁÏʱ£¬ÐèҪ֪ͨ¶à¸öÓ¦ÓóÌÐò-ËÑË÷Ó¦ÓóÌÐò£¬ÒÔ±ã¿ÉÒÔ½«Óû§µÄ¸öÈË×ÊÁÏÖØÐ±àÖÆË÷ÒýÒÔ±ã¿ÉÒÔÔÚ¸ü¸ÄµÄÊôÐÔÉϽøÐÐËÑË÷£»ÐÂÎŶ©ÔÄÔ´Ó¦ÓóÌÐò£¬ÒÔ±ãÓû§µÄÁªÏµ¿ÉÒÔÕÒµ½ÓйظöÈË×ÊÁϸüеÄÐÅÏ¢£»Êý¾Ý²Ö¿âETLÓ¦ÓóÌÐò½«×îеĸÅÒªÎļþÊý¾Ý¼ÓÔØµ½Ö§³Ö¸÷ÖÖ·ÖÎö²éѯµÈµÄÖÐÑëÊý¾Ý²Ö¿âÖС£

»ùÓÚʼþÔ´µÄ¼Ü¹¹
ʼþÀ´Ô´Éæ¼°¸ü¸ÄÅäÖÃÎļþWebÓ¦ÓóÌÐò£¬ÒÔ½«ÅäÖÃÎļþ¸üн¨Ä£ÎªÊ¼þ£¨·¢ÉúµÄÖØÒªÊ¼þ£©£¬²¢½«ÆäдÈëÖÐÑëÈÕÖ¾£¨ÀýÈçKafkaÖ÷Ì⣩¡£ÔÚÕâÖÖÇé¿öÏ£¬ËùÓÐÐèÒªÏìÓ¦ÅäÖÃÎļþ¸üÐÂʼþµÄÓ¦ÓóÌÐò£¬Ö»Ðè¶©ÔÄKafkaÖ÷Ìâ²¢´´½¨¸÷×ÔµÄÎﻯÊÓͼ-¿ÉÒÔд»º´æ£¬ÔÚElasticsearchÖÐΪʼþ½¨Á¢Ë÷Òý»ò¼òµ¥µØ¼ÆËãin -ÄÚ´æ¾ÛºÏ¡£¸öÈ˵µ°¸WebÓ¦ÓóÌÐò±¾ÉíÒ²¶©ÔÄÁËÏàͬµÄKafkaÖ÷Ì⣬²¢½«¸üÐÂÄÚÈÝдÈë¸öÈ˵µ°¸Êý¾Ý¿â¡£
ʼþËÝÔ´£ºÒ»Ð©È¨ºâ
ʹÓÃʼþÔ´¶ÔÓ¦ÓóÌÐò½øÐн¨Ä£ÓÐÐí¶àÓŵã-ËüÌṩÁ˶ԶÔÏó½øÐеÄÿ¸ö״̬¸ü¸ÄµÄÍêÕûÈÕÖ¾£»Òò´Ë¹ÊÕÏÅųý¸ü¼ÓÈÝÒס£Í¨¹ý½«Óû§Òâͼ±íʾΪ²»¿É±äʼþµÄÓÐÐòÈÕÖ¾£¬Ê¼þԴΪÆóÒµÌṩÁËÉóºËºÍºÏ¹æÐÔÈÕÖ¾£¬Õ⻹¾ßÓÐÌṩÊý¾ÝÔ´µÄ¶îÍâºÃ´¦¡£ËüÖ§³Öµ¯ÐÔÓ¦ÓóÌÐò£»»Ø¹öÓ¦ÓóÌÐòµÈÓÚµ¹ÍËʼþÈÕÖ¾ºÍÖØÐ´¦ÀíÊý¾Ý¡£¾ßÓнϺõÄÐÔÄÜÌØµã£»Ð´ÈëºÍ¶ÁÈ¡¿ÉÒÔ¶ÀÁ¢Ëõ·Å¡£ËüʵÏÖÁËËÉÉ¢ñîºÏµÄÓ¦ÓóÌÐò ¼Ü¹¹ ¡£ËüʹÏò»ùÓÚ΢·þÎñµÄ ¼Ü¹¹ ¹ý¶É±äµÃ¸üÈÝÒס£µ«×îÖØÒªµÄÊÇ£º
ʼþÔ´Ö§³Ö¹¹½¨Ç°Ïò¼æÈݵÄÓ¦ÓóÌÐò ¼Ü¹¹ £¬¼´½«À´¿ÉÒÔÌí¼Ó¸ü¶àÐèÒª´¦Àíͬһʼþµ«´´½¨²»Í¬ÊµÀý»¯ÊÓͼµÄÓ¦ÓóÌÐòµÄÄÜÁ¦¡£
¶ÔÓÚÉÏÊöÓŵ㣬ҲÓÐһЩȱµã¡£Ê¼þÔ´¾ßÓиü¸ßµÄѧϰÇúÏߣ»ÕâÊÇÒ»¸öİÉúµÄбà³ÌÄ£ÐÍ¡£Ê¼þÈÕÖ¾¿ÉÄÜÉæ¼°¸ü¶àµÄ²éѯ¹¤×÷£¬ÒòΪËüÐèÒª½«Ê¼þת»»ÎªÊʺϲéѯµÄËùÐèÎﻯ״̬¡£
ÄÇÊǶÔʼþÔ´ºÍһЩȨºâµÄ¿ìËÙ½éÉÜ¡£±¾ÎÄÎÞÒâ̽ÌÖʼþÔ´µÄϸ½Ú»òÌᳫÆäÓÃ;¡£Äú¿ÉÒÔÔÚ´Ë´¦ÔĶÁÓйØÊ¼þÀ´Ô´ºÍ¸÷ÖÖÕÛÖÔ·½·¨µÄ¸ü¶àÐÅÏ¢¡£
Kafka×÷ΪʼþËÝÔ´µÄÖ§Öù
ʼþÔ´ÓëApache KafkaÏà¹Ø¡£ÕâÊÇÈçºÎ½øÐеÄ-ʼþÀ´Ô´É漰ά»¤¶à¸öÓ¦ÓóÌÐò¿ÉÒÔ¶©ÔĵIJ»¿É±äʼþÐòÁС£KafkaÊÇÒ»ÖÖ¸ßÐÔÄÜ£¬µÍÑÓ³Ù£¬¿ÉÀ©Õ¹ºÍ³Ö¾ÃµÄÈÕÖ¾£¬Òѱ»È«ÇòÊýǧ¼Ò¹«Ë¾Ê¹Ó㬲¢¾¹ýÁË´ó¹æÄ£µÄʵս²âÊÔ¡£Òò´Ë£¬KafkaÊǴ洢ʼþµÄ×ÔȻ֧Öù£¬Í¬Ê±Ïò»ùÓÚʼþÔ´µÄÓ¦ÓóÌÐò ¼Ü¹¹ ·¢Õ¹¡£
ʼþËÝÔ´ºÍCQRS
´ËÍ⣬ʼþÔ´ºÍCQRSÓ¦ÓóÌÐò ¼Ü¹¹ ģʽҲÏà¹Ø¡£ÃüÁî²éѯÔðÈθôÀ루CQRS£©ÊÇ×î³£ÓÃÓÚʼþÔ´µÄÓ¦ÓóÌÐò ¼Ü¹¹ ģʽ¡£CQRSÉæ¼°ÔÚÄÚ²¿½«Ó¦ÓóÌÐò·ÖΪÁ½²¿·Ö-ÃüÁî¶ËÃüÁîϵͳ¸üÐÂ״̬£¬¶ø²éѯ¶ËÔòÔÚ²»¸ü¸Ä״̬µÄÇé¿öÏ»ñÈ¡ÐÅÏ¢¡£CQRSÌṩÁ˹Ø×¢µã·ÖÀë¨CÃüÁî»òд¶ËÓëÒµÎñÓйأ»Ëü²»¹ØÐIJéѯ£¬Êý¾ÝÉϵIJ»Í¬ÊµÀý»¯ÊÓͼ£¬Õë¶ÔÐÔÄܵÄʵÀý»¯ÊÓͼµÄ×î¼Ñ´æ´¢µÈ¡£ÁíÒ»·½Ã棬²éѯ»ò¶ÁÈ¡¶ËÈ«²¿Óë¶ÁÈ¡·ÃÎÊȨÏÞÓйء£ÆäÖ÷ҪĿµÄÊÇʹ²éѯ¿ìËÙ¸ßЧ¡£

ʹÓÃʼþÔ´ºÍCQRÖØ¹¹Ó¦ÓóÌÐò
ʼþÔ´ÓëCQRSÒ»Æð¹¤×÷µÄ·½Ê½ÊÇʹӦÓóÌÐòµÄÒ»²¿·ÖÔÚ¶ÔʼþÈÕÖ¾»òKafkaÖ÷ÌâµÄдÈë¹ý³ÌÖжԸüнøÐн¨Ä£¡£ÕâÓëʼþ´¦Àí³ÌÐòÅä¶Ô£¬¸Ãʼþ´¦Àí³ÌÐò¶©ÔÄKafkaÖ÷Ì⣬¸ù¾ÝÐèҪת»»Ê¼þ£¬²¢½«ÊµÀý»¯ÊÓͼдÈë¶ÁÈ¡´æ´¢¡£×îºó£¬Ó¦ÓóÌÐòµÄ¶ÁÈ¡²¿·ÖÕë¶Ô¶ÁÈ¡´æ´¢·¢³ö²éѯ¡£
CQRS¾ßÓÐһЩÓŵã-Ëüʹ¸ºÔØÓëдÈëºÍ¶ÁÈ¡·ÖÀ룬´Ó¶ø¿ÉÒÔ·Ö±ðËõ·Å¡£¸÷ÖÖ¶Áȡ·¾¶±¾Éí¿ÉÒÔ¶ÀÁ¢Ëõ·Å¡£´ËÍ⣬¿ÉÒÔÕë¶ÔÓ¦ÓóÌÐòµÄ²éѯģʽÓÅ»¯¶ÁÈ¡´æ´¢£»Í¼ÐÎÓ¦ÓóÌÐò¿ÉÒÔ½«Neo4jÓÃ×÷Æä¶ÁÈ¡´æ´¢£¬ËÑË÷Ó¦ÓóÌÐò¿ÉÒÔʹÓÃLuceneË÷Òý£¬¶ø¼òµ¥µÄÄÚÈÝ·þÎñWebÓ¦ÓóÌÐò¿ÉÒÔʹÓÃǶÈëʽ»º´æ¡£³ýÁ˼¼ÊõÓÅÊÆÖ®Í⣬CQRS»¹¾ßÓÐ×éÖ¯ÉϵÄÓÅÊÆ-ͨ¹ý½«Ð´ÈëºÍ¶Áȡ·¾¶·ÖÀ룬Äú¿ÉÒÔʹ¸ºÔðдÈëºÍ¶Áȡ·¾¶µÄÒµÎñÂß¼µÄÍŶÓÍѹ³¡£
±¾ÎĽöÉæ¼°CQRSϸ΢²î±ðµÄ±íÃæ¡£Èç¹ûÄúÏëÁ˽â¸ü¶àÐÅÏ¢£¬½¨ÒéÔĶÁMartin FowlerºÍUdi Dahan¹ØÓÚ¸ÃÖ÷ÌâµÄÎÄÕ¡£
µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÒѾ¶ÔʼþÔ´ºÍCQRS½øÐÐÁ˽éÉÜ£¬²¢ÃèÊöÁËKafkaÈçºÎ×ÔÈ»µØ½«ÕâЩӦÓóÌÐò¼Ü¹¹Ä£Ê½¸¶Öîʵ¼ù¡£µ«ÊÇ£¬Á÷´¦ÀíÔںδ¦ÒÔ¼°ÈçºÎ½øÈë»Ã棿
CQRSºÍKafkaµÄStreams API
ÕâÊÇÁ÷´¦Àí£¬ÓÈÆäÊÇKafka StreamsÈçºÎÆôÓÃCQRSµÄ·½·¨¡£Ê¼þ´¦Àí³ÌÐò¶©ÔÄʼþÈÕÖ¾£¨KafkaÖ÷Ì⣩£¬Ê¹ÓÃʼþ£¬´¦ÀíÕâЩʼþ£¬²¢½«½á¹û¸üÐÂÓ¦ÓÃÓÚ¶ÁÈ¡´æ´¢¡£¶ÔʼþÁ÷½øÐеÍÑÓ³Ùת»»µÄ¹ý³Ì³ÆÎªÁ÷´¦Àí¡£ÔÚApache KafkaµÄ0.10°æ±¾ÖУ¬ÉçÇø·¢²¼ÁËKafka Streams¡£Ò»¸öÇ¿´óµÄÁ÷´¦ÀíÒýÇæ£¬ÓÃÓÚ¶ÔKafkaÖ÷ÌâÉϵÄת»»½øÐн¨Ä£¡£
Kafka Streams·Ç³£ÊʺÏÔÚÓ¦ÓóÌÐòÄÚ²¿¹¹½¨Ê¼þ´¦Àí³ÌÐò×é¼þ£¬¸ÃÓ¦ÓóÌÐòÖ¼ÔÚʹÓÃCQRS½øÐÐʼþÀ´Ô´¡£ËüÊÇÒ»¸ö¿â£¬Òò´Ë¿ÉÒÔ½«ÆäǶÈëÈκαê×¼JavaÓ¦ÓóÌÐòÖУ¬ÒÔ¶ÔʼþÁ÷½øÐÐת»»½¨Ä£¡£ÀýÈ磬ÕâÊÇÒ»¸öʹÓÃKafka Streams½øÐÐ×ÖÊýͳ¼ÆµÄ´úÂëÆ¬¶Î£»Äú¿ÉÒÔÔÚConfluentʾÀýgithub´æ´¢¿âÖзÃÎÊÕû¸ö³ÌÐòµÄ´úÂë¡£
KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> textLines = builder.stream(stringSerde, stringSerde,"TextLinesTopic");
Pattern pattern = Pattern.compile("\\W+", Pattern.UNICODE_CHARACTER_CLASS);
KStream<String, Long> wordCounts = textLines
.flatMapValues(value-> Arrays.asList(pattern.split(value.toLowerCase())))
.map((key, word) -> new KeyValue<>(word, word))
.countByKey("Counts")
.toStream();
wordCounts.to(stringSerde, longSerde, "WordsWithCountsTopic");
KafkaStreams streams = new KafkaStreams(builder, streamsConfiguration);
streams.start(); |
Òò´Ë£¬¿ÉÒÔÇáËɵؽ«Ó¦ÓóÌÐòÄÚµÄʼþ´¦Àí³ÌÐò±íʾΪKafka StreamsÍØÆË£¬µ«¸ü½øÒ»²½£¬ÓÐÁ½¸ö²»Í¬µÄÑ¡Ïî¿ÉÓÃÓÚ½«Ê¼þ´¦Àí³ÌÐòµÄÊä³ö½¨Ä£Îª¶ÔÓ¦ÓóÌÐò״̬½øÐн¨Ä£µÄÊý¾Ý´æ´¢µÄ¸üС£
²ÉÈ¡1£º½«Ó¦ÓóÌÐò״̬½¨Ä£ÎªÍⲿÊý¾Ý´æ´¢

Kafka StreamsÍØÆËµÄÊä³ö¿ÉÒÔÊÇKafkaÖ÷Ì⣨ÈçÉÏÀýËùʾ£©£¬Ò²¿ÉÒÔдÈëÍⲿÊý¾Ý´æ´¢£¨Èç¹ØÏµÊý¾Ý¿â£©¡£´ÓÊÀ½çµÄ½Ç¶ÈÀ´¿´£¬Ê¼þ´¦Àí³ÌÐò½¨Ä£ÎªKafka StreamsÍØÆË£¬¶øÓ¦ÓóÌÐò״̬½¨Ä£ÎªÓû§ÐÅÈκͲÙ×÷µÄÍⲿÊý¾Ý´æ´¢¡£Ö´ÐÐCQRSµÄ´ËÑ¡ÏîÖ÷ÕÅʹÓÃKafka Streams½ö¶Ôʼþ´¦Àí³ÌÐò½¨Ä££¬¶ø½«Ó¦ÓóÌÐò״̬±£ÁôÔÚÍⲿÊý¾Ý´æ´¢ÖУ¬¸ÃÍⲿÊý¾Ý´æ´¢ÊÇKafka StreamsÍØÆËµÄ×îÖÕÊä³ö¡£
ÒÔ2£ºÔÚKafka StreamsÖн«Ó¦ÓóÌÐò״̬½¨Ä£Îª±¾µØ×´Ì¬

×÷ΪһÖÖÌæ´ú·½·¨£¬³ýÁ˶Ôʼþ´¦Àí³ÌÐò½øÐн¨Ä£Ö®Í⣬Kafka Streams»¹ÌṩÁËÒ»ÖÖ¶ÔÓ¦ÓóÌÐò״̬½øÐн¨Ä£µÄÓÐЧ·½·¨-ËüÖ§³Ö¿ªÏä¼´Óõı¾µØ£¬·ÖÇøºÍ³Ö¾Ã״̬¡£´Ë±¾µØ×´Ì¬¿ÉÒÔÊÇRocksDB´æ´¢£¬Ò²¿ÉÒÔÊÇÄÚ´æÖеĹþÏ£Ó³Éä¡£
ÔË×÷·½Ê½ÊÇ£¬½«Ç¶ÈëKafka Streams¿âÒÔ½øÐÐÓÐ״̬Á÷´¦ÀíµÄÓ¦ÓóÌÐòµÄÿ¸öʵÀý¶¼ÍйÜÓ¦ÓóÌÐò״̬µÄ×Ó¼¯£¬½¨Ä£Îª×´Ì¬´æ´¢µÄË鯬»ò·ÖÇø¡£×´Ì¬´æ´¢ÇøµÄ·ÖÇø·½Ê½ÓëÓ¦ÓóÌÐòµÄÃÜÔ¿¿Õ¼äÏàͬ¡£½á¹û£¬·þÎñÓÚµ½´ïÌØ¶¨Ó¦ÓóÌÐòʵÀýµÄ²éѯËùÐèµÄËùÓÐÊý¾ÝÔÚ״̬´æ´¢Ë鯬Öб¾µØ¿ÉÓá£Kafka Streamsͨ¹ý͸Ã÷µØ½«¶Ô״̬´æ´¢Ëù×öµÄËùÓиüмǼµ½¸ß¶È¿ÉÓÃÇҳ־õÄKafkaÖ÷ÌâÖУ¬À´Ìṩ¶Ô¸Ã±¾µØ×´Ì¬´æ´¢µÄÈÝ´í¹¦ÄÜ¡£Òò´Ë£¬Èç¹ûÓ¦ÓóÌÐòʵÀýËÀÍö£¬²¢ÇÒÍйܵı¾µØ×´Ì¬´æ´¢Ë鯬¶ªÊ§£¬ÔòKafka StreamsÖ»Ðè¶ÁÈ¡¸ß¶È¿ÉÓõÄKafkaÖ÷Ìâ²¢½«×´Ì¬Êý¾ÝÖØÐÂÌî³ä¼´¿ÉÖØÐ´´½¨×´Ì¬´æ´¢Ë鯬¡£
ʵ¼ÊÉÏ£¬Kafka Streams½«KafkaÓÃ×÷Æä±¾µØÇ¶ÈëʽÊý¾Ý¿âµÄÌá½»ÈÕÖ¾¡£ÕâÕýÊÇÔÚ·âÃæÏÂÉè¼Æ´«Í³Êý¾Ý¿âµÄ·½Ê½-ÊÂÎñ»òÖØ×öÈÕÖ¾ÊÇÊÂʵµÄÔ´Í·£¬¶ø±íÖ»ÊǶԴ洢ÔÚÊÂÎñÈÕÖ¾ÖеÄÊý¾ÝµÄÎﻯÊÓͼ¡£

Kafka StreamsÖеı¾µØ£¬·ÖÇø£¬³Ö¾Ã״̬
½«Kafka StreamsÓÃÓÚʹÓÃCQRS¹¹½¨µÄÓÐ״̬ӦÓóÌÐò»¹¾ßÓиü¶àÓÅÊÆ¨C Kafka Streams»¹ÄÚÖÃÁ˸ºÔØÆ½ºâºÍ¹ÊÕÏ×ªÒÆ¹¦ÄÜ¡£Èç¹ûÒ»¸öÓ¦ÓóÌÐòʵÀýʧ°Ü£¬ÔòKafka Streams»á×Ô¶¯ÔÚÆäÓàÓ¦ÓóÌÐòʵÀýÖ®¼äÖØÐ·ÖÅäKafkaÖ÷ÌâµÄ·ÖÇøÒÔ¼°ÄÚ²¿×´Ì¬´æ´¢Ë鯬¡£Í¬Ñù£¬Kafka StreamsÔÊÐíµ¯ÐÔËõ·Å¡£Èç¹ûÆô¶¯ÁËʹÓÃKafka StreamsÖ´ÐÐCQRSµÄÓ¦ÓóÌÐòµÄÐÂʵÀý£¬Ëü½«×Ô¶¯ÔÚÐÂÆô¶¯µÄÓ¦ÓóÌÐòʵÀýÖ®¼äƽ¾ùÒÆ¶¯×´Ì¬´æ´¢µÄÏÖÓÐË鯬ÒÔ¼°KafkaÖ÷ÌâµÄ·ÖÇø¡£ËùÓÐÕâЩ¹¦Äܶ¼ÒÔ͸Ã÷µÄ·½Ê½Ìṩ¸øKafka StreamsÓû§¡£
ÐèҪʹÓÃKafka Streamsת»»Îª»ùÓÚCQRSµÄģʽµÄÓ¦ÓóÌÐò²»±Øµ£ÐÄÓ¦ÓóÌÐò¼°Æä״̬µÄÈÝ´íÐÔ£¬¿ÉÓÃÐԺͿÉÉìËõÐÔ¡£
¸ÃǶÈëʽ£¬·ÖÇøÇҳ־õÄ״̬´æ´¢Í¨¹ýKafka Streams¶ÀÓеÄÒ»Á÷³éÏó-KTableÏòÓû§¹«¿ª¡£
KafkaÁ÷ÖеĽ»»¥Ê½²éѯ
ÔÚ¼´½«·¢²¼µÄApache Kafka°æ±¾ÖУ¬Kafka Streams½«ÔÊÐíÆäǶÈëʽ״̬´æ´¢¿É²éѯ¡£
Kafka StreamsÖеÄÕâÒ»¶ÀÌØ¹¦ÄÜ-½»»¥Ê½²éѯ£¨ÒÔǰ±»KafkaÉçÇø³ÆÎªQueryable State£©-ҲʹÆäÊʺϽ«CQRSÉè¼ÆÄ£Ê½Ó¦ÓÃÓÚÓ¦ÓóÌÐò¡£Ê¼þ´¦Àí³ÌÐò±»½¨Ä£ÎªKafka StreamsÍØÆË£¬¸ÃÍØÆË½«Êý¾ÝÉú³Éµ½¶ÁÈ¡´æ´¢£¬¸Ã´æ´¢²»¹ýÊÇKafka StreamsÄÚ²¿µÄǶÈëʽ״̬´æ´¢¡£Ó¦ÓóÌÐòµÄ¶ÁÈ¡²¿·Ö½«StateStore APIÓÃÓÚ״̬´æ´¢£¬²¢»ùÓÚÆäget£¨£©APIÀ´Ìṩ¶ÁÈ¡·þÎñ¡£

ʹÓÃKafkaºÍKafka StreamsµÄʼþÔ´ºÍ»ùÓÚCQRSµÄÓ¦ÓóÌÐò
Kafka StreamsÖеĽ»»¥Ê½²éѯµÄÇé¿ö
Çë×¢Ò⣬ʹÓý»»¥Ê½²éѯ¹¦ÄÜÔÚKafka StreamsÖÐʹÓÃǶÈëʽ״̬´æ´¢´¿´âÊÇ¿ÉÑ¡µÄ£¬²¢·Ç¶ÔËùÓÐÓ¦ÓóÌÐò¶¼ÓÐÒâÒå¡£ÓÐʱ£¬ÄúÖ»ÏëʹÓÃÄúÖªµÀ²¢ÐÅÈεÄÍⲿÊý¾Ý¿â¡£»òÕߣ¬ÔÚʹÓÃKafka Streamsʱ£¬ÄúÒ²¿ÉÒÔ½«Êý¾Ý·¢Ë͵½ÍⲿÊý¾Ý¿â£¨ÀýÈçCassandra£©£¬²¢ÈÃÓ¦ÓóÌÐòµÄ¶ÁÈ¡²¿·Ö²éѯ¸ÃÊý¾Ý¡£
µ«ÊÇ£¬ºÎʱʹÓÃÏñÕâÑùµÄ±¾µØÇ¶ÈëʽӦÓóÌÐò״̬²ÅÓÐÒâÒ壿ÕâÀïÓÐһЩÀû±×¿¼ÂÇ-
ȱµã
- ÏÖÔÚÉú³ÉµÄÓ¦ÓóÌÐòÊÇÓÐ״̬µÄ£¬ÐèÒª¶à¼Ó×¢Òâ²ÅÄܽøÐйÜÀí¡£
- ËüÉæ¼°Ô¶ÀëÄúÖªµÀºÍÐÅÈεÄÊý¾Ý´æ´¢¡£
Óŵã
- ÒÆ¶¯µÄÁã¼þ¸üÉÙ£»Ö»ÊÇÄúµÄÓ¦ÓóÌÐòºÍKafka¼¯Èº¡£Äú²»±Ø²¿Êð£¬Î¬»¤ºÍ²Ù×÷ÍⲿÊý¾Ý¿â¼´¿É´æ´¢Ó¦ÓóÌÐòËùÐèµÄ״̬¡£
- Ëü¿ÉÒÔ¸ü¿ì£¬¸üÓÐЧµØÊ¹ÓÃÓ¦ÓóÌÐò״̬¡£Êý¾Ý¶ÔÓÚÄúµÄÓ¦ÓóÌÐòÊDZ¾µØµÄ£¨ÔÚÄÚ´æÖлò¿ÉÄÜÔÚSSDÉÏ£©£»Äú¿ÉÒÔ¿ìËÙ·ÃÎÊËü¡£Õâ¶ÔÓÚÐèÒª·ÃÎÊ´óÁ¿Ó¦ÓóÌÐò״̬µÄÓ¦ÓóÌÐòÌØ±ðÓÐÓ᣶øÇÒ£¬ÔÚ½øÐоۺÏÒÔ½øÐÐÁ÷´¦ÀíµÄÉ̵êºÍÉ̵êÓ¦´ð²éѯ֮¼äûÓÐÊý¾ÝÖØ¸´¡£
- ËüÌṩÁ˸üºÃµÄ¸ôÀ룻״̬ÔÚÓ¦ÓóÌÐòÄÚ¡£Ò»¸ö¶ñÒâÓ¦ÓóÌÐòÎÞ·¨ÑÍûÆäËûÓÐ״̬ӦÓóÌÐò¹²ÏíµÄÖÐÑëÊý¾Ý´æ´¢¡£
- Ëü¾ßÓÐÁé»îÐÔ¡£ÄÚ²¿Ó¦ÓóÌÐò״̬¿ÉÒÔÕë¶ÔÓ¦ÓóÌÐòËùÐèµÄ²éѯģʽ½øÐÐÓÅ»¯¡£
ʹÓÃKafka×öʼþËÝÔ´ºÍCQRS£º´óÓ®¼Ò
ÎÒÉÏÃæÁгöµÄÀû±×ÌåÏÖÁËËùÉæ¼°µÄ¸÷ÖÖÕÛÖÔ£¬µ«ÊÇ£¬ÎÒÈÏΪ£¬³¯×Å´ËÓ¦ÓóÌÐò ¼Ü¹¹ Âõ½øµÄ×îÖØÒªµÄʤÀû¾ÍÊÇÓ¦ÓóÌÐòÉý¼¶±äµÃ¸ü¼Ó¼òµ¥¡£´¦ÀíÓ¦ÓóÌÐòµÄ·ÇÍ£»úÉý¼¶µÄ´«Í³Ä£ÐÍ£¨ÒÀÀµÓÚÍⲿÊý¾Ý¿âÀ´È·¶¨ÆäÓ¦ÓóÌÐò״̬£©Ï൱¸´ÔÓ¡£ÎÞÐèÍ£»úÉý¼¶¾Í²»ÐèҪͬʱÔËÐÐа汾ºÍ¾É°æ±¾µÄÓ¦ÓóÌÐò¡£Éý¼¶¼¸¸öʵÀýºó£¬Èç¹û·¢ÏÖ´íÎó£¬ÔòÐèÒªÄܹ»Í¸Ã÷µØ½«¸ºÔØÇл»»ØÍ¬Ò»Ó¦ÓóÌÐòµÄ¾ÉʵÀý¡£¼øÓÚÐÂʵÀýºÍ¾ÉʵÀý½«ÐèÒª¸üÐÂÍⲿÊý¾Ý¿âÖеÄÏàͬ±í£¬Òò´ËÐèÒª¸ñÍâСÐÄ£¬ÒÔÔÚ²»ÆÆ»µ×´Ì¬´æ´¢ÖÐÊý¾ÝµÄÇé¿öϽøÐдËÀàÎÞÍ£»úÉý¼¶¡£
ÏÖÔÚ£¬¶ÔÓÚÒÀÀµÓÚ±¾µØÇ¶Èëʽ״̬µÄÓÐ״̬ӦÓóÌÐò£¬¿¼ÂÇÏàͬµÄÎÞÍ£»úÉý¼¶ÎÊÌ⡣ͨ¹ý´ËÄ£ÐÍ£¬Äú¿ÉÒÔÓë¾É°æ±¾Ò»ÆðÍÆ³öа汾µÄÓ¦ÓóÌÐò£¨ÔÚKafka StreamsÖоßÓв»Í¬µÄÓ¦ÓóÌÐòID£©¡£Ã¿¸öÈ˶¼ÓµÓа´ÕÕÆäÓ¦ÓóÌÐòÒµÎñÂß¼°æ±¾Ö¸Ê¾µÄ·½Ê½´¦ÀíµÄÓ¦ÓóÌÐò״̬¸±±¾¡£Äú¿ÉÒÔÖð²½½«Á÷Á¿´Ó¾ÉµÄÒýµ¼µ½Ðµġ£Èç¹ûа汾µÄij¸ö´íÎó»áÔÚÓ¦ÓóÌÐò״̬´æ´¢ÇøÖвúÉúÒâÍâ½á¹û£¬ÄÇôÄúʼÖÕ¿ÉÒÔ½«Æä¶ªÆú£¬ÐÞ¸´¸Ã´íÎó£¬ÖØÐ²¿Êð¸ÃÓ¦ÓóÌÐò²¢ÈÃÆä´ÓÈÕÖ¾ÖÐÖØ½¨Æä״̬¡£
·ÅÔÚÒ»Æð£ºÁãÊÛ¿â´æÓ¦ÓÃ
ÏÖÔÚÈÃÎÒÃÇÒÔÒ»¸öÀý×ÓÀ´ËµÃ÷ÈçºÎ½«±¾ÎĽéÉܵĸÅÄÖîʵ¼ù-ÈçºÎʹÓÃKafkaºÍKafka StreamsΪӦÓóÌÐòÆôÓÃʼþÔ´ºÍCQRS¡£

Àý×Ó:ÁãÊÛÓ¦ÓóÌÐò ¼Ü¹¹
¿¼ÂÇÒ»¸öʵÌåÁãÊÛÉ̵ÄÓ¦ÓóÌÐò£¬¸ÃÓ¦ÓóÌÐò¹ÜÀíËùÓÐÉ̵êµÄ¿â´æ£»µ±Ð»õµ½´ï»ò·¢ÉúÐÂÏúÊÛʱ£¬Ëü»á¸üÐÂ¿â´æ±í£¬²¢ÇÒÒªÖªµÀÉ̵ê¿â´æµÄµ±Ç°×´Ì¬£¬Ëü»á²éѯ¿â´æ±í¡£

¾ßÓÐʼþÔ´µÄÁãÊÛÓ¦ÓóÌÐò¼Ü¹¹¡ªÓÉKafkaÌṩ֧³Ö
Èç¹ûÎÒÃǽ«Ê¼þ²É¹º ¼Ü¹¹ ģʽӦÓÃÓÚ´ËInventoryÓ¦Óã¬ÔòеĻõ¼þ½«ÔÚShipments KafkaÖ÷ÌâÖбíʾΪʼþ¡£Í¬Ñù£¬ÐÂÏúÊÛ½«ÒÔSales KafkaÖ÷Ì⣨¿ÉÄÜÓÉSalesÓ¦ÓóÌÐò±àд£©ÖеÄʼþ±íʾ¡£Îª¼òµ¥Æð¼û£¬ÎÒÃǼÙÉè¡°ÏúÊÛ¡±ºÍ¡°·¢»õ¡±Ö÷ÌâÖеÄKafkaÏûÏ¢µÄ¹Ø¼ü×ÖÊÇ{É̵êID£¬ÉÌÆ·ID}£¬¶øÖµÊÇÉ̵êÖÐÉÌÆ·ÊýÁ¿µÄ¼ÆÊý¡£
InventoryÓ¦ÓóÌÐòÄÚµÄʼþ´¦Àí³ÌÐò±»½¨Ä£ÎªKafka StreamsÍØÆË£¬¸ÃÍØÆËÁ¬½ÓÁËSalesºÍShipments KafkaÖ÷Ìâ¡£Áª½Ó²Ù×÷´´½¨²¢¸üÐÂ״̬´æ´¢¿âInventoryTable£¬¸Ã״̬´æ´¢¿â±íʾÒÔÁ¬Ðø·½Ê½¸üеÄÇåµ¥µÄµ±Ç°×´Ì¬¡£

Á¬½Ó²Ù×÷µÄÄÚ²¿½á¹¹ÒÔ¹¹½¨¿â´æ±í
¿ÉÒÔ½«ÕâÑùµÄÓ¦ÓóÌÐò²¿ÊðÔÚ²»Í¬¼ÆËã»úÉϵĶà¸öʵÀýÖУ¨ÈçÏÂͼËùʾ£©¡£¶øÇÒ£¬InventoryAppµÄÿ¸öʵÀý¶¼³ÐÔØInventoryTableµÄ·ÖƬµÄ×Ó¼¯£¬ÆäÖаüº¬´ËÁª½Ó²Ù×÷µÄ½á¹û¡£µ±Óû§²éѯInventoryAppÀ´Á˽âÉ̵êÖÐijÉÌÆ·µÄµ±Ç°¿â´æÊýÁ¿Ê±£¬
-
ÔËÐÐInventoryAppµÄËæ»ú·þÎñÆ÷ÊÕµ½Ò»¸öÇëÇó£ºGET / inventory / stores / {store id} / items / {item id} / count
-
ËüʹÓÃKafka StreamsʵÀýÉϵÄmetadataForKey£¨£©APIÀ´»ñÈ¡É̵êµÄStreamsMetadataºÍÃÜÔ¿¡£StreamsMetadata±£´æKafka StreamsÍØÆËÖÐÿ¸öÉ̵êµÄÖ÷»úºÍ¶Ë¿ÚÐÅÏ¢¡£Ó¦ÓóÌÐòʹÓÃStreamsMetadata¼ì²é¸ÃʵÀýÊÇ·ñ¾ßÓаüº¬¹Ø¼ü×Ö{store id£¬item id}µÄInventoryTable·ÖÇø¡£Èç¹ûÊÇÕâÑù£¬Ëü½«Ê¹Óñ¾µØKafka StreamsʵÀýÉϵÄstore£¨¡° InventoryTable¡±£©apiÀ´»ñÈ¡¸ÃÉ̵겢¶ÔÆä½øÐвéѯ¡£
-
Èç¹û²»ÊÇ£¬Ëü½«Îªµ±Ç°³ÖÓаüº¬{store id£¬item id}µÄKafka·ÖÇøµÄʵÀýÕÒµ½Ö÷»ú/¶Ë¿Ú£¬²¢×ª·¢GETÇëÇóµ½/ inventory / stores / {store id} / items / {item id} / countµ½ÔÚ¸ÃÖ÷»úÉÏÔËÐеÄInventoryAppʵÀý¡£
-
ÏòÓû§·µ»Ø¿â´æÅ̵ã

ÔÚKafka StreamsÖÐʹÓý»»¥Ê½²éѯµÄ¿â´æ×´Ì¬Ó¦ÓóÌÐò
ÒªÁ˽âÓйء°½»»¥Ê½²éѯ¡±¹¦Äܵĸü¶àÐÅÏ¢£¬ÇëÔĶÁÆäÎĵµ¡£³ýÁËÕâЩ×ÊÔ´Ö®Í⣬Çë²ÎÔÄCapital OneµÄÑÝʾÎĸ壬¸ÃÑÝʾÎĸ彫ÔÚʵ¼ùÖÐÓ¦Óñ¾ÎÄÖнéÉܵÄһЩ˼Ï룬²¢¸ÅÊöʹÓÃKafka StreamsµÄ»ùÓÚREST£¬Ê¼þÔ´£¬CQRSºÍÏìÓ¦Á÷´¦ÀíµÄÓ¦ÓóÌÐò ¼Ü¹¹ ¡£
ÈçÉÏÀýËùʾ£¬´æ´¢ºÍ²éѯ±¾µØ×´Ì¬¶ÔÓÚijЩÓÐ״̬ӦÓóÌÐò¿ÉÄÜûÓÐÒâÒå¡£ÓÐʱ£¬ÄúÏ뽫״̬´æ´¢ÔÚÄúÖªµÀ²¢ÐÅÈεÄÍⲿÊý¾Ý¿âÖС£ÀýÈ磬ÔÚÉÏÃæµÄʾÀýÖУ¬Äú¿ÉÒÔʹÓÃKafka Streamsͨ¹ýjoin²Ù×÷À´¼ÆËã¿â´æÊýÁ¿£¬µ«Ñ¡Ôñ½«½á¹ûдÈëÍⲿÊý¾Ý¿â²¢²éѯ¡£
µ«ÊÇ£¬ÖµµÃ×¢ÒâµÄÊÇ£¬¹¹½¨¾ßÓвéѯ±¾µØ×´Ì¬µÄÓÐ״̬ӦÓóÌÐòÓÐÐí¶àÓŵ㣬Èç±¾ÎÄÇ°ÃæËùÊö¡£
½áÂÛÐÔ˼Ïë
ʼþѰԴΪӦÓóÌÐòʹÓÃÁãËðʧÐÒé¼Ç¼Æä¹ÌÓеIJ»¿É±ÜÃâµÄ״̬±ä»¯ÌṩÁËÒ»ÖÖÓÐЧµÄ·½·¨¡£ÕâÒâζׯָ´¼È¼òµ¥ÓÖ¸ßЧ£¬ÒòΪËüÍêÈ«»ùÓÚÈռǻòÏñKafkaÕâÑùµÄÓÐÐòÈÕÖ¾¡£CQRS¸ü½øÒ»²½£¬½«Ôʼʼþ±ä³É¿É²éѯµÄÊÓͼ£»¾«ÐÄÐγɵÄÓëÆäËûÒµÎñÁ÷³ÌÏà¹ØµÄÊÓͼ¡£KafkaµÄStreams APIÌṩÁËÒÔÁ÷·½Ê½´´½¨ÕâЩÊÓͼËùÐèµÄÉùÃ÷ÐÔ¹¦ÄÜ£¬ÒÔ¼°¿ÉÀ©Õ¹µÄ²éѯ²ã£¬Òò´ËÓû§¿ÉÒÔÖ±½ÓÓë´ËÊÓͼ½øÐн»»¥¡£½á¹ûÊÇÔÚApache KafkaÉϹ¹½¨ÁËÊÊÓõĻùÓÚʼþÔ´ºÍCQRSµÄÓ¦ÓóÌÐò ¼Ü¹¹ £»ÔÊÐí´ËÀàÓ¦ÓóÌÐò»¹ÀûÓÃKafkaµÄºËÐľºÕùÁ¦-ÐÔÄÜ£¬¿ÉÉìËõÐÔ£¬°²È«ÐÔ£¬¿É¿¿ÐԺʹó¹æÄ£²ÉÓá£
×îÖØÒªµÄÊÇ£¬ÒÔÕâÖÖ·½Ê½¹¹½¨ÓÐ״̬µÄÓ¦ÓóÌÐò¿Éʹ×éÖ¯×îÖÕ»ñµÃËÉÉ¢ñîºÏµÄÓ¦ÓóÌÐò ¼Ü¹¹ -Ò»ÖÖ¾ßÓе¯ÐԺͿÉÉìËõÐÔ£¬¸üÒ×ÓÚ¹ÊÕÏÅųýºÍÉý¼¶µÄÓ¦ÓóÌÐò ¼Ü¹¹ £¬×îÖØÒªµÄÊÇ£¬¸Ã ¼Ü¹¹ ¾ßÓÐǰÏò¼æÈÝÐÔ¡£
|