Reprocessing certe ab Kafka

Reprocessing certe ab Kafka

Salve, Habr.

nuper I participatur suam experientiam de quibus parametris sicut turmas frequentissime utimur pro Kafka Producentis et Consumer ut propius ad partum praestandum accedamus. In hoc articulo volo tibi dicere quomodo constituimus processum re- cessus eventus ab Kafka accepti propter tempus necessariae systematis externi.

Applicationes modernae operantur in ambitu valde implicato. Negotiatio logica in acervo moderno technologiae involuto, currens in imaginem Docker ab orchestratore sicut Kubernetes vel OpenShift tractata, et communicans cum aliis solutionibus applicationibus vel inceptis per catenam itineris physici et virtualis. In tali ambitu, semper aliquid frangi potest, ut eventus reprocessing si una rationum externarum perpendat, est magna pars processuum negotii nostri.

Quomodo fuit ante Kafka

Antea in incepto usi IBM MQ ad asynchronum nuntium perferendis. Si quis error in operatione ministerii occurrit, nuntius receptus in epistula mortua queue (DLQ) collocari potuit pro ulteriore parte manuali. DLQ creatus est iuxta queue advenientis, nuntius intra IBM MQ translatus est.

Si error temporalis erat et nos eam determinare potuimus (exempli gratia: ResourceAccessExceptionis de vocatione HTTP vel MongoTimeoutExceptionis in petitione MongoDb), tunc retriam consilium effectum sortietur. Quoad logicam applicationis ramosam, nuntius originalis vel ad queue mittendi morandi morandi rationem commotus est vel ad applicationem separatum quod pridem ad nuntios resendendi facta est. Hoc includit numerum resend in nuntiatione capitis, qui morae interstitium vel finis applicationis gradu militaris adnectitur. Si finem consilii attigimus sed ratio externa adhuc perpendat, nuntius in DLQ pro parsing manuali collocabitur.

quaerere solutions

Investigatio in Penitus, invenire potes решение. In summa, proponitur thema singulis morae intervallis creare, et applicationes Consumer efficiendi ea parte, quae nuntios cum mora debita leget.

Reprocessing certe ab Kafka

Quamvis numerus positivorum recognitionum non omnino felix mihi videtur. Primum, quod elit, praeter exsequendam negotiationem requisita, multum temporis exsequendam mechanismum describit.

Praeterea si accessus ditionis in Kafka botri datur, habebis aliquod tempus consumere locos creandi et aditum ad eos necessariis providendi. Praeter haec, rectam retentionem eligere debes.ms modulum pro singulis retry argumentis ut nuntii tempus doleant nec ab eo evanescant. Exsecutio et petitio accessus iterari debebunt pro unoquoque existente vel novo servitio.

Nunc videamus quae machinationes generatim et ver-kafka in particulari oriantur nobisque ad nuntium reproducendum. Spring-kafka dependentiam transitivam a ver-retry habet, quod abstractiones praebet ad varias BackOffPolicies administrandas. Hoc instrumentum satis flexibile est, sed significativum eius detrimentum nuntiat in applicatione memoriam reponendam. Hoc significat quod applicationes sileo propter an update vel error operativus proveniet in amissione omnium nuntiorum pendentium reprocessionis. Cum hoc punctum criticum ad nostram rationem pertineat, ulterius non duximus.

ipsa ver-kafka varias exsecutiones ContainerAwareErrorHandler praebet, e.g SeekToCurrentErrorHandler, quocum possis nuntium postea processum sine variae pressionis errore in casu. Incipiens cum versione ver-kafka 2.3, fieri potest ut BackOffPolicy proficisci.

Aditus hic epistulas reprocessas concedit ut applicationes restarts superesse, sed nulla DLQ mechanismus adhuc est. Hanc optionem ineunte MMXIX elegimus, optimistically credentes DLQ opus non esse (fuimus felix et revera non indigemus post aliquot menses applicationem cum tali reprocessing systemate operandi). Errores temporales ignem effecit SeekToCurrentErrorHandler. Reliqui errores impressi sunt in ligno, inde in pressione, et processus continua cum proximo nuntio.

Finalis decision

Exsecutio secundum SeekToCurrentErrorHandler nos admonuit ut propriam mechanismum ad epistulas resipiscendas incitaret.

Primum omnium experientiam exsistentem uti voluimus et eam secundum logicam applicationem amplificare. Ad applicationis logicae lineares, optime desistere legere novas nuntios per breve temporis spatium a Retry consilio definitum. Ad alia applicationes unum punctum habere volui, qui retry consilio compelleret. Praeterea, hoc unicum punctum in utroque accessu functionem DLQ habere debet.

Retry militarium ipsum in applicatione reponendum est, quod tempus proximum recuperare debet cum error temporalis incidit.

Restitit Consumer pro Linearibus Logica Application

Cum opus ver-kafka, signum Consumer obsistere, fortasse aliquid simile hoc spectare:

public void pauseListenerContainer(MessageListenerContainer listenerContainer, 
                                   Instant retryAt) {
        if (nonNull(retryAt) && listenerContainer.isRunning()) {
            listenerContainer.stop();
            taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
            return;
        }
        // to DLQ
    }

In exemplo, retryAt tempus ut sileo MessageListenerContainer si adhuc currit. Re- launch in separato filo in TaskScheduler deducto occurret, cuius exsecutio etiam verno providetur.

Valorem retryAt invenimus in hunc modum:

  1. Valor re- vocationis calculo suspicitur.
  2. Ex in calculo valorem, mora hodierna intercapedo in Retry consilio exploratur. Consilium in ipsa applicatione declaratur, JSON forma reponendam elegimus.
  3. Intervallum, quod in JSON ordinata est, numerum secundorum continet post quem processus iterari debebit. Hic numerus secundorum ad tempus hodiernum additur ad valorem retryAt.
  4. Si intervallum non invenitur, valor retryAt nulla est et nuntius mittetur ad DLQ pro parsing manuali.

Cum hoc accessu, omne quod superest, est servare numerum repetitarum postulatorum singulorum nuntium quae actu processit, exempli gratia in memoria applicationis. Retry comiti in memoria servans criticum accessum non est, quia applicatio logicae linearis processus totum tractare non potest. Secus ver-retry, applicationis restarting non omnes nuntios ut reprocessari faciam, sed consilium simpliciter sileo.

Aditus hic adiuvat ut sarcinam ab extra systemate accipias, quod ob gravissimum onus perpendat. Aliis verbis, praeter reprocessationem, exsecutionem exemplaris consecuti sumus interruptio potentiae.

In casu nostro, limen erroris tantum 1, et ut ratio temporis obscuratis ex retis temporalibus outages, valde granulosum retry consilio cum parvis intervallis latentibus utimur. Quod non potest esse conveniens omnibus applicationibus coetus, ideo relatio inter limen erroris et valorem interstitium seligi debet secundum notas systematis.

Separatum applicatione ad expediendas nuntios ab applicationibus cum logica non determinata

En exemplum Codicis qui nuntium mittit ad talem applicationem (Retryer), quod destinatum locum reddet cum RETRY_AT tempus perventum est:


public <K, V> void retry(ConsumerRecord<K, V> record, String retryToTopic, 
                         Instant retryAt, String counter, String groupId, Exception e) {
        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());
        List<Header> arrayOfHeaders = 
            new ArrayList<>(Arrays.asList(headers.toArray()));
        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);
        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);
        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, 
                     () -> Integer.toString(record.partition()).getBytes());
        if (nonNull(retryAt)) {
            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "retry"::getBytes);
            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);
        } else {
            updateHeader(arrayOfHeaders, REASON, 
                         ExceptionUtils.getStackTrace(e)::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "backout"::getBytes);
        }
        ProducerRecord<K, V> messageToSend =
            new ProducerRecord<>(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);
        kafkaTemplate.send(messageToSend);
    }

Exemplum ostendit multum informationes in capitis transmittere. Valor RETRY_AT eodem modo invenitur ac pro retry mechanismo per Consumer statio. Praeter DESTINATIO et RETRY_AT praeterimus:

  • GROUP_ID, per quam epistulae ad analysim manualem ac faciliorem inquisitionem glomerantur.
  • ORIGINAL_PARTITION ut eundem Consumer retinere conetur re-processui. Hic modulus nullus esse potest, quo in casu nova partitio in usu record.key() clavem nuntii originalis habebitur.
  • Renovata CONTRA valorem sequi retry consilio.
  • SEND_TO constans indicat num nuntium mittatur ad RETRY_AT perveniat an in DLQ ponatur.
  • RATIO - Causa quare nuntius processus intermissus est.

Retryer nuntia reponit pro residendo et manuali parsing in PostgreSQL. Timor incipit negotium quod epistulas apud RETRY_AT invenit et eas ad ORIGINAL_PARTITION partitionem topicum cum clave record.key mittit ().

Postquam missi sunt, epistulae ex PostgreSQL deletae sunt. Parsing epistularum manualium occurrit in UI simplici qui cum Retryer per REST API interact. Praecipua eius lineamenta sunt nuntiis ab DLQ resectis vel deletis, errorem inspicientes nuntios et mandata quaerentes, exempli gratia nomine errore.

Cum accessus moderandi in racemis nostris facultas datur, accessum ad rem petendam necesse est, quem Retryer auscultat, et Retryer ad locum destinationis scribere permittit. Hoc incommodum est, sed, dissimiles inter- pretationis accessus, plenam discursus DLQ et UI ad Cn.

Sunt casus, cum locus advenientis a pluribus diversis coetibus consumptis legitur, quorum applicationes variam logicam efficiunt. Reprocedere nuntium per Retryer unius harum applicationum in duplicata ex altera proveniet. Ad hoc defendendum, thema separatum re-dispensationis conficimus. Adventus et retry argumenta ab eodem Consumer sine ulla restrictione legi possunt.

Reprocessing certe ab Kafka

Defaltam hanc accessus ambitum praevaricatorem functionis non praebet, attamen applicationi usus addi potest ver-nubes netflix aut novum vere nubes circa ruptorloca ubi externa officia in abstractiones congruas vocantur involventes. Praeterea fieri potest, ut consilium capiat bulkhead exemplar, quod etiam utile esse potest. Exempli gratia, in ver-cloud-netflix hoc esse potest filum piscinae vel semaphoris.

conclusio,

Quam ob rem separatum habemus applicationem, quae nos sinit repetere nuntium processus, si ratio aliqua externa ad tempus perpendat.

Una praecipuorum utilitatum applicationis est quod per systemata externa in eodem botro Kafka currendo adhiberi potest, sine modificationibus notabili earum parte! Applicatio talis tantum opus erit ut ad retry thema accedat, paucis Kafka caput imple et nuntium ad Retryer mitte. Nulla eget suscipit infrastructure. Et ut numerus nuntiorum ab applicatione ad Retryer et retro translatus redigeret, applicationes cum logica lineari identificavimus et eas per Consumer sistendum denuo processit.

Source: www.habr.com

Add a comment