Quam Kafka est veritas

Quam Kafka est veritas

Heus Habr!

In turma Tinkoff laboro, quae centrum suum notificationis promovet. Maxime evolvere in Java utendo tabernus Spring et solvendo varias difficultates technicas quae in incepto oriuntur.

Pleraque nostra microservices asynchronously per nuntium sectorem inter se communicant. Antea IBM MQ pro sectore usi sumus, quod onere iam obire non poterat, sed simul pignora partus alta habebat.

Subiunctio nobis oblatae sunt Apache Kafka, quae altam scalam potentialem habet, sed, proh dolor, prope singulos aditus ad configurationem diversorum missionum requirit. Praeterea, saltem semel traditio mechanismi quae in Kafka operatur per defaltam non permittit ut debitam constantiae gradum extra pixidem conservare patiatur. Deinde experientiam nostram in Kafka configuratione communicabo, praesertim tibi narrabo quomodo semel exacte configurare et vivere partus.

Praestatur traditio et plus

Loca infra tractata adiuvabunt ne plures difficultates cum uncinis defaltis adiuvabunt. Sed primum velim attendere ad unum modulum qui lusione potest faciliorem reddere.

Hoc erit auxilium client.id pro Produce et Consumer. In prima specie uti potes nomine applicationis valoris, et in pluribus hoc faciet. Licet res cum applicatione pluribus Consumers utitur et eosdem client.id eis das, in tali monitione consequitur:

org.apache.kafka.common.utils.AppInfoParser — Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0

Si vis uti JMX in applicatione cum Kafka, tum hoc problema esse potest. Hoc in casu optimum est applicationis nomine uti et, exempli gratia, thema nominis client.id valoris. Effectus configurationis nostrae videri potest in imperio output kafka-consumer-groups ab utilitatibus ex Confluent;

Quam Kafka est veritas

Nunc inspiciamus missionem pro certo nuncio traditionis. Kafka producentis habet parametri acksqui sino te configurare post quot agnoscit botrum ducem necessarium esse, ut relatum feliciter scripserit. Hic modulus potest capere sequentes valores:

  • 0 — agnoscitur non considerari potest.
  • 1 modulus default est, tantum I replica requiritur ut agnoscat.
  • −1 - confiteri ab omnibus replicationibus synchronised non requiritur (botrus setup min.insync.replicas).

Ex valoribus inscriptis patet quod 1 aequalem acquirit firmissimam cautionem quam nuntius non amittetur.

Ut omnes novimus, systemata distributa incerta sunt. Ad contra vitia transeuntium tuenda, Kafka producentis optionem praebet retries, quod tibi permittit ut numerum resend conatibus inclusus delivery.timeout.ms. Cum retries parameter valorem defaltam integri. MAX_VALUE (2147483647) numerus retries retries componi potest mutatis tantum partus.timeout.ms.

Nos semel prorsus movere ad partum

Recensentur occasus nostros producentis permittere nuntios cum magno cautione liberare. Nunc loquimur quomodo efficere ut unum tantum exemplum epistulae ad thema Kafka scriptum sit? In casu simplicissimo, hoc facere debes parametrum in Producentis enable.idempotentia ad verum. Eadem potentia praestat unum tantum nuntium scripsisse ad certam unius argumenti partitionem. Praeconditio ut idempotentia efficiat valores acks = all, retry > 0, max.in.flight.requests.per.connection ≤ 5. Si hi parametri ab elit non specificantur, valores superiores ipso facto ponentur.

Cum idem potentia configuratur, necesse est ut eaedem nuntii in eisdem partitionibus omni tempore terminentur. Hoc fieri potest, partitioner.classis clavem et parametrum producentis ad constituendum. Incipiamus cum clavis. Idem debet esse de singulis subiectione. Id facile effici potest utendo negotio aliquo IDs ex archetypo. Quod partitioner.class parametri habet default valorem DefaultPartitioner. Cum hoc consilio partitione, per defaltam hoc modo agimus:

  • Si partitio explicite designatur cum nuntium mittit, tum ea utimur.
  • Si partitio non specificata est, sed clavis specificatur, partitionem clavorum detrahere.
  • Si partitio et clavis non specificata sunt, partitiones singillatim elige (circum-robin).

Clave etiam utens et idempotens mittens cum modulo max.in.flight.requests.per.connection = 1 dat turpis nuntius processus in Consumer. Memorabile quoque est quod si accessus dominii figuratur in botro tuo, tunc opus erit iuribus ut idempotenter ad thema scribas.

Si subito desint facultates eiusdempotes mittendi clavem vel logicam in Parte producentis postulare, ut data constantia inter diversas partitiones servetur, tunc transactiones succurrebunt. Praeterea, catena transactionis utens, sub condicione rei gestae in Kafka synchronizare potes, exempli gratia, cum commentarius in datorum instrumentorum communicatione. Ut missio transactionalis ad producentis, idem potens sit et superaddere debet transactional.id. Si tua Kafka botrus accessum habet potestatem figuratus, tunc recordum transactionalis, sicut recordum idempotens, scribes licentias scribendas, quae donari possunt per larva valoris in transactional.id repositorum.

Formaliter, quaevis chorda, ut nomen applicationis, ut identificativum transactionis adhiberi potest. Sed si plures instantias eiusdem applicationis cum transactional.id eodem deducas, tunc prima instantia deductae errori obstruetur, cum Kafka processum zombie considerabit.

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.

Ad hanc quaestionem solvendam, suffixam addimus applicationi nominis in forma hostname, quam ex variabilium ambitu obtinemus.

Producentis configuratur, sed transactiones in Kafka solum scopum nuntii regunt. Negligens status transactionis, nuntius statim ad thema accedit, sed systema additicium attribuit.

Talia nuntia quominus ante tempus a Consumer praelecta sint, oportet modulo praeficere solitation.level " ut read_committed pretii. Talis Consumer epistulas non-transactionales sicut ante legere poterit, et nuntii transactionales tantum post committere.
Si omnia uncinis ante recensita posuisti, tunc prorsus semel partus figurasti. Macte!

Sed nuance plus est unum. Transactional.id, quod supra configuratum est actu praepositionis. In negotio procuratoris, numerus sequentium additur. Quod identifier edita to transactional.id.espiration.ms *quae in Kafka botri configuratur et valorem defaltam "7 dierum" habet. Si in hoc tempore applicationis epistulas nullas receperit, tunc cum proximo transactionali mittis te accepturum esse experieris InvalidPidMappingException. Transactio coordinator tunc novam seriem sequentium numeri praemittet. Autem, nuntius amitti potest si InvalidPidMappingException non recte tractatur.

Pro summa

Ut videre potes, non satis est simpliciter mittere nuntios ad Kafka. Vos opus parametris eligere compositum et ad vivos mutationes praeparandas. In hoc articulo, singillatim ostendere conatus sum semel exacte traditionis setup et plures difficultates descripsi cum client.id et transactional.id configurationibus quas invenimus. Infra summarium Producentis et Consumer occasus est.

producentis:

  1. acks = all
  2. retries> 0
  3. enable.idempotence = true
  4. max.in.flight.requests.per.connection ≤ 5 (1 ad ornatum mittens)
  5. transactional.id = ${application-name}-${hostname}

dolor:

  1. isolation.level = read_committed

Ad errores in futuris applicationibus extenuando, involucrum nostrum fecimus per vernam configurationem, ubi valores aliquot parametri recensiti iam positi sunt.

Hic sunt duo materiae ad sui ipsius studium;

Source: www.habr.com

Add a comment