{"id":54431,"date":"2019-12-26T00:00:00","date_gmt":"2019-12-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-kafka-stala-bylyu"},"modified":"2020-02-18T14:02:26","modified_gmt":"2020-02-18T11:02:26","slug":"kak-kafka-stala-bylyu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Wie Kafka zur Realit\u00e4t wurde.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wie Kafka zur Realit\u00e4t wurde.\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hallo, Habr!<\/p>\n<p><\/p>\n<p>Ich arbeite im Team von Tinkoff, das f\u00fcr die Entwicklung unseres eigenen Benachrichtigungszentrums zust\u00e4ndig ist. Haupts\u00e4chlich programmiere ich in Java mit Spring Boot und l\u00f6se verschiedene technische Probleme, die im Projekt auftreten.<\/p>\n<p><\/p>\n<p>Die meisten unserer Mikrodienste interagieren asynchron \u00fcber einen Nachrichtenbroker. Zuvor verwendeten wir IBM MQ als Broker, der mit der Last nicht mehr zurechtkam, aber gleichzeitig hohe Liefersicherheit bot.<\/p>\n<p><\/p>\n<p>Als Ersatz wurde uns Apache Kafka vorgeschlagen, das \u00fcber ein hohes Skalierungspotenzial verf\u00fcgt, jedoch leider eine nahezu individuelle Anpassung der Konfiguration f\u00fcr verschiedene Szenarien erfordert. Au\u00dferdem erlaubte der Standardmechanismus f\u00fcr \u201eat least once delivery\u201c in Kafka nicht, das erforderliche Konsistenzniveau sofort zu gew\u00e4hrleisten. Im Folgenden teile ich unsere Erfahrungen mit der Konfiguration von Kafka und erkl\u00e4re, wie man \u201eexactly once delivery\u201c einrichtet und damit umgeht.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Garantiezustellung und mehr<\/h2>\n<p><\/p>\n<p>Die nachfolgenden Parameter helfen, eine Reihe von Problemen mit den Standardverbindungseinstellungen zu vermeiden. Zun\u00e4chst m\u00f6chten wir jedoch einem Parameter besonderes Augenmerk schenken, der das m\u00f6gliche Debugging erleichtert.<\/p>\n<p><\/p>\n<p>Das wird unterst\u00fctzt durch <strong>client.id<\/strong> f\u00fcr Producer und Consumer. Auf den ersten Blick kann als Wert der Name der Anwendung verwendet werden, was in den meisten F\u00e4llen funktioniert. Allerdings f\u00fchrt die Situation, in der mehrere Consumer in der Anwendung verwendet werden und Sie ihnen denselben client.id zuweisen, zu folgender Warnung:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Fehler bei der Registrierung von AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Wenn Sie JMX in einer Anwendung mit Kafka verwenden m\u00f6chten, k\u00f6nnte dies ein Problem darstellen. In diesem Fall ist es am besten, als Wert f\u00fcr client.id eine Kombination aus dem Namen der Anwendung und beispielsweise dem Namen des Topics zu verwenden. Das Ergebnis unserer Konfiguration kann im Output des Befehls <strong>kafka-consumer-groups<\/strong> aus den Utilities von Confluent angesehen werden:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wie Kafka zur Realit\u00e4t wurde.\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nun betrachten wir das Szenario der garantierten Nachrichten\u00fcbermittlung. Der Kafka Producer hat den Parameter <strong>acks<\/strong>, der es erm\u00f6glicht, einzustellen, nach wie vielen Acknowledgments der Cluster-Leiter die Nachricht als erfolgreich gespeichert betrachtet. Dieser Parameter kann folgende Werte annehmen:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 Acknowledgments werden nicht gez\u00e4hlt.<\/li>\n<li>1 \u2014 Standardparameter, Acknowledgment ist nur von 1 Replikat erforderlich.<\/li>\n<li>\u22121 \u2014 Acknowledgments von allen synchronisierten Replikaten sind erforderlich (Cluster-Konfiguration). <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Von den genannten Werten gibt acks gleich \u22121 die st\u00e4rksten Garantien, dass die Nachricht nicht verloren geht. <\/p>\n<p><\/p>\n<p>Wie wir alle wissen, sind verteilte Systeme unzuverl\u00e4ssig. Um sich vor vor\u00fcbergehenden Ausf\u00e4llen zu sch\u00fctzen, bietet der Kafka Producer den Parameter <strong>retries<\/strong>, der die Anzahl der Wiederholungsversuche w\u00e4hrend <strong>delivery.timeout.ms<\/strong>festlegt. Da der Parameter retries den Standardwert Integer.MAX_VALUE (2147483647) hat, kann die Anzahl der Wiederholungen der Nachricht nur durch Anpassung von delivery.timeout.ms geregelt werden.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Gehen wir zur Exactly-once-Zustellung \u00fcber.<\/h2>\n<p><\/p>\n<p>Die genannten Einstellungen erm\u00f6glichen es unserem Producer, Nachrichten mit hoher Zuverl\u00e4ssigkeit zu liefern. Lassen Sie uns nun dar\u00fcber sprechen, wie wir sicherstellen k\u00f6nnen, dass nur eine Kopie einer Nachricht in ein Kafka-Topic geschrieben wird? Im einfachsten Fall muss der Producer dazu den Parameter <strong>enable.idempotence<\/strong> auf den Wert true setzen. Die Idempotenz gew\u00e4hrleistet, dass nur eine Nachricht in eine bestimmte Partition eines Topics geschrieben wird. Voraussetzung f\u00fcr die Aktivierung der Idempotenz sind die Werte <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Wenn diese Parameter vom Entwickler nicht definiert sind, werden die oben genannten Werte automatisch gesetzt.<\/p>\n<p><\/p>\n<p>Sobald die Idempotenz konfiguriert ist, muss sichergestellt werden, dass dieselben Nachrichten immer in dieselben Partitionen gelangen. Dies kann durch das Einrichten des Schl\u00fcssels und des Parameters partitioner.class im Producer erreicht werden. Beginnen wir mit dem Schl\u00fcssel. F\u00fcr jede Sendung sollte er gleich sein. Dies l\u00e4sst sich leicht erreichen, indem man eine beliebige Gesch\u00e4ftskennung aus der urspr\u00fcnglichen Nachricht verwendet. Der Parameter partitioner.class hat den Standardwert \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apache\/kafka\/blob\/trunk\/clients\/src\/main\/java\/org\/apache\/kafka\/clients\/producer\/internals\/DefaultPartitioner.java\">DefaultPartitioner<\/a><\/noindex>. Bei dieser Standardpartitionierungsstrategie verhalten wir uns wie folgt:<\/p>\n<p><\/p>\n<ul>\n<li>Wenn eine Partition bei der Nachrichtensendung explizit angegeben ist, verwenden wir sie.<\/li>\n<li>Wenn die Partition nicht angegeben ist, aber ein Schl\u00fcssel bereitgestellt wird, w\u00e4hlen wir die Partition basierend auf dem Hash des Schl\u00fcssels.<\/li>\n<li>Wenn weder die Partition noch der Schl\u00fcssel angegeben sind, w\u00e4hlen wir die Partitionen im Round-Robin-Verfahren aus.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dar\u00fcber hinaus erm\u00f6glicht die Verwendung eines Schl\u00fcssels und idempotenter Sendung mit dem Parameter <strong>max.in.flight.requests.per.connection = 1<\/strong> eine geordnete Verarbeitung der Nachrichten auf dem Consumer. Es ist wichtig zu beachten, dass Sie, falls in Ihrem Cluster ein Zugriffsmanagement eingerichtet ist, die Berechtigungen f\u00fcr idempotente Aufzeichnungen im Topic ben\u00f6tigen.<\/p>\n<p><\/p>\n<p>Falls Ihnen die idempotente Sendung nach Schl\u00fcssel nicht ausreicht oder die Logik auf der Seite des Producers die Konsistenz der Daten zwischen verschiedenen Partitionen erfordert, k\u00f6nnen Transaktionen helfen. Zudem k\u00f6nnen Sie mit einer Ketten-Transaktion die Aufzeichnung in Kafka beispielsweise mit einer Datenbank-Aufzeichnung bedingt synchronisieren. Damit die transaktionale Sendung beim Producer m\u00f6glich ist, muss er idempotent sein und zus\u00e4tzlich <strong>transactional.id<\/strong>. Wenn in Ihrem Kafka-Cluster die Zugriffsverwaltung konfiguriert ist, ben\u00f6tigen Sie f\u00fcr die transaktionale Speicherung, wie auch f\u00fcr die idempotente Speicherung, Schreibberechtigungen, die \u00fcber eine Maske mit dem Wert, der in transactional.id gespeichert ist, erteilt werden k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Formell kann jede Zeichenfolge, z. B. der Name der Anwendung, als Transaktions-ID verwendet werden. Wenn Sie jedoch mehrere Instanzen derselben Anwendung mit identischem transactional.id ausf\u00fchren, wird die zuerst gestartete Instanz mit einem Fehler gestoppt, da Kafka sie als Zombie-Prozess betrachtet. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Der Producer hat einen Vorgang mit einer alten Epoch versucht. Entweder gibt es einen neueren Producer mit derselben transactionalId, oder die Transaktion des Producers wurde vom Broker abgelaufen.<\/code><\/pre>\n<p><\/p>\n<p>Um dieses Problem zu l\u00f6sen, f\u00fcgen wir dem Anwendungsnamen einen Suffix in Form des Hostnamens hinzu, den wir aus den Umgebungsvariablen erhalten. <\/p>\n<p><\/p>\n<p>Der Producer ist konfiguriert, jedoch steuern Transaktionen in Kafka nur den Geltungsbereich der Nachricht. Unabh\u00e4ngig vom Status der Transaktion gelangt die Nachricht sofort in das Topic, besitzt jedoch zus\u00e4tzliche systembedingte Attribute.<\/p>\n<p><\/p>\n<p>Damit solche Nachrichten nicht vorzeitig vom Consumer gelesen werden, muss er den Parameter <strong>isolation.level<\/strong> auf den Wert read_committed setzen. Ein solcher Consumer kann weiterhin nicht-transaktionale Nachrichten lesen, w\u00e4hrend er transaktionale Nachrichten erst nach dem Commit lesen kann.<br \/>\nWenn Sie alle zuvor genannten Einstellungen konfiguriert haben, haben Sie genau einmalige Lieferung eingestellt. Herzlichen Gl\u00fcckwunsch!<\/p>\n<p><\/p>\n<p>Aber es gibt noch einen weiteren Punkt. Die Transactional.id, die wir oben konfiguriert haben, ist tats\u00e4chlich ein Transaktionspr\u00e4fix. An den Transaktionsmanager wird eine fortlaufende Nummer angeh\u00e4ngt. Die resultierende ID wird auf <strong>transactional.id.expiration.ms<\/strong>, die auf dem Kafka-Cluster konfiguriert ist und standardm\u00e4\u00dfig auf \"7 Tage\" gesetzt ist. Wenn innerhalb dieses Zeitraums keine Nachrichten vom Anwender empfangen werden, erhalten Sie bei dem Versuch, die n\u00e4chste transaktionale Sendung durchzuf\u00fchren, eine <strong>InvalidPidMappingException<\/strong>. Danach gibt der Transaktionskoordinator eine neue fortlaufende Nummer f\u00fcr die n\u00e4chste Transaktion aus. Dabei kann eine Nachricht verloren gehen, wenn die InvalidPidMappingException nicht ordnungsgem\u00e4\u00df behandelt wird. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Statt der Ergebnisse<\/h2>\n<p><\/p>\n<p>Wie man feststellen kann, reicht es nicht aus, Nachrichten nur in Kafka zu senden. Es ist notwendig, eine Kombination von Parametern auszuw\u00e4hlen und bereit zu sein, schnelle \u00c4nderungen vorzunehmen. In diesem Artikel habe ich versucht, die Konfiguration von Exactly Once Delivery im Detail darzustellen und einige Probleme mit den Konfigurationen client.id und transactional.id zu beschreiben, auf die wir gesto\u00dfen sind. Unten sind die Einstellungen f\u00fcr Producer und Consumer in kurzer Form aufgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Producer:<\/p>\n<p><\/p>\n<ol>\n<li>acks = all<\/li>\n<li>retries &gt; 0<\/li>\n<li>enable.idempotence = true<\/li>\n<li>max.in.flight.requests.per.connection \u2264 5 (1 \u2014 f\u00fcr die geordnete Sendung)<\/li>\n<li>transactional.id = ${application-name}-${hostname}<\/li>\n<\/ol>\n<p><\/p>\n<p>Consumer:<\/p>\n<p><\/p>\n<ol>\n<li>isolation.level = read_committed<\/li>\n<\/ol>\n<p><\/p>\n<p>Um Fehler in zuk\u00fcnftigen Anwendungen zu minimieren, haben wir ein Wrapper \u00fcber die Spring-Konfiguration erstellt, in dem bereits Werte f\u00fcr einige der genannten Parameter festgelegt sind.<\/p>\n<p><\/p>\n<p>Hier sind ein paar Materialien f\u00fcr das Selbststudium:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging\">KIP-98 \u2014 Exactly Once Delivery und Transaktionale Nachrichten\u00fcbermittlung<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#configuration\">Beschreibung der Einstellungen <\/a><\/noindex><\/li>\n<\/ul>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/481784\/\">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! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 [&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-54431","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! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\" \/>\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\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\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=\"2019-12-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:26+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\udd47Wie Kafka zur Realit\u00e4t wurde | ProHoster","description":"Hallo, Habr! Ich arbeite im Team von Tinkoff, das ein eigenes Benachrichtigungszentrum entwickelt. \u00dcberwiegend programmiere ich in Java mit Spring Boot und l\u00f6se verschiedene technische Probleme, die im Projekt auftreten. Die meisten unserer Microservices interagieren asynchron \u00fcber einen Nachrichtenbroker. Zuvor haben wir IBM MQ als Broker verwendet, der nicht mehr mit","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-kafka-stala-bylyu","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":"2019-12-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54431","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":"2026-01-24 11:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:06:37","updated":"2026-01-24 11:22:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}