ãããããã«ïŒ
ç§ã¯ç¬èªã®éç¥ã»ã³ã¿ãŒãéçºããŠãã Tinkoff ããŒã ã§åããŠããŸãã 䞻㫠Spring Boot ã䜿çšã㊠Java ã§éçºãããããžã§ã¯ãå ã§çºçããããŸããŸãªæè¡çåé¡ã解決ããŸãã
ãã€ã¯ããµãŒãã¹ã®ã»ãšãã©ã¯ãã¡ãã»ãŒãž ãããŒã«ãŒãéããŠéåæã«çžäºéä¿¡ããŸãã 以åã¯ãIBM MQ ããããŒã«ãŒãšããŠäœ¿çšããŠããŸããããè² è·ã«å¯ŸåŠã§ããªããªããŸããããåæã«é«ãé ä¿¡ä¿èšŒããããŸããã
代ããã«ãApache Kafka ãæäŸãããŸãããããã¯é«ãæ¡åŒµæ§ãåããŠããŸãããæ®å¿µãªããšã«ãããŸããŸãªã·ããªãªã«åãããŠæ§æããã«ã¯ã»ãŒåå¥ã®ã¢ãããŒããå¿ èŠã§ãã ããã«ãKafka ã§ããã©ã«ãã§æ©èœããå°ãªããšã XNUMX åã®é ä¿¡ã¡ã«ããºã ã§ã¯ããã®ãŸãŸã§ã¯å¿ èŠãªã¬ãã«ã®äžè²«æ§ãç¶æã§ããŸããã§ããã 次ã«ãKafka æ§æã«é¢ããçµéšãå ±æããŸããç¹ã«ãXNUMX åéãã®é ä¿¡ãæ§æããŠäœ¿çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã
é éä¿èšŒãªã©
以äžã§èª¬æããèšå®ã¯ãããã©ã«ãã®æ¥ç¶èšå®ã«äŒŽãå€ãã®åé¡ãé²ãã®ã«åœ¹ç«ã¡ãŸãã ãã ããæåã«ããããã°ã容æã«ãã XNUMX ã€ã®ãã©ã¡ãŒã¿ã«æ³šç®ããããšæããŸãã
ããã¯åœ¹ã«ç«ã¡ãŸã ã¯ã©ã€ã¢ã³ãID çç£è ãšæ¶è²»è ã«ãšã£ãŠã äžèŠãããšãã¢ããªã±ãŒã·ã§ã³åãå€ãšããŠäœ¿çšã§ããã»ãšãã©ã®å Žåãããã§æ©èœããŸãã ãã ããã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®ã³ã³ã·ã¥ãŒããŒã䜿çšãããããã«åã client.id ãæå®ãããšã次ã®èŠåã衚瀺ãããŸãã
org.apache.kafka.common.utils.AppInfoParser â Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0
Kafka ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã§ JMX ã䜿çšããå Žåããããåé¡ã«ãªãå¯èœæ§ããããŸãã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³åãšãããã¯åãªã©ãçµã¿åãã㊠client.id å€ãšããŠäœ¿çšããã®ãæåã§ãã æ§æã®çµæã¯ã³ãã³ãåºåã§ç¢ºèªã§ããŸãã kafka-æ¶è²»è ã°ã«ãŒã Confluent ã®ãŠãŒãã£ãªãã£ãã:
次ã«ãã¡ãã»ãŒãžé ä¿¡ãä¿èšŒããã·ããªãªãèŠãŠã¿ãŸãããã Kafka ãããã¥ãŒãµãŒã«ã¯ãã©ã¡ãŒã¿ãŒããããŸã ACKããã«ãããã¯ã©ã¹ã¿ãŒ ãªãŒããŒãã¡ãã»ãŒãžãæ£åžžã«æžã蟌ãŸãããšã¿ãªãããã«å¿ èŠãªç¢ºèªå¿çã®æ°ãæ§æã§ããŸãã ãã®ãã©ã¡ãŒã¿ã«ã¯æ¬¡ã®å€ãæå®ã§ããŸãã
- 0 â 確èªå¿çã¯èæ ®ãããŸããã
- 1 ã¯ããã©ã«ãã®ãã©ã¡ãŒã¿ã§ããã確èªå¿çã«å¿ èŠãªã¬ããªã«ã¯ 1 ã€ã ãã§ãã
- â1 â ãã¹ãŠã®åæãããã¬ããªã«ããã®ç¢ºèªå¿çãå¿ èŠã§ã (ã¯ã©ã¹ã¿ãŒã®ã»ããã¢ãã) min.insync.ã¬ããªã«).
ãªã¹ããããå€ãããacks ã -1 ã«çããå Žåãã¡ãã»ãŒãžã倱ãããªããšããæã匷åãªä¿èšŒãäžããããããšã¯æããã§ãã
åšç¥ã®ãšãããåæ£ã·ã¹ãã ã¯ä¿¡é Œæ§ãäœãã§ãã äžæçãªé害ããä¿è·ããããã«ãKafka ãããã¥ãŒãµãŒã«ã¯æ¬¡ã®ãªãã·ã§ã³ãçšæãããŠããŸãã åè©Šè¡ãåéä¿¡è©Šè¡åæ°ãèšå®ã§ããŸãã é ä¿¡.ã¿ã€ã ã¢ãŠã.msã retries ãã©ã¡ãŒã¿ãŒã®ããã©ã«ãå€ã¯ Integer.MAX_VALUE (2147483647) ã§ãããããã¡ãã»ãŒãžã®åè©Šè¡åæ°ã¯delivery.timeout.ms ã®ã¿ãå€æŽããããšã§èª¿æŽã§ããŸãã
æ£ç¢ºã« XNUMX åã®é ä¿¡ãç®æããŠé²ãã§ããŸã
ãªã¹ããããŠããèšå®ã«ããããããã¥ãŒãµãŒã¯é«ãä¿èšŒã§ã¡ãã»ãŒãžãé ä¿¡ã§ããŸãã ããã§ãã¡ãã»ãŒãžã®ã³ããŒã XNUMX ã€ã ã Kafka ãããã¯ã«æžã蟌ãŸããããã«ããæ¹æ³ã«ã€ããŠè©±ããŸãããã æãåçŽãªã±ãŒã¹ã§ã¯ããããè¡ãã«ã¯ããããã¥ãŒãµãŒã«ãã©ã¡ãŒã¿ãŒãèšå®ããå¿ èŠããããŸãã åªçæ§ãæå¹ã«ãã æ¬åœã®ããšã åªçæ§ã«ãããXNUMX ã€ã®ãããã¯ã®ç¹å®ã®ããŒãã£ã·ã§ã³ã« XNUMX ã€ã®ã¡ãã»ãŒãžã ããæžã蟌ãŸããããšãä¿èšŒãããŸãã åªçæ§ãæå¹ã«ããããã®åææ¡ä»¶ã¯å€ã§ãã acks = ãã¹ãŠãåè©Šè¡ > 0ãæ¥ç¶ããšã®æ倧 in.flight.requests †5ã ãããã®ãã©ã¡ãŒã¿ãéçºè ã«ãã£ãŠæå®ãããŠããªãå Žåãäžèšã®å€ãèªåçã«èšå®ãããŸãã
åªçæ§ãèšå®ãããŠããå Žåã¯ãåãã¡ãã»ãŒãžãæ¯ååãããŒãã£ã·ã§ã³ã«å°éããããã«ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãpartitioner.class ããŒãšãã©ã¡ãŒã¿ãŒããããã¥ãŒãµãŒã«èšå®ããŸãã éµããå§ããŸãããã åæåºç©ã§åãã§ããå¿
èŠããããŸãã ããã¯ãå
ã®æçš¿ã®ããžãã¹ ID ã䜿çšããããšã§ç°¡åã«å®çŸã§ããŸãã Partitioner.classãã©ã¡ãŒã¿ã«ã¯ããã©ã«ãå€ããããŸã-
- ã¡ãã»ãŒãžã®éä¿¡æã«ããŒãã£ã·ã§ã³ãæ瀺çã«æå®ãããŠããå Žåã¯ãããã䜿çšãããŸãã
- ããŒãã£ã·ã§ã³ãæå®ãããŠããªãããããŒãæå®ãããŠããå Žåã¯ãããŒã®ããã·ã¥ã«ãã£ãŠããŒãã£ã·ã§ã³ãéžæããŸãã
- ããŒãã£ã·ã§ã³ãšããŒãæå®ãããŠããªãå Žåã¯ãããŒãã£ã·ã§ã³ã XNUMX ã€ãã€éžæããŸã (ã©ãŠã³ãããã³)ã
ãŸããããŒã䜿çšãããã©ã¡ãŒã¿ãŒã䜿çšããŠåªçã§éä¿¡ãã æ¥ç¶ããšã®æ倧ãã©ã€ããªã¯ãšã¹ãæ° = 1 Consumer ã§ã®ã¡ãã»ãŒãžåŠçãåçåããŸãã ãŸããã¯ã©ã¹ã¿ãŒã«ã¢ã¯ã»ã¹å¶åŸ¡ãæ§æãããŠããå Žåã¯ããããã¯ã«åªçã«æžã蟌ãæš©éãå¿ èŠã«ãªãããšã«ã泚æããŠãã ããã
çªç¶ãããŒã«ããåªçéä¿¡æ©èœããªããªã£ããããããã¥ãŒãµãŒåŽã®ããžãã¯ã§ç°ãªãããŒãã£ã·ã§ã³éã§ããŒã¿ã®äžè²«æ§ãç¶æããå¿ èŠãããå Žåã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã圹ã«ç«ã¡ãŸãã ããã«ããã§ãŒã³ ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãããšãããšãã° Kafka ã®ã¬ã³ãŒããããŒã¿ããŒã¹ã®ã¬ã³ãŒããšæ¡ä»¶ä»ãã§åæã§ããŸãã ãããã¥ãŒãµãžã®ãã©ã³ã¶ã¯ã·ã§ã³éä¿¡ãæå¹ã«ããã«ã¯ãã¹ãçã§ãããããã«èšå®ããå¿ èŠããããŸãã ãã©ã³ã¶ã¯ã·ã§ã³IDã Kafka ã¯ã©ã¹ã¿ãŒã«ã¢ã¯ã»ã¹å¶åŸ¡ãæ§æãããŠããå Žåãåªçã¬ã³ãŒããªã©ã®ãã©ã³ã¶ã¯ã·ã§ã³ ã¬ã³ãŒãã«ã¯æžã蟌ã¿ã¢ã¯ã»ã¹èš±å¯ãå¿ èŠã«ãªããŸããããã¯ãtransactional.id ã«æ ŒçŽãããŠããå€ã䜿çšããŠãã¹ã¯ã«ãã£ãŠä»äžã§ããŸãã
æ£åŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³åãªã©ã®ä»»æã®æååããã©ã³ã¶ã¯ã·ã§ã³èå¥åãšããŠäœ¿çšã§ããŸãã ãã ããåãtransactional.idã䜿çšããŠåãã¢ããªã±ãŒã·ã§ã³ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãèµ·åãããšãæåã«èµ·åããã€ã³ã¹ã¿ã³ã¹ã¯ãšã©ãŒã§åæ¢ããŸããããã¯ãKafkaãããããŸã³ãããã»ã¹ãšèŠãªãããã§ãã
org.apache.kafka.common.errors.ProducerFencedException: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer's transaction has been expired by the broker.
ãã®åé¡ã解決ããã«ã¯ãç°å¢å€æ°ããååŸãããã¹ãåã®åœ¢åŒã§ã¢ããªã±ãŒã·ã§ã³åã«ãµãã£ãã¯ã¹ãè¿œå ããŸãã
ãããã¥ãŒãµã¯æ§æãããŠããŸãããKafka äžã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¡ãã»ãŒãžã®ã¹ã³ãŒãã®ã¿ãå¶åŸ¡ããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¹ããŒã¿ã¹ã«é¢ä¿ãªããã¡ãã»ãŒãžã¯ããã«ãããã¯ã«ç§»åããŸãããè¿œå ã®ã·ã¹ãã å±æ§ããããŸãã
ãã®ãããªã¡ãã»ãŒãžãã³ã³ã·ã¥ãŒãã«ãã£ãŠäºåã«èªã¿åãããã®ãé²ãã«ã¯ããã©ã¡ãŒã¿ãèšå®ããå¿
èŠããããŸãã åé¢ã¬ãã« read_committed å€ã«ã ãã®ãããªã³ã³ã·ã¥ãŒãã¯ã以åãšåæ§ã«éãã©ã³ã¶ã¯ã·ã§ã³ ã¡ãã»ãŒãžãèªã¿åãããšãã§ããŸããããã©ã³ã¶ã¯ã·ã§ã³ ã¡ãã»ãŒãžã¯ã³ãããåŸã«ã®ã¿èªã¿åãããšãã§ããŸãã
åã«ãªã¹ããããã¹ãŠã®èšå®ãè¡ã£ãŠããå Žåã¯ãXNUMX åéãã®é
ä¿¡ãæ§æãããŠããŸãã ããã§ãšãïŒ
ããããããäžã€ãã¥ã¢ã³ã¹ããããŸãã äžèšã§æ§æãã Transactional.id ã¯ãå®éã«ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®ãã¬ãã£ãã¯ã¹ã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ ãããŒãžã£ãŒã§ã¯ãã·ãŒã±ã³ã¹çªå·ãè¿œå ãããŸãã åä¿¡ããèå¥åã¯æ¬¡ã®ããã«çºè¡ãããŸãã transactional.id.expiration.msãã㯠Kafka ã¯ã©ã¹ã¿ãŒäžã«æ§æãããŠãããããã©ã«ãå€ã¯ã7 æ¥ãã§ãã ãã®éã«ã¢ããªã±ãŒã·ã§ã³ãã¡ãã»ãŒãžãåä¿¡ããªãã£ãå Žåã次ã®ãã©ã³ã¶ã¯ã·ã§ã³éä¿¡ãè©Šè¡ãããšã次ã®ã¡ãã»ãŒãžãéä¿¡ãããŸãã InvalidPidMappingExceptionã ãã©ã³ã¶ã¯ã·ã§ã³ ã³ãŒãã£ããŒã¿ãŒã¯ã次ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æ°ããã·ãŒã±ã³ã¹çªå·ãçºè¡ããŸãã ãã ããInvalidPidMappingException ãæ£ããåŠçãããªãå Žåãã¡ãã»ãŒãžã倱ãããå¯èœæ§ããããŸãã
åèšã®ä»£ããã«
ã芧ã®ãšãããåã« Kafka ã«ã¡ãã»ãŒãžãéä¿¡ããã ãã§ã¯ååã§ã¯ãããŸããã ãã©ã¡ãŒã¿ã®çµã¿åãããéžæããããã«å€æŽã§ããããã«æºåããå¿ èŠããããŸãã ãã®èšäºã§ã¯ãXNUMX åéãã®é ä¿¡èšå®ã詳现ã«ç€ºããééãã client.id ããã³transactional.id èšå®ã«é¢ããããã€ãã®åé¡ã«ã€ããŠèª¬æããŸããã 以äžã¯ããããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒã®èšå®ã®æŠèŠã§ãã
ãããã¥ãŒãµãŒïŒ
- ACK = ãã¹ãŠ
- åè©Šè¡åæ° > 0
- ã€ããŒãã«.åªçæ§ = true
- max.in.flight.requests.per.connection †5 (é åºã©ããã«éä¿¡ããå Žå㯠1)
- transactional.id = ${ã¢ããªã±ãŒã·ã§ã³å}-${ãã¹ãå}
æ¶è²»è ïŒ
- isolation.level = read_committed
å°æ¥ã®ã¢ããªã±ãŒã·ã§ã³ã§ã®ãšã©ãŒãæå°éã«æããããã«ããªã¹ãããããã©ã¡ãŒã¿ã®äžéšã®å€ããã§ã«èšå®ãããŠããã¹ããªã³ã°æ§æã«å¯Ÿããç¬èªã®ã©ãããŒãäœæããŸããã
ç¬ç¿çšã®ææãããã€ã玹ä»ããŸãã
åºæïŒ habr.com