ãããããã«ïŒ
以äžã®æ¬ã«åŸãããšãæãåºããŠãã ããã
ä»ã®ãšãããã³ãã¥ããã£ã¯ãã®åŒ·åãªããŒã«ã®éçãåŠãã§ãããšããã§ãã ããã§ãæè¿ããèšäºãå
¬éãããŸããã®ã§ããã®ç¿»èš³ãã玹ä»ããããšæããŸãã èè
ã¯èªèº«ã®çµéšã«åºã¥ããŠãKafka Streams ãåæ£ããŒã¿ ã¹ãã¬ãŒãžã«å€ããæ¹æ³ã説æããŸãã èªæžã楜ããïŒ
Apache ã©ã€ãã©ãª
ãã®èšäºã§ã¯ãåœç€Ÿãã¯ã©ãŠã ã¢ããªã±ãŒã·ã§ã³ ã»ãã¥ãªãã£ã®è£œåãéçºããéã«ããã®æ©äŒãã©ã®ããã«æŽ»çšããŠå©çãäžãããã«ã€ããŠèª¬æããŸãã Kafka Streams ã䜿çšããŠãå ±æç¶æ ãã€ã¯ããµãŒãã¹ãäœæããŸãããåãã€ã¯ããµãŒãã¹ã¯ãã·ã¹ãã å ã®ãªããžã§ã¯ãã®ç¶æ ã«é¢ããä¿¡é Œã§ããæ å ±ã®ãã©ãŒã«ã ãã¬ã©ã³ãã§å¯çšæ§ã®é«ããœãŒã¹ãšããŠæ©èœããŸãã ç§ãã¡ã«ãšã£ãŠãããã¯ä¿¡é Œæ§ãšãµããŒãã®ããããã®äž¡æ¹ã®ç¹ã§åé²ã§ãã
åäžã®äžå€®ããŒã¿ããŒã¹ã䜿çšããŠãªããžã§ã¯ãã®æ£åŒãªç¶æ ããµããŒãã§ããå¥ã®ã¢ãããŒãã«èå³ãããå Žåã¯ããããèªãã§ãã ãããèå³æ·±ãå 容ã«ãªãã§ããã...
å ±æç¶æ ã®äœ¿çšæ¹æ³ãå€ããææãæ¥ããšèããçç±
ãšãŒãžã§ã³ãã®ã¬ããŒãã«åºã¥ããŠããŸããŸãªãªããžã§ã¯ãã®ç¶æ
ãç¶æããå¿
èŠããããŸãã (äŸ: ãµã€ãã¯æ»æãåããŠããŸããã?)ã Kafka Streams ã«ç§»è¡ããåã¯ãç¶æ
管çãåäžã®äžå€®ããŒã¿ããŒã¹ (+ ãµãŒãã¹ API) ã«äŸåããããšããããããŸããã ãã®ã¢ãããŒãã«ã¯æ¬¡ã®ãããªæ¬ ç¹ããããŸãã
å³ 1: ãžã®ç§»è¡åã«èŠãããå
žåçãªã¹ããªããã¹ããŒã ã·ããªãª
Kafka ãš Kafka Streams: ãšãŒãžã§ã³ã㯠API ãä»ããŠãã¥ãŒãéä¿¡ããæŽæ°ãããç¶æ
ã¯äžå€®ããŒã¿ããŒã¹ãéããŠèšç®ãããŸãã
Kafka Streams ã䜿çšãããšãç¶æ å ±æãã€ã¯ããµãŒãã¹ãç°¡åã«äœæã§ããŸã
çŽ XNUMX 幎åãç§ãã¡ã¯ãããã®åé¡ã«å¯ŸåŠããããã«ãå ±æç¶æ ã·ããªãªã培åºçã«æ€èšããããšã«ããŸããã ç§ãã¡ã¯ããã« Kafka Streams ãè©ŠããŠã¿ãããšã«ããŸãããç§ãã¡ã¯ãKafka Streams ãã©ãã»ã©ã¹ã±ãŒã©ãã«ã§ãå¯çšæ§ãé«ãããã©ãŒã«ã ãã¬ã©ã³ãã§ããããè±å¯ãªã¹ããªãŒãã³ã°æ©èœ (ã¹ããŒããã«ãªãã®ãå«ãå€æ) ãåããŠããããç¥ã£ãŠããŸãã Kafka ã®ã¡ãã»ãŒãžã³ã° ã·ã¹ãã ãã©ãã»ã©æçããä¿¡é Œã§ãããã®ã«ãªã£ããã¯èšããŸã§ããªãããŸãã«ç§ãã¡ãå¿ èŠãšããŠãããã®ã§ãã
ç§ãã¡ãäœæããåã¹ããŒããã« ãã€ã¯ããµãŒãã¹ã¯ãéåžžã«åçŽãªããããžãåãã Kafka Streams ã€ã³ã¹ã¿ã³ã¹äžã«æ§ç¯ãããŸããã ããã¯ã1) ãœãŒã¹ã2) æ°žç¶çãªããŒãšå€ã®ã¹ãã¢ãåããããã»ããµã3) ã·ã³ã¯ã§æ§æãããŠããŸãã
å³ 2: ã¹ããŒããã« ãã€ã¯ããµãŒãã¹ã®ã¹ããªãŒãã³ã° ã€ã³ã¹ã¿ã³ã¹ã®ããã©ã«ã ããããžã ããã«ã¯èšç»ã¡ã¿ããŒã¿ãå«ããªããžããªãããããšã«æ³šæããŠãã ããã
ãã®æ°ããã¢ãããŒãã§ã¯ããšãŒãžã§ã³ãããœãŒã¹ ãããã¯ã«å ¥åãããã¡ãã»ãŒãžãäœæããã³ã³ã·ã¥ãŒã (ã¡ãŒã«éç¥ãµãŒãã¹ãªã©) ãã·ã³ã¯ (åºåãããã¯) ãéããŠèšç®ãããå ±æç¶æ ãåãåããŸãã
å³ 3: å
±æãã€ã¯ããµãŒãã¹ã䜿çšããã·ããªãªã®æ°ããã¿ã¹ã¯ ãããŒã®äŸ: 1) ãšãŒãžã§ã³ãã¯ãKafka ãœãŒã¹ ãããã¯ã«å°çããã¡ãã»ãŒãžãçæããŸãã 2) å
±æç¶æ
ãæã€ãã€ã¯ããµãŒãã¹ (Kafka Streams ã䜿çš) ããããåŠçããèšç®ãããç¶æ
ãæçµç㪠Kafka ãããã¯ã«æžã蟌ã¿ãŸãã ãã®åŸ 3) æ¶è²»è
ã¯æ°ããç¶æ
ãåãå
¥ãã
ãã®çµã¿èŸŒã¿ã® Key-Value ã¹ãã¢ã¯å®éã«ã¯éåžžã«äŸ¿å©ã§ãã
äžã§è¿°ã¹ãããã«ãå ±æç¶æ ããããžã«ã¯ããŒãšå€ã®ã¹ãã¢ãå«ãŸããŠããŸãã ããã䜿çšããããã®ãªãã·ã§ã³ãããã€ãèŠã€ãããŸããããã®ãã¡ã® XNUMX ã€ã以äžã«èª¬æããŸãã
ãªãã·ã§ã³ #1: èšç®ã«ããŒãšå€ã®ã¹ãã¢ã䜿çšãã
æåã®ããŒ/å€ã¹ãã¢ã«ã¯ãèšç®ã«å¿
èŠãªè£å©ããŒã¿ãå«ãŸããŠããŸããã ããšãã°ãå Žåã«ãã£ãŠã¯ãå
±æç¶æ
ããå€æ°æ±ºãã®ååã«ãã£ãŠæ±ºå®ãããããšããããŸããã ãªããžããªã«ã¯ããªããžã§ã¯ãã®ã¹ããŒã¿ã¹ã«é¢ããææ°ã®ãšãŒãžã§ã³ã ã¬ããŒãããã¹ãŠä¿åãããŸãã ãã®åŸããããšãŒãžã§ã³ãããæ°ããã¬ããŒããåä¿¡ãããããããä¿åããåããªããžã§ã¯ãã®ç¶æ
ã«é¢ããä»ã®ãã¹ãŠã®ãšãŒãžã§ã³ãããã®ã¬ããŒããã¹ãã¬ãŒãžããååŸããŠãèšç®ãç¹°ãè¿ãããšãã§ããŸãã
以äžã®å³ 4 ã¯ãæ°ããã¡ãã»ãŒãžãåŠçã§ããããã«ãããŒ/å€ã¹ãã¢ãããã»ããµã®åŠçã¡ãœããã«å
¬éããæ¹æ³ã瀺ããŠããŸãã
å³ 4: ããã»ããµã®åŠçã¡ãœããã®ããŒ/å€ã¹ãã¢ãžã®ã¢ã¯ã»ã¹ãéããŸã (ãã®åŸãå
±æç¶æ
ã§åäœãããã¹ãŠã®ã¹ã¯ãªããã¯ã¡ãœãããå®è£
ããå¿
èŠããããŸã) doProcess
)
ãªãã·ã§ã³ #2: Kafka ã¹ããªãŒã äžã« CRUD API ãäœæãã
åºæ¬çãªã¿ã¹ã¯ ãããŒã確ç«ããã®ã§ãç¶æ å ±æãã€ã¯ããµãŒãã¹çšã® RESTful CRUD API ã®äœæãè©Šã¿å§ããŸããã ç§ãã¡ã¯ããªããžã§ã¯ãã®ç¶æ ãèšå®ãŸãã¯åé€ããã ãã§ãªããäžéšãŸãã¯ãã¹ãŠã®ãªããžã§ã¯ãã®ç¶æ ãååŸã§ããããã«ããããšèããŠããŸãã (ããã¯ãšã³ãã®ãµããŒãã«äŸ¿å©ã§ã)ã
ãã¹ãŠã® Get State API ããµããŒãããããã«ãåŠçäžã«ç¶æ ãåèšç®ããå¿ èŠãããå Žåã¯åžžã«ããããçµã¿èŸŒã¿ã®ããŒ/å€ã¹ãã¢ã«é·æéä¿åããŸããã ãã®å Žåã以äžã®ãªã¹ãã«ç€ºãããã«ãKafka Streams ã®åäžã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãã®ãã㪠API ãå®è£ ããã®ãéåžžã«ç°¡åã«ãªããŸãã
å³ 5: çµã¿èŸŒã¿ã®ããŒ/å€ã¹ãã¢ã䜿çšããŠãªããžã§ã¯ãã®äºåèšç®ãããç¶æ
ãååŸãã
API ãä»ããŠãªããžã§ã¯ãã®ç¶æ ãæŽæ°ããããšãç°¡åã«å®è£ ã§ããŸãã åºæ¬çã«ãè¡ãå¿ èŠãããã®ã¯ãKafka ãããã¥ãŒãµãŒãäœæããããã䜿çšããŠæ°ããç¶æ ãå«ãã¬ã³ãŒããäœæããããšã ãã§ãã ããã«ãããAPI ãéããŠçæããããã¹ãŠã®ã¡ãã»ãŒãžããä»ã®ãããã¥ãŒãµãŒ (ãšãŒãžã§ã³ããªã©) ããåä¿¡ããã¡ãã»ãŒãžãšåãæ¹æ³ã§åŠçãããããšãä¿èšŒãããŸãã
å³ 6: Kafka ãããã¥ãŒãµã䜿çšããŠãªããžã§ã¯ãã®ç¶æ
ãèšå®ã§ãã
å°ããªè€éã: Kafka ã«ã¯å€æ°ã®ããŒãã£ã·ã§ã³ããã
次ã«ãã·ããªãªããšã«å ±æç¶æ ã®ãã€ã¯ããµãŒãã¹ã®ã¯ã©ã¹ã¿ãŒãæäŸããããšã§ãåŠçè² è·ãåæ£ããå¯çšæ§ãåäžãããããšèããŸããã ã»ããã¢ããã¯ç°¡åã§ããããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãåãã¢ããªã±ãŒã·ã§ã³ ID (ããã³åãããŒãã¹ãã©ãã ãµãŒããŒ) ã§å®è¡ããããã«èšå®ããããæ®ãã®ã»ãšãã©ãã¹ãŠãèªåçã«è¡ãããŸããã ãŸããåãœãŒã¹ ãããã¯ãè€æ°ã®ããŒãã£ã·ã§ã³ã§æ§æãããããã«æå®ããåã€ã³ã¹ã¿ã³ã¹ã«ãã®ãããªããŒãã£ã·ã§ã³ã®ãµãã»ãããå²ãåœãŠãããšãã§ããããã«ããŸããã
ãŸããç¶æ ã¹ãã¢ã®ããã¯ã¢ãã ã³ããŒãäœæããã®ãäžè¬çã§ããããšã«ãèšåããŸããããã«ãããããšãã°ãé害åŸã®å埩ã®å Žåã«ããã®ã³ããŒãå¥ã®ã€ã³ã¹ã¿ã³ã¹ã«è»¢éã§ããŸãã Kafka Streams ã®ç¶æ ã¹ãã¢ããšã«ãå€æŽãã° (ããŒã«ã«æŽæ°ã远跡ãã) ãå«ãã¬ããªã±ãŒãããããããã¯ãäœæãããŸãã ãããã£ãŠãKafka ã¯ç¶æ ã¹ãã¢ãåžžã«ããã¯ã¢ããããŸãã ãããã£ãŠãXNUMX ã€ãŸãã¯å¥ã® Kafka Streams ã€ã³ã¹ã¿ã³ã¹ã«é害ãçºçããå Žåãç¶æ ã¹ãã¢ãå¥ã®ã€ã³ã¹ã¿ã³ã¹ã«ããã«åŸ©å ã§ãã察å¿ããããŒãã£ã·ã§ã³ãããã«ä¿åãããŸãã ç§ãã¡ã®ãã¹ãã§ã¯ãã¹ãã¢å ã«äœçŸäžãã®ã¬ã³ãŒããããå Žåã§ãããããæ°ç§ã§å®äºããããšãããããŸããã
ç¶æ ãå ±æããåäžã®ãã€ã¯ããµãŒãã¹ãããã€ã¯ããµãŒãã¹ã®ã¯ã©ã¹ã¿ãŒã«ç§»è¡ãããšãGet State API ã®å®è£ ã¯ããã»ã©ç°¡åã§ã¯ãªããªããŸãã æ°ããç¶æ³ã§ã¯ãåãã€ã¯ããµãŒãã¹ã®ç¶æ ã¹ãã¢ã«ã¯ãå šäœå (ããŒãç¹å®ã®ããŒãã£ã·ã§ã³ã«ãããããããªããžã§ã¯ã) ã®äžéšã®ã¿ãå«ãŸããŸãã å¿ èŠãªãªããžã§ã¯ãã®ç¶æ ãã©ã®ã€ã³ã¹ã¿ã³ã¹ã«å«ãŸããŠããããå€æããå¿ èŠãããã以äžã«ç€ºãããã«ãã¹ã¬ããã®ã¡ã¿ããŒã¿ã«åºã¥ããŠãããè¡ããŸããã
å³ 7: ã¹ããªãŒã ã¡ã¿ããŒã¿ã䜿çšããŠãã©ã®ã€ã³ã¹ã¿ã³ã¹ããç®çã®ãªããžã§ã¯ãã®ç¶æ
ãã¯ãšãªãããã決å®ããŸãã åæ§ã®ã¢ãããŒãã GET ALL API ã§äœ¿çšãããŸãã
äž»ãªèª¿æ»çµæ
Kafka Streams ã®ç¶æ ã¹ãã¢ã¯ãäºå®äžã®åæ£ããŒã¿ããŒã¹ãšããŠæ©èœã§ããŸãã
- Kafka å ã§åžžã«è€è£œããã
- CRUD API ã¯ãã®ãããªã·ã¹ãã äžã«ç°¡åã«æ§ç¯ã§ããŸã
- è€æ°ã®ããŒãã£ã·ã§ã³ã®åŠçã¯å°ãè€éã§ã
- è£å©ããŒã¿ãä¿åããããã« XNUMX ã€ä»¥äžã®ç¶æ ã¹ãã¢ãã¹ããªãŒãã³ã° ããããžã«è¿œå ããããšãã§ããŸãã ãã®ãªãã·ã§ã³ã¯æ¬¡ã®ç®çã§äœ¿çšã§ããŸãã
- ã¹ããªãŒã åŠçäžã®èšç®ã«å¿ èŠãªããŒã¿ã®é·æä¿å
- 次åã¹ããªãŒãã³ã° ã€ã³ã¹ã¿ã³ã¹ãããããžã§ãã³ã°ããããšãã«åœ¹ç«ã€å¯èœæ§ãããããŒã¿ã®é·æä¿å
- ãã£ãšãã£ãš...
ãããããã³ãã®ä»ã®å©ç¹ã«ãããKafka Streams ã¯ãç§ãã¡ã®ãããªåæ£ã·ã¹ãã ã§ã°ããŒãã«ç¶æ
ãç¶æããã®ã«é©ããŠããŸãã Kafka Streams ã¯å®çšŒåç°å¢ã§éåžžã«ä¿¡é Œæ§ãé«ãããšã蚌æãããŠãã (ãããã€åŸãã¡ãã»ãŒãžã®æ倱ã¯äºå®äžãããŸãã)ããã®æ©èœãããã ãã«ãšã©ãŸããªããšç§ãã¡ã¯ç¢ºä¿¡ããŠããŸãã
åºæïŒ habr.com