{"id":56186,"date":"2020-02-06T00:00:00","date_gmt":"2020-02-05T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka"},"modified":"2020-02-18T14:04:24","modified_gmt":"2020-02-18T11:04:24","slug":"povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka","title":{"rendered":"Riprocesimi i ngjarjeve t\u00eb marra nga Kafka","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Riprocesimi i ngjarjeve t\u00eb marra nga Kafka\" src=\"\/wp-content\/uploads\/2020\/02\/d04319691af5c5de40ccfe4a2268558c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebrsh\u00ebndetje, Habr.<\/p>\n<p><\/p>\n<p>S\u00eb fundmi un\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/481784\/\">ndava p\u00ebrvoj\u00eb<\/a><\/noindex> rreth parametrave q\u00eb ekipi yn\u00eb shpesh i p\u00ebrdor p\u00ebr Kafka Producer dhe Consumer, p\u00ebr t'u afruar pran\u00eb d\u00ebrges\u00ebs s\u00eb garantuar. N\u00eb k\u00ebt\u00eb artikull d\u00ebshiroj t\u00eb flas p\u00ebr m\u00ebnyr\u00ebn se si organizuam riciklimin e ngjarjeve, t\u00eb marra nga Kafka, si rezultat i papjeshm\u00ebris\u00eb p\u00ebr koh\u00eb nga nj\u00eb sistem t\u00eb jasht\u00ebm.<\/p>\n<p><\/p>\n<p>Aplikacionet moderne funksionojn\u00eb n\u00eb nj\u00eb ambient shum\u00eb kompleks. Logjika e biznesit, e mb\u00ebshtjell\u00eb n\u00eb nj\u00eb tech stack modern, duke funksionuar n\u00eb nj\u00eb imazh Docker, i menaxhuar nga nj\u00eb orkestrator si Kubernetes ose OpenShift, dhe duke komunikuar me aplikacione t\u00eb tjera ose zgjidhje enterprise p\u00ebrmes nj\u00eb zinxhiri ruterash fizik\u00eb dhe virtual\u00eb. N\u00eb nj\u00eb ambient t\u00eb till\u00eb gjithmon\u00eb di\u00e7ka mund t\u00eb prishet, prandaj riciklimi i ngjarjeve n\u00eb rastin e papjeshm\u00ebris\u00eb s\u00eb nj\u00ebrit prej sistemeve t\u00eb jashtme \u00ebsht\u00eb nj\u00eb pjes\u00eb e r\u00ebnd\u00ebsishme e proceseve tona t\u00eb biznesit.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"kak-bylo-do-kafka\">Si ishte para Kafka<\/h2>\n<p><\/p>\n<p>M\u00eb par\u00eb n\u00eb projekt ne p\u00ebrdornim IBM MQ p\u00ebr d\u00ebrgimin asinkron t\u00eb mesazheve. Kur ndodhte ndonj\u00eb gabim n\u00eb procesin e funksionimit t\u00eb sh\u00ebrbimit, mesazhi i marr\u00eb mund t\u00eb vendosej n\u00eb dead-letter-queue (DLQ) p\u00ebr shqyrtim manual. DLQ krijohej pran\u00eb radh\u00ebs hyr\u00ebse, dhe zhvendosja e mesazheve ndodhte brenda IBM MQ. <\/p>\n<p><\/p>\n<p>N\u00ebse gabimi kishte natyr\u00eb t\u00eb p\u00ebrkohshme dhe ne mund ta p\u00ebrcaktonim k\u00ebt\u00eb (p.sh., ResourceAccessException gjat\u00eb thirrjes HTTP ose MongoTimeoutException gjat\u00eb k\u00ebrkes\u00ebs n\u00eb MongoDb), at\u00ebher\u00eb hyhej n\u00eb strategjin\u00eb e rip\u00ebrpjekjeve. Pavar\u00ebsisht nga deg\u00ebzimi i logjik\u00ebs s\u00eb aplikacionit, mesazhi origjinal zhvendosej ose n\u00eb radh\u00ebn sistematike p\u00ebr d\u00ebrges\u00eb t\u00eb vonuar, ose n\u00eb nj\u00eb aplikacion t\u00eb ve\u00e7ant\u00eb q\u00eb ishte b\u00ebr\u00eb dikur p\u00ebr rip\u00ebrs\u00ebritjen e mesazheve. Gjat\u00eb k\u00ebsaj periudhe, n\u00eb titullin e mesazhit ruheshin numri i rip\u00ebrs\u00ebritjeve, i lidhur me intervalin e vones\u00ebs ose me fundin e strategjis\u00eb n\u00eb nivel aplikacioni. N\u00ebse arrijm\u00eb n\u00eb fundin e strategjis\u00eb, por sistemi i jasht\u00ebm ende nuk \u00ebsht\u00eb i aksesuesh\u00ebm, mesazhi do t\u00eb vendoset n\u00eb DLQ p\u00ebr shqyrtim manual.<\/p>\n<p><\/p>\n<h2 id=\"poisk-resheniya\">K\u00ebrkimi i zgjidhjes<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.google.com\/search?q=kafka+retry+message\">Pas k\u00ebrkimit n\u00eb internet<\/a><\/noindex>, mund t\u00eb gjenden k\u00ebto <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.pragmatists.com\/retrying-consumer-architecture-in-the-apache-kafka-939ac4cb851a\">zgjidhje<\/a><\/noindex>. N\u00ebse e p\u00ebrmbledhim, propozohet t\u00eb krijohet nj\u00eb tem\u00eb p\u00ebr \u00e7do interval vonese dhe t\u00eb zbatohen n\u00eb an\u00ebn e aplikacionit konsumator\u00ebt q\u00eb do t\u00eb lexojn\u00eb mesazhet me vones\u00ebn e nevojshme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Riprocesimi i ngjarjeve t\u00eb marra nga Kafka\" src=\"\/wp-content\/uploads\/2020\/02\/718c4c3f71ccf95b5a6f60e1b2c685d2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pavar\u00ebsisht numrit t\u00eb madh t\u00eb komenteve pozitive, duket se nuk \u00ebsht\u00eb shum\u00eb e suksesshme. N\u00eb radh\u00eb t\u00eb par\u00eb p\u00ebr shkak se zhvilluesi, p\u00ebrve\u00e7 zbatimit t\u00eb k\u00ebrkesave t\u00eb biznesit, do t\u00eb duhet t\u00eb kaloj\u00eb shum\u00eb koh\u00eb n\u00eb zbatimin e mekanizmit t\u00eb p\u00ebrshkruar.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, n\u00ebse menaxhimi i aksesit \u00ebsht\u00eb i aktivizuar n\u00eb klasterin Kafka, do t\u00eb duhet t\u00eb kaloni nj\u00eb koh\u00eb p\u00ebr t\u00eb krijuar temat dhe p\u00ebr t\u00eb siguruar akseset e nevojshme p\u00ebr to. P\u00ebrve\u00e7 k\u00ebsaj, do t\u00eb jet\u00eb e nevojshme t\u00eb p\u00ebrcaktohet parametrin e duhur retention.ms p\u00ebr \u00e7do tem\u00eb t\u00eb riangazhimit, n\u00eb m\u00ebnyr\u00eb q\u00eb mesazhet t\u00eb d\u00ebrgohen p\u00ebrs\u00ebri dhe t\u00eb mos humbasin prej saj. Zbatimi dhe k\u00ebrkesa p\u00ebr akses do t\u00eb duhet t\u00eb p\u00ebrs\u00ebritet p\u00ebr \u00e7do sh\u00ebrbim ekzistues ose t\u00eb ri.<\/p>\n<p><\/p>\n<p>Tani le t\u00eb shikojm\u00eb se cilat mekanizma p\u00ebr p\u00ebrpunimin e p\u00ebrs\u00ebritur t\u00eb mesazheve na ofron spring n\u00eb p\u00ebrgjith\u00ebsi dhe spring-kafka n\u00eb ve\u00e7anti. Spring-kafka ka nj\u00eb var\u00ebsi transitive n\u00eb spring-retry, e cila ofron abstrahqione p\u00ebr menaxhimin e politikave t\u00eb ndryshme t\u00eb BackOff. Ky \u00ebsht\u00eb nj\u00eb mjet mjaft fleksib\u00ebl, por nj\u00eb nga disavantazhet e saj t\u00eb r\u00ebnd\u00ebsishme \u00ebsht\u00eb ruajtja e mesazheve p\u00ebr riciklim n\u00eb memorien e aplikacionit. Kjo do t\u00eb thot\u00eb se rinisja e aplikacionit p\u00ebr shkak t\u00eb nj\u00eb p\u00ebrdit\u00ebsimi ose gabimi gjat\u00eb operimit do t\u00eb sjell\u00eb humbjen e t\u00eb gjitha mesazheve q\u00eb presin p\u00ebrpunim t\u00eb p\u00ebrs\u00ebritur. Pasi ky pik\u00eb \u00ebsht\u00eb kritik p\u00ebr sistemin ton\u00eb, ne nuk vendos\u00ebm ta shqyrtojm\u00eb m\u00eb tej.<\/p>\n<p><\/p>\n<p>Vet\u00eb spring-kafka ofron disa realizime t\u00eb ContainerAwareErrorHandler, p\u00ebr shembull <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-projects\/spring-kafka\/blob\/master\/spring-kafka\/src\/main\/java\/org\/springframework\/kafka\/listener\/SeekToCurrentErrorHandler.java\">SeekToCurrentErrorHandler<\/a><\/noindex>, me an\u00eb t\u00eb t\u00eb cilit mund t\u00eb p\u00ebrpunoni mesazhin m\u00eb von\u00eb, pa e l\u00ebvizur offset-in n\u00eb rast t\u00eb nj\u00eb gabimi. Duke filluar nga versioni spring-kafka 2.3, u b\u00eb e mundur t\u00eb p\u00ebrcaktoni BackOffPolicy.<\/p>\n<p><\/p>\n<p>Ky qasje lejon q\u00eb mesazhet e riprocesueshme t\u00eb p\u00ebrjetojn\u00eb rinisjen e aplikacionit, por mekanizmi DLQ ende mungon. Ky \u00ebsht\u00eb opsioni q\u00eb ne zgjodh\u00ebm n\u00eb fillim t\u00eb vitit 2019, me optimizmin se DLQ nuk do t\u00eb ishte e nevojshme (na ka p\u00ebrkufizuar dhe me t\u00eb v\u00ebrtet\u00eb nuk u desh p\u00ebr disa muaj shfryt\u00ebzimi t\u00eb aplikacionit me k\u00ebt\u00eb sistem riprocesimi). Gabimet p\u00ebrkoh\u00ebsore e shkaktuan aktivizimin e SeekToCurrentErrorHandler. Gabimet e tjera u regjistruan n\u00eb log, shkaktuan zhvendosjen e offset, dhe p\u00ebrpunimi vazhdoi me mesazhin tjet\u00ebr.<\/p>\n<p><\/p>\n<h2 id=\"itogovoe-reshenie\">Zgjidhja p\u00ebrfundimtare<\/h2>\n<p><\/p>\n<p>Realizimi, i bazuar n\u00eb SeekToCurrentErrorHandler, na nxit\u00ebn t\u00eb zhvillojm\u00eb mekanizmin ton\u00eb p\u00ebr ricel\u00ebsimin e mesazheve.<\/p>\n<p><\/p>\n<p>N\u00eb radh\u00eb t\u00eb par\u00eb, ne d\u00ebshironim t\u00eb shfryt\u00ebzonim p\u00ebrvoj\u00ebn ekzistuese dhe ta zgjeronim at\u00eb sipas logjik\u00ebs s\u00eb aplikacionit. P\u00ebr nj\u00eb aplikacion me logjik\u00eb lineare, do t\u00eb ishte optimale t\u00eb ndalosh leximin e mesazheve t\u00eb reja p\u00ebr nj\u00eb periudh\u00eb t\u00eb vog\u00ebl kohe, t\u00eb caktuar n\u00eb kuad\u00ebr t\u00eb strategjis\u00eb s\u00eb rip\u00ebrs\u00ebritjes. P\u00ebr aplikacionet e tjera, do t\u00eb d\u00ebshironim nj\u00eb pik\u00eb t\u00eb vetme q\u00eb do t\u00eb siguroj\u00eb zbatimin e strategjis\u00eb s\u00eb rip\u00ebrs\u00ebritjes. P\u00ebr m\u00eb tep\u00ebr, kjo pik\u00eb e vetme duhet t\u00eb ket\u00eb funksionalitetin DLQ p\u00ebr t\u00eb dy qasjet.<\/p>\n<p><\/p>\n<p>Strategjia e vet\u00eb rip\u00ebrs\u00ebritjes duhet t\u00eb ruhet n\u00eb aplikacionin q\u00eb \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr marrjen e intervalit t\u00eb ardhsh\u00ebm n\u00eb rast t\u00eb nj\u00eb gabimi temporal.<\/p>\n<p><\/p>\n<h3 id=\"ostanovka-consumera-dlya-prilozheniya-s-lineynoy-logikoy\">Ndalimi i Consumer-it p\u00ebr aplikacionin me logjik\u00eb lineare<\/h3>\n<p><\/p>\n<p>Kur punoni me spring-kafka, kodi p\u00ebr ndalimin e Consumer-it mund t\u00eb duket paksa k\u00ebshtu:<\/p>\n<p><\/p>\n<pre><code class=\"java\">public void pauseListenerContainer(MessageListenerContainer listenerContainer, \n                                   Instant retryAt) {\n        if (nonNull(retryAt) &amp;&amp; listenerContainer.isRunning()) {\n            listenerContainer.stop();\n            taskScheduler.schedule(() -&gt; listenerContainer.start(), retryAt);\n            return;\n        }\n        \/\/ te DLQ\n    }<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb shembullin retryAt, \u00ebsht\u00eb koha kur duhet t\u00eb rifilloni p\u00ebrs\u00ebri MessageListenerContainer n\u00ebse ai \u00ebsht\u00eb akoma n\u00eb funksion. Rifillimi do t\u00eb ndodh\u00eb n\u00eb nj\u00eb thread t\u00eb ve\u00e7ant\u00eb, i cili do t\u00eb nis\u00eb n\u00eb TaskScheduler, zbatimin e t\u00eb cilit e ofron gjithashtu spring. <\/p>\n<p><\/p>\n<p>Vlera retryAt gjendet n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb:<\/p>\n<p><\/p>\n<ol>\n<li>K\u00ebrkohet vlera e num\u00ebruesit t\u00eb rip\u00ebrs\u00ebritjeve.<\/li>\n<li>Pavar\u00ebsisht nga vlera e num\u00ebruesit, k\u00ebrkohet intervali aktual i vones\u00ebs n\u00eb strategjin\u00eb e rip\u00ebrs\u00ebritjeve. Strategjia shpallet n\u00eb aplikacionin vet\u00eb, dhe p\u00ebr ruajtjen e saj ne zgjodh\u00ebm formatin JSON.<\/li>\n<li>Intervali i gjetur n\u00eb masivin JSON p\u00ebrmban numrin e sekondave pas t\u00eb cilave do t\u00eb nevojitet t\u00eb rip\u00ebrs\u00ebritet p\u00ebrpunimi. Ky num\u00ebr sekondash shtohet n\u00eb koh\u00ebn aktuale, duke formuar vler\u00ebn p\u00ebr retryAt.<\/li>\n<li>N\u00ebse intervali nuk gjendet, vlera retryAt \u00ebsht\u00eb null dhe mesazhi do t\u00eb d\u00ebrgohet n\u00eb DLQ p\u00ebr shqyrtim manual.<\/li>\n<\/ol>\n<p><\/p>\n<p>Me k\u00ebt\u00eb qasje, mbetet vet\u00ebm t\u00eb ruhet numri i thirrjeve t\u00eb p\u00ebrs\u00ebritura p\u00ebr \u00e7do mesazh q\u00eb \u00ebsht\u00eb aktualisht n\u00eb proces, p\u00ebr shembull n\u00eb memorien e aplikacionit. Ruajtja e numrit t\u00eb p\u00ebrpjekjeve n\u00eb memorie nuk \u00ebsht\u00eb kritike p\u00ebr k\u00ebt\u00eb qasje, pasi aplikacioni me logjik\u00eb lineare nuk mund t\u00eb kryej\u00eb p\u00ebrpunimin n\u00eb t\u00ebr\u00ebsi. Ndryshe nga spring-retry, rind\u00ebrtimi i aplikacionit nuk do t\u00eb \u00e7oj\u00eb n\u00eb humbjen e t\u00eb gjith\u00eb mesazheve p\u00ebr p\u00ebrs\u00ebritje, por thjesht do t\u00eb rinis\u00eb strategjin\u00eb. <\/p>\n<p><\/p>\n<p>Kjo qasje ndihmon n\u00eb leht\u00ebsimin e ngarkes\u00ebs n\u00eb sistemin e jasht\u00ebm, i cili mund t\u00eb jet\u00eb i paaksesuesh\u00ebm p\u00ebr shkak t\u00eb nj\u00eb ngarkese shum\u00eb t\u00eb lart\u00eb. N\u00eb fjal\u00eb t\u00eb tjera, p\u00ebrve\u00e7 p\u00ebrpunimit t\u00eb p\u00ebrs\u00ebritur, ne arrit\u00ebm implementimin e modelit. <noindex><a rel=\"nofollow\" href=\"https:\/\/microservices.io\/patterns\/reliability\/circuit-breaker.html\">circuit breaker<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>N\u00eb rastin ton\u00eb, pragu i gabimit \u00ebsht\u00eb vet\u00ebm 1, dhe p\u00ebr t\u00eb minimizuar pezullimin e sistemit p\u00ebr shkak t\u00eb nj\u00eb nd\u00ebrprerjeje t\u00eb p\u00ebrkohshme rrjetore, ne p\u00ebrdorim nj\u00eb strategji shum\u00eb t\u00eb detajuar p\u00ebr thirrjet e p\u00ebrs\u00ebritura me intervale t\u00eb vogla vonesash. Kjo mund t\u00eb mos jet\u00eb e p\u00ebrshtatshme p\u00ebr t\u00eb gjith\u00eb aplikacionet e grupit t\u00eb kompanive, prandaj raporti midis pragut t\u00eb gabimit dhe madh\u00ebsis\u00eb s\u00eb intervalit duhet t\u00eb p\u00ebrshtatet, duke u bazuar n\u00eb karakteristikat e sistemit.<\/p>\n<p><\/p>\n<h3 id=\"otdelnoe-prilozhenie-dlya-obrabotki-soobscheniy-ot-prilozheniy-s-nedeterminirovannoy-logikoy\">Nj\u00eb aplikacion i ve\u00e7ant\u00eb p\u00ebr p\u00ebrpunimin e mesazheve nga aplikacionet me logjik\u00eb t\u00eb pacaktuar.<\/h3>\n<p><\/p>\n<p>Ja nj\u00eb shembull kodi q\u00eb d\u00ebrgon nj\u00eb mesazh n\u00eb nj\u00eb aplikacion t\u00eb till\u00eb (Retryer), i cili do t\u00eb p\u00ebrs\u00ebris\u00eb d\u00ebrgimin n\u00eb tem\u00ebn DESTINATION kur t\u00eb arrihet koha RETRY_AT:<\/p>\n<p><\/p>\n<pre><code class=\"java\">\npublic &lt;K, V&gt; void retry(ConsumerRecord&lt;K, V&gt; record, String retryToTopic, \n                         Instant retryAt, String counter, String groupId, Exception e) {\n        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());\n        List&lt;Header&gt; arrayOfHeaders = \n            new ArrayList&lt;&gt;(Arrays.asList(headers.toArray()));\n        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);\n        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);\n        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, \n                     () -&gt; Integer.toString(record.partition()).getBytes());\n        if (nonNull(retryAt)) {\n            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);\n            updateHeader(arrayOfHeaders, SEND_TO, &quot;retry&quot;::getBytes);\n            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);\n        } else {\n            updateHeader(arrayOfHeaders, REASON, \n                         ExceptionUtils.getStackTrace(e)::getBytes);\n            updateHeader(arrayOfHeaders, SEND_TO, &quot;backout&quot;::getBytes);\n        }\n        ProducerRecord&lt;K, V&gt; messageToSend =\n            new ProducerRecord&lt;&gt;(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);\n        kafkaTemplate.send(messageToSend);\n    }<\/code><\/pre>\n<p><\/p>\n<p>Nga shembulli shihet se shum\u00eb informacione d\u00ebrgohen n\u00eb headra. Vlera RETRY_AT \u00ebsht\u00eb e nj\u00ebjt\u00eb si p\u00ebr mekanizmin e p\u00ebrs\u00ebritjes p\u00ebrmes ndalimit t\u00eb Consumer-it. P\u00ebrve\u00e7 DESTINATION dhe RETRY_AT, ne d\u00ebrgojm\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>GROUP_ID, me t\u00eb cilin grupojm\u00eb mesazhet p\u00ebr analiz\u00eb manuale dhe thjeshtimin e k\u00ebrkimit.<\/li>\n<li>ORIGINAL_PARTITION, p\u00ebr t\u00eb p\u00ebrpjekur t\u00eb ruajm\u00eb t\u00eb nj\u00ebjtin Consumer p\u00ebr riprocesim. Ky parametr mund t\u00eb jet\u00eb null, n\u00eb k\u00ebt\u00eb rast do t\u00eb merret nj\u00eb partition e re sipas \u00e7el\u00ebsit record.key() t\u00eb mesazhit origjinal.<\/li>\n<li>Vlera e p\u00ebrdit\u00ebsuar COUNTER, p\u00ebr t\u00eb ndjekur strategjin\u00eb e rikthimeve.<\/li>\n<li>SEND_TO \u2014 konstanta q\u00eb tregon n\u00ebse duhet t\u00eb d\u00ebrgohet mesazhi p\u00ebr rip\u00ebrpunim kur t\u00eb arrihet RETRY_AT, apo t\u00eb vendoset n\u00eb DLQ.<\/li>\n<li>REASON \u2014 arsyen pse p\u00ebrpunimi i mesazhit u nd\u00ebrpre.<\/li>\n<\/ul>\n<p><\/p>\n<p>Retryer ruan mesazhet p\u00ebr rip\u00ebrpunim dhe analiz\u00eb manuale n\u00eb PostgreSQL. Nj\u00eb detyr\u00eb aktivizohet nga timer-i, e cila gjen mesazhet me RETRY_AT t\u00eb skaduar dhe i d\u00ebrgon ato p\u00ebrs\u00ebri n\u00eb partition ORIGINAL_PARTITION t\u00eb tem\u00ebs DESTINATION me \u00e7el\u00ebsin record.key().<\/p>\n<p><\/p>\n<p>Pas d\u00ebrgimit, mesazhet fshihen nga PostgreSQL. Analiza manuale e mesazheve kryhet n\u00eb nj\u00eb UI t\u00eb thjesht\u00eb, i cili nd\u00ebrvepron me Retryer n\u00ebp\u00ebrmjet REST API. Ve\u00e7orit\u00eb e tij kryesore jan\u00eb p\u00ebrs\u00ebritja ose fshirja e mesazheve nga DLQ, shikimi i informacionit p\u00ebr gabimin dhe k\u00ebrkimi i mesazheve, p\u00ebr shembull sipas emrit t\u00eb gabimit. <\/p>\n<p><\/p>\n<p>Duke qen\u00eb se n\u00eb klaster\u00ebt tan\u00eb \u00ebsht\u00eb aktivizuar menaxhimi i aksesit, nevojitet t\u00eb k\u00ebrkohen ve\u00e7mas akseset p\u00ebr tem\u00ebn q\u00eb d\u00ebgjon Retryer, dhe t\u00eb jepet mund\u00ebsia q\u00eb Retryer t\u00eb shkruaj\u00eb n\u00eb tem\u00ebn DESTINATION. Kjo \u00ebsht\u00eb e pak\u00ebndshme, por, ndryshe nga qasja me tem\u00ebn n\u00eb interval, ne marrim nj\u00eb DLQ t\u00eb plot\u00eb dhe nj\u00eb UI p\u00ebr menaxhimin e saj.<\/p>\n<p><\/p>\n<p>Ka raste kur tema hyr\u00ebse lexohet nga disa grupe t\u00eb ndryshme konsumator\u00ebsh, aplikacionet e t\u00eb cil\u00ebve implementojn\u00eb logjik\u00eb t\u00eb ndryshme. P\u00ebrs\u00ebritja e trajtimit t\u00eb mesazhit p\u00ebrmes Retryer p\u00ebr nj\u00eb prej k\u00ebtyre aplikacioneve do t\u00eb \u00e7oj\u00eb n\u00eb nj\u00eb kopje n\u00eb tjetrin. P\u00ebr t\u00eb mbrojtur veten nga kjo, ne krijojm\u00eb nj\u00eb tem\u00eb t\u00eb ve\u00e7ant\u00eb p\u00ebr p\u00ebrpunimin e p\u00ebrs\u00ebritur. Tema hyr\u00ebse dhe retry-tema mund t\u00eb lexohen nga i nj\u00ebjti Konsumator pa asnj\u00eb kufizim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Riprocesimi i ngjarjeve t\u00eb marra nga Kafka\" src=\"\/wp-content\/uploads\/2020\/02\/06f2355839c6dd812ee3304bf2c72226.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb p\u00ebrfundim, ky qasje nuk ofron mund\u00ebsi p\u00ebr nj\u00eb circuit breaker, megjithat\u00eb, mund t\u00eb shtohet n\u00eb aplikacion duke p\u00ebrdorur <noindex><a rel=\"nofollow\" href=\"https:\/\/spring.io\/projects\/spring-cloud-netflix\">spring-cloud-netflix<\/a><\/noindex> ose t\u00eb reja <noindex><a rel=\"nofollow\" href=\"https:\/\/spring.io\/projects\/spring-cloud-circuitbreaker\">spring cloud circuit breaker<\/a><\/noindex>, duke u mbuluar vendet e thirrjeve t\u00eb sh\u00ebrbimeve t\u00eb jashtme me abstraksione p\u00ebrkat\u00ebse. P\u00ebr m\u00eb tep\u00ebr, shfaqet mund\u00ebsia e zgjedhjes s\u00eb strategjis\u00eb p\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/architecture\/patterns\/bulkhead\">bulkhead<\/a><\/noindex> patterns, q\u00eb gjithashtu mund t\u00eb jet\u00eb e dobishme. P\u00ebr shembull, n\u00eb spring-cloud-netflix, kjo mund t\u00eb jet\u00eb nj\u00eb thread pool ose semafor.<\/p>\n<p><\/p>\n<h2 id=\"vyvod\">P\u00ebrfundim<\/h2>\n<p><\/p>\n<p>Si rezultat, kemi marr\u00eb nj\u00eb aplikacion t\u00eb ve\u00e7ant\u00eb q\u00eb lejon p\u00ebrs\u00ebritjen e p\u00ebrpunimit t\u00eb mesazhit n\u00eb rast t\u00eb pap\u00ebrfshirjes p\u00ebrkoh\u00ebsisht t\u00eb ndonj\u00eb sistemi t\u00eb jasht\u00ebm.<\/p>\n<p><\/p>\n<p>Nj\u00eb nga p\u00ebrfitimet kryesore t\u00eb aplikacionit \u00ebsht\u00eb se mund t\u00eb p\u00ebrdoret nga sisteme t\u00eb jashtme q\u00eb punojn\u00eb n\u00eb t\u00eb nj\u00ebjtin Kafka-cluster, pa nevoj\u00ebn p\u00ebr p\u00ebrmir\u00ebsime t\u00eb m\u00ebdha nga ana e tyre! Ky aplikacion do t\u00eb ket\u00eb nevoj\u00eb vet\u00ebm t\u00eb aksesoj\u00eb retry-tem\u00ebn, t\u00eb plot\u00ebsoj\u00eb disa Kafka-header dhe t\u00eb d\u00ebrgoj\u00eb mesazhin n\u00eb Retryer. Nuk ka nevoj\u00eb t\u00eb ngrihet ndonj\u00eb infrastruktur\u00eb shtes\u00eb. Dhe p\u00ebr t\u00eb ulur numrin e mesazheve q\u00eb kalohen nga aplikacioni n\u00eb Retryer dhe anasjelltas, ne ndam\u00eb aplikacionet me logjik\u00eb lineare dhe realizuam p\u00ebrpunimin e rip\u00ebrs\u00ebritur p\u00ebrmes ndalimit t\u00eb Consumer.<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/487094\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f Kafka Producer \u0438 Consumer, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c\u0441\u044f \u043a \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 Kafka, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u0430\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-56186","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f Kafka Producer \u0438 Consumer, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c\u0441\u044f \u043a \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 Kafka, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u0430\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 Kafka | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f Kafka Producer \u0438 Consumer, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c\u0441\u044f \u043a \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 Kafka, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u0430\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ritransmetimi i ngjarjeve t\u00eb marra nga Kafka | ProHoster","description":"P\u00ebrsh\u00ebndetje, Habr. S\u00eb fundmi, ndava p\u00ebrvoj\u00ebn time mbi cilat parametra ne n\u00eb ekip p\u00ebrdorim m\u00eb shpesh p\u00ebr Kafka Producer dhe Consumer, p\u00ebr t\u00eb arritur nj\u00eb dor\u00ebzim t\u00eb garantuar. N\u00eb k\u00ebt\u00eb artikull do t\u00eb flas p\u00ebr m\u00ebnyr\u00ebn se si organizuam ritransmetimin e nj\u00eb ngjarjeje t\u00eb marr\u00eb nga Kafka, si rezultat i pap\u00ebrshtatshm\u00ebris\u00eb p\u00ebrkohshme t\u00eb nj\u00eb sistemi t\u00eb jasht\u00ebm. Aplikacionet moderne funksionojn\u00eb n\u00eb nj\u00eb ambient shum\u00eb kompleks. Logjika e biznesit, e mb\u00ebshtjell\u00eb","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 Kafka | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f Kafka Producer \u0438 Consumer, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c\u0441\u044f \u043a \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 Kafka, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u0430\u044f","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/povtornaya-obrabotka-sobytij-poluchennyh-iz-kafka","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"56186","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:29:19","updated":"2022-10-02 15:56:10"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/56186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=56186"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/56186\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=56186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=56186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=56186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}