{"id":407166,"date":"2024-06-29T19:23:56","date_gmt":"2024-06-29T19:23:56","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=407166"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=407166","title":{"rendered":"<span>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kafka \u0438 Kafka Connect: \u0427\u0430\u0441\u0442\u044c 2 \u2014 \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0438 Helm Chart<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438 &#8212;<a href=\"https:\/\/habr.com\/ru\/articles\/751256\/\" rel=\"noopener noreferrer nofollow\"> \u0418\u0432\u0435\u043d\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kafka \u0438 Kafka Connect: \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/a>.<\/p>\n<p>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0433\u0438\u0431\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Apache Kafka \u0438 Kafka Connect! \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0438\u0432\u0435\u043d\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 Kafka, \u0447\u0442\u043e\u0431\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043d\u0430 Java, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c Avro-\u0441\u0445\u0435\u043c\u044b \u0438\u0437 Schema Registry \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 Kafka, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Kafka Connect. \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430, \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u0438\u0445 \u0441\u0432\u043e\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0441\u0432\u043e\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0426\u0435\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<ol>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Kafka.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Avro-\u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0438 Schema Registry \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 Kafka \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 PostgreSQL \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Helm Chart \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0432 Kubernetes.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Kubernetes \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f  <\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u0430\u0448 POM \u0444\u0430\u0439\u043b<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;dependencies> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>com.google.guava&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>guava&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;version>32.1.1-jre&lt;\/version> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>io.confluent&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>kafka-avro-serializer&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;version>7.4.0&lt;\/version> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>io.confluent&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>kafka-schema-registry-client&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;version>7.4.0&lt;\/version> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-data-jpa&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-actuator&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-web&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.kafka&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-kafka&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.postgresql&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>postgresql&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;scope>runtime&lt;\/scope> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.projectlombok&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>lombok&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;optional>true&lt;\/optional> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-test&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;scope>test&lt;\/scope> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.kafka&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-kafka-test&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;scope>test&lt;\/scope> \u00a0&lt;\/dependency> &lt;\/dependencies><\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e Schema Regestry, PostgreSQL, Kafka \u0438 \u043f\u0440\u043e\u0447. \u0427\u0442\u043e\u0431\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 io.confluent \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e<\/p>\n<pre><code class=\"xml\">&lt;repositories> \u00a0&lt;repository> \u00a0\u00a0\u00a0&lt;id>confluent&lt;\/id> \u00a0\u00a0\u00a0&lt;url>https:\/\/packages.confluent.io\/maven\/&lt;\/url> \u00a0&lt;\/repository> &lt;\/repositories><\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c yaml \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"yaml\"># \u041f\u043e\u0440\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 server: \u00a0\u00a0port: 8081 # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Spring spring: \u00a0\u00a0main: \u00a0\u00a0\u00a0\u00a0allow-bean-definition-overriding: true \u00a0\u00a0application: \u00a0\u00a0\u00a0\u00a0name: kafka-example-consumer \u00a0\u00a0jpa: \u00a0\u00a0\u00a0\u00a0# \u0414\u0438\u0430\u043b\u0435\u043a\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u00a0\u00a0\u00a0\u00a0database-platform: org.hibernate.dialect.PostgreSQLDialect \u00a0\u00a0\u00a0\u00a0generate-ddl: false \u00a0\u00a0\u00a0\u00a0hibernate: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ddl-auto: update \u00a0\u00a0\u00a0\u00a0show-sql: true \u00a0\u00a0\u00a0\u00a0properties: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0hibernate: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0generate_statistics: false \u00a0\u00a0datasource: \u00a0\u00a0\u00a0\u00a0# URL \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u00a0\u00a0\u00a0\u00a0url: jdbc:postgresql:\/\/localhost:5432\/public \u00a0\u00a0\u00a0\u00a0username: postgres \u00a0\u00a0\u00a0\u00a0password: postgres \u00a0\u00a0kafka: \u00a0\u00a0\u00a0\u00a0schema: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0registry: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u041f\u0443\u0442\u0438 \u0434\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0441\u0445\u0435\u043c \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0urls: http:\/\/schema-registry-cp-schema-registry:8081 \u00a0\u00a0\u00a0\u00a0bootstrap-servers: localhost:29092 \u00a0\u00a0\u00a0\u00a0listener: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u041a\u0430\u043a \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ack-mode: record \u00a0\u00a0\u00a0\u00a0producer: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client-id: ${spring.application.name} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0430 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0key-serializer: org.apache.kafka.common.serialization.StringSerializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 DLT \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value-serializer: ru.marmarks.consumer.config.DltMessageSerializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0retries: 3 \u00a0\u00a0\u00a0\u00a0consumer: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0group-id: ${spring.application.name} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0autoOffsetReset: earliest \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0keyDeserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0valueDeserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0properties: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0422\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 JSON \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spring.json.value.default.type: org.apache.avro.generic.GenericRecord \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spring.deserializer.key.delegate.class: org.apache.kafka.common.serialization.StringDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spring.deserializer.value.delegate.class: io.confluent.kafka.serializers.KafkaAvroDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0specific: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0avro: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0reader: true \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u0445\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0schema: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0registry: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url: http:\/\/schema-registry-cp-schema-registry:8081 # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Kafka kafka: \u00a0\u00a0topics: \u00a0\u00a0\u00a0\u00a0# \u0422\u043e\u043f\u0438\u043a \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u00a0\u00a0\u00a0\u00a0personal-data: kafka-connect-personal_data \u00a0\u00a0services: \u00a0\u00a0\u00a0\u00a0# \u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0\u00a0personal-data: kafka-connect-personal_data<\/code><\/pre>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Schema Registry \u0438 Kafka \u0431\u0440\u043e\u043a\u0435\u0440\u0443  <\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e Kafka. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Schema Regestry, \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 dlt \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/p>\n<details class=\"spoiler\">\n<summary>KafkaConfiguration.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Configuration @EnableKafka @RequiredArgsConstructor @EnableConfigurationProperties(SchemaRegistryProperties.class) public class KafkaConfiguration { \u00a0private static final int DEFAULT_CACHE_CAPACITY = 200; \u00a0private static final String DLT_TOPIC_SUFFIX = \".dlt\"; \u00a0private final ConsumerFactory&lt;String, GenericRecord> consumerFactory; \u00a0private final ProducerFactory&lt;Object, Object> producerFactory;  \u00a0@Bean \u00a0public ConcurrentKafkaListenerContainerFactory&lt;String, GenericRecord> objectKafkaListenerContainerFactory( \u00a0\u00a0\u00a0\u00a0\u00a0DefaultErrorHandler errorHandler \u00a0) { \u00a0\u00a0\u00a0ConcurrentKafkaListenerContainerFactory&lt;String, GenericRecord> factory = new ConcurrentKafkaListenerContainerFactory&lt;>(); \u00a0\u00a0\u00a0factory.setConsumerFactory(consumerFactory); \u00a0\u00a0\u00a0factory.setCommonErrorHandler(errorHandler); \u00a0\u00a0\u00a0return factory; \u00a0}  \u00a0\/** \u00a0\u00a0* \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u00a0\u00a0*\/ \u00a0@Bean \u00a0public CachedSchemaRegistryClient cachedSchemaRegistryClient( \u00a0\u00a0\u00a0\u00a0\u00a0SchemaRegistryProperties schemaRegistryProperties) { \u00a0\u00a0\u00a0\/\/ \u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0441\u043e Schema Registry \u00a0\u00a0\u00a0RestService restService = new RestService(schemaRegistryProperties.urls()); \u00a0\u00a0\u00a0\/\/\u0422\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448\u0430 \u0441\u0445\u0435\u043c \u00a0\u00a0\u00a0return new CachedSchemaRegistryClient(restService, DEFAULT_CACHE_CAPACITY); \u00a0}  \u00a0@Bean \u00a0public KafkaTemplate&lt;Object, Object> kafkaTemplate() { \u00a0\u00a0\u00a0return new KafkaTemplate&lt;>(producerFactory); \u00a0}  \u00a0\/** \u00a0\u00a0* \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0440 \u0432 dead-letter topic. \u00a0\u00a0*\/ \u00a0@Bean \u00a0public DeadLetterPublishingRecoverer publisher(KafkaTemplate&lt;Object, Object> bytesTemplate) { \u00a0\u00a0\u00a0\/\/\u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 DLT. \u00a0\u00a0\u00a0\/\/\u00a0 \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 TopicPartition, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043c\u044f    \/\/\u0442\u043e\u043f\u0438\u043a\u0430 (consumerRecord.topic()) \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0441\u0443\u0444\u0444\u0438\u043a\u0441 DLT_TOPIC_SUFFIX, \u00a0\u00a0\u00a0\/\/\u00a0 \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 (consumerRecord.partition()). \u00a0\u00a0\u00a0\/\/\u00a0 \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 DLT \u0442\u043e\u043f\u0438\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439    \/\/\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 \u043e\u0442\u043a\u0443\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u00a0\u00a0\u00a0return new DeadLetterPublishingRecoverer(bytesTemplate, (consumerRecord, exception) -> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new TopicPartition(consumerRecord.topic() + DLT_TOPIC_SUFFIX, consumerRecord.partition())); \u00a0}  \u00a0\/** \u00a0\u00a0* \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 kafka \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u00a0\u00a0*\/ \u00a0@Bean \u00a0public DefaultErrorHandler errorHandler( \u00a0\u00a0\u00a0\u00a0\u00a0DeadLetterPublishingRecoverer deadLetterPublishingRecoverer) { \u00a0\u00a0\u00a0final var handler = new DefaultErrorHandler(deadLetterPublishingRecoverer); \u00a0\u00a0\u00a0\/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 DLT \u00a0\u00a0\u00a0handler.addNotRetryableExceptions(Exception.class); \u00a0\u00a0\u00a0return handler; \u00a0}  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c:\u00a0<\/p>\n<pre><code class=\"java\">public class ClientData {  \u00a0@Id \u00a0@GeneratedValue(strategy = GenerationType.IDENTITY) \u00a0private Long id; \u00a0private String bankBic; \u00a0private String bankName; \u00a0private String fio; \u00a0private Long correlationId; \u00a0private LocalDateTime lastUpdate;  }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 &#8212; fio, correlationId. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0424\u0418\u041e, \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430  <\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<details class=\"spoiler\">\n<summary>KafkaConsumerListeners.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class KafkaConsumerListeners {  \u00a0\/\/ \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u00a0private final List&lt;ServiceResolver> serviceResolverList; \u00a0\/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u043e\u043f\u0438\u043a\u0438 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c. \u0418\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e.   \/\/\u0422\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043b\u0438\u0441\u0442\u043d\u0435\u0440\u0430 \u00a0@KafkaListener(topics = \"#{'${kafka.topics.personal-data}'.split(',')}\", containerFactory = \"objectKafkaListenerContainerFactory\") \u00a0\/\/ \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 GenericRecord.   \/\/\u041c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430    \/\/\u0441\u0445\u0435\u043c\u0430 \u0432 Schema Regestry \u00a0void readOrganizationConnectorMessages(ConsumerRecord&lt;String, GenericRecord> message) { \u00a0\u00a0\u00a0readMessage(message); \u00a0}  \u00a0private void readMessage(ConsumerRecord&lt;String, GenericRecord> message) { \u00a0\u00a0\u00a0String topic = message.topic(); \u00a0\u00a0\u00a0long offset = message.offset(); \u00a0\u00a0\u00a0log.info(\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430: {} offset: {}\", topic, offset);  \u00a0\u00a0\u00a0\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0430\u043c\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0GenericRecord value = message.value();  \u00a0\u00a0\u00a0if (value == null) { \u00a0\u00a0\u00a0\u00a0\u00a0log.info(\"\u041f\u0443\u0441\u0442\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430: {} offset: {}\", topic, offset); \u00a0\u00a0\u00a0\u00a0\u00a0return; \u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0ServiceResolver resolver = serviceResolverList.stream() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.filter(it -> it.isSupported(topic)) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.findFirst() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.orElseThrow(() -> new RuntimeException(\"\u0421\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u043f\u0438\u043a\u0430: \" + topic));  \u00a0\u00a0\u00a0\/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u00a0\u00a0\u00a0resolver.process(value);  \u00a0\u00a0\u00a0log.info(\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e: \u0442\u043e\u043f\u0438\u043a {} offset {}\", topic, offset); \u00a0}  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e \u043a\u043e\u0434\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u0434\u0435. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u0430 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0421\u0445\u0435\u043c\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 Schema Regestry<\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Avro-\u0441\u0445\u0435\u043c\u0430\u043c\u0438  <\/h3>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public void process(GenericRecord value) { \u00a0Long id = Long.valueOf(String.valueOf(value.get(\"id\"))); \u00a0String bankBic = String.valueOf(value.get(\"bank_bic\")); \u00a0String bankName = String.valueOf(value.get(\"bank_name\")); \u00a0String lastUpdate = String.valueOf(value.get(\"last_update\")); \u00a0long millis = Long.parseLong(lastUpdate); \u00a0Instant instant = Instant.ofEpochMilli(millis); \u00a0LocalDateTime lastUpdateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();  \u00a0\/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u00a0ClientData clientData = new ClientData(); \u00a0clientData.setBankBic(bankBic); \u00a0clientData.setFio(\"\u0420\u0430\u0443\u043b\u044c \" + id); \u00a0clientData.setBankName(bankName); \u00a0clientData.setCorrelationId(id); \u00a0clientData.setLastUpdate(lastUpdateTime);  \u00a0ClientData save = clientDataRepository.save(clientData); \u00a0log.info(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b: {}\", save);  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0438\u0441\u044c \u043a\u0443\u0434\u0430-\u043b\u0438\u0431\u043e \u0435\u0449\u0451 \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0431\u0430\u0437\u0443<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/MarMaksk\/kafka-connect-consumer\" rel=\"noopener noreferrer nofollow\">GitHub<\/a>.<\/p>\n<h3>Helm Chart<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a Helm \u0447\u0430\u0440\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0444\u0430\u0439\u043b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0447\u0430\u0440\u0442\u0435:<\/p>\n<pre><code class=\"yaml\"># \u0412\u0435\u0440\u0441\u0438\u044f API Helm Chart apiVersion: v2 # \u0418\u043c\u044f \u0447\u0430\u0440\u0442\u0430 name: marmarks-chart # \u0412\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0440\u0442\u0430 version: 1.0.0 # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 description: Some project # \u0422\u0438\u043f type: application sources:   - https:\/\/github.com\/marmarks maintainers:   - name: Maksim Krylov     email: kryloumaksim@gmail.com     url: https:\/\/habr.com\/ru\/users\/Marmaksmark\/     # \u0412\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f appVersion: 1.0.0<\/code><\/pre>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b<\/h3>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0444\u0430\u0439\u043b values.yaml, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\u0430\u0440\u0442\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>--set <\/code>\u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0447\u0430\u0440\u0442\u0430<\/p>\n<pre><code class=\"yaml\">producer:   # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430   deployment:     # \u0418\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430     name: \"producer\"     # \u0427\u0438\u0441\u043b\u043e \u0440\u0435\u043f\u043b\u0438\u043a     replicas: 1     # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430   container:       name: \"producer-container\"       resources: { }     # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430   service:       name: \"producer-service\"       port: 8080     # \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0431\u0440\u0430\u0437\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430   image:       name: marmarks\/producer       tag: \"0.2\"       # \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u043e\u0431\u0440\u0430\u0437, \u0435\u0441\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u043d\u0435\u0442       pullPolicy: IfNotPresent   consumer:   deployment:     name: \"consumer\"     replicas: 1   container:     name: \"consumer-container\"     resources: { }   service:     name: \"consumer-service\"     port: 80     #  \u0442\u0438\u043f \u0441\u0435\u0440\u0432\u0438\u0441\u0430: ClusterIP, NodePort, LoadBalancer     type: LoadBalancer   image:     name: marmarks\/consumer     tag: \"0.5\"     pullPolicy: IfNotPresent<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0430\u0439\u043b  <em>_helpers.tpl<\/em>  \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>_helpers.tpl<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0418\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u043a \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.selectorLabels\" -}} app.kubernetes.io\/name: {{ .Chart.Name }} app.kubernetes.io\/instance: {{ .Release.Name }} {{- end -}}<\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0418\u043c\u044f \u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0440\u0442\u0430<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.chart\" -}} {{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 60 | trimSuffix \"-\" -}} {{- end -}}<\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u0418\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u043a \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.labels\" -}} helm.sh\/chart: {{ include \"marmarks-chart.chart\" . }} {{ include \"marmarks-chart.selectorLabels\" . }} {{- if .Chart.AppVersion }} app.kubernetes.io\/version: {{ .Chart.AppVersion | quote }} {{- end }} app.kubernetes.io\/managed-by: {{ .Release.Service }} {{- end -}}<\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0445\u044d\u0448 \u0441\u0443\u043c\u043c\u044b. \u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0430\u0440\u0442\u0430 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.propertiesHash\" -}} {{- $producerSecrets := include (print $.Template.BasePath \"\/producer-secrets.yaml\") . | sha256sum -}} {{- $consumerSecrets := include (print $.Template.BasePath \"\/consumer-secrets.yaml\") . | sha256sum -}} {{- $producerConfig := include (print $.Template.BasePath \"\/producer-config.yaml\") . | sha256sum -}} {{- $consumerConfig := include (print $.Template.BasePath \"\/consumer-config.yaml\") . | sha256sum -}} {{ print $producerSecrets $producerConfig $consumerSecrets $consumerConfig | sha256sum }} {{- end -}}<\/code><\/pre>\n<ol start=\"5\">\n<li>\n<p>\u0418\u043c\u0435\u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.producer.defaultName\" -}} {{- printf \"producer-%s\" .Release.Name -}} {{- end -}}  {{- define \"marmarks-chart.producer.deployment.name\" -}} {{- default (include \"marmarks-chart.producer.defaultName\" .) .Values.producer.deployment.name | trunc 63 | trimSuffix \"-\" -}} {{- end -}}  {{- define \"marmarks-chart.producer.container.name\" -}} {{- default (include \"marmarks-chart.producer.defaultName\" .) .Values.producer.container.name | trunc 63 | trimSuffix \"-\" -}} {{- end -}}  {{- define \"marmarks-chart.producer.service.name\" -}} {{- default (include \"marmarks-chart.producer.defaultName\" .) .Values.producer.service.name | trunc 63 | trimSuffix \"-\" -}} {{- end -}}<\/code><\/pre>\n<ol start=\"6\">\n<li>\n<p>\u0418\u043c\u0435\u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.consumer.defaultName\" -}} {{- printf \"consumer-%s\" .Release.Name -}} {{- end -}}  {{- define \"marmarks-chart.consumer.deployment.name\" -}} {{- default (include \"marmarks-chart.consumer.defaultName\" .) .Values.consumer.deployment.name | trunc 63 | trimSuffix \"-\" -}} {{- end -}}  {{- define \"marmarks-chart.consumer.container.name\" -}} {{- default (include \"marmarks-chart.consumer.defaultName\" .) .Values.consumer.container.name | trunc 63 | trimSuffix \"-\" -}} {{- end -}}  {{- define \"marmarks-chart.consumer.service.name\" -}} {{- default (include \"marmarks-chart.consumer.defaultName\" .) .Values.consumer.service.name | trunc 63 | trimSuffix \"-\" -}} {{- end -}}<\/code><\/pre>\n<ol start=\"7\">\n<li>\n<p>\u0418\u043c\u0435\u043d\u0430 \u043f\u0440\u043e\u0447\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (\u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432)<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">{{- define \"marmarks-chart.producerSecrets.defaultName\" -}} {{- printf \"producer-secrets-%s\" .Release.Name -}} {{- end -}}  {{- define \"marmarks-chart.consumerSecrets.defaultName\" -}} {{- printf \"consumer-secrets-%s\" .Release.Name -}} {{- end -}}  {{- define \"marmarks-chart.producerConfig.defaultName\" -}} {{- printf \"producer-config-%s\" .Release.Name -}} {{- end -}}  {{- define \"marmarks-chart.consumerConfig.defaultName\" -}} {{- printf \"consumer-config-%s\" .Release.Name -}} {{- end -}}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <em>consumer-config.yaml<\/em> \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"yaml\">apiVersion: v1 kind: ConfigMap metadata:   name: {{ include \"marmarks-chart.consumerConfig.defaultName\" . }}   labels:     {{- include \"marmarks-chart.labels\" . | nindent 4 }} data:   SPRING_PROFILES_ACTIVE: \"dev\"   SERVER_PORT: \"8080\"   SPRING_KAFKA_BOOTSTRAP_SERVERS: \"kafka:9092\"   SPRING_DATASOURCE_URL: \"jdbc:postgresql:\/\/postgresql-dev:5432\/postgres\"<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u0442\u0443 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c, url \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u0438 url \u0434\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041b\u043e\u0433\u0438\u043d-\u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0445 <em>consumer-secrets.yaml<\/em>:<\/p>\n<pre><code class=\"yaml\"># \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 #  \u0412\u0435\u0440\u0441\u0438\u044f API apiVersion: v1 # \u0422\u0438\u043f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 kind: Secret # \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 metadata:   # \u0418\u043c\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430   name: {{ include \"marmarks-chart.consumerSecrets.defaultName\" . }}   labels:     # \u041c\u0435\u0442\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430     {{- include \"marmarks-chart.labels\" . | nindent 4 }}   # \u0422\u0438\u043f \u0441\u0435\u043a\u0440\u0435\u0442\u0430: \u043d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0425\u0440\u0430\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0443 \"\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"   # \u0411\u0435\u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0440\u043e\u0442\u0430\u0446\u0438\u0438 \u0438 \u0442.\u0434. type: Opaque stringData:   SPRING_DATASOURCE_USERNAME: \"postgres\"   SPRING_DATASOURCE_PASSWORD: \"pgpass\"<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0438 \u0438\u0445 \u0442\u0438\u043f\u044b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 &#8212; <a href=\"https:\/\/habr.com\/ru\/companies\/southbridge\/articles\/658123\/\" rel=\"noopener noreferrer nofollow\">\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 secrets \u0432 Kubernetes<\/a><\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u0434\u0435\u0439\u043b\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f <em>consumer.yaml<\/em>. \u0418\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"yaml\">apiVersion: apps\/v1 kind: Deployment metadata:   name: {{ include \"marmarks-chart.consumer.deployment.name\" . }}   labels:     {{- include \"marmarks-chart.labels\" . | nindent 4 }}     tier: consumer {{\/*    \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f*\/}} spec: {{\/*  \u0427\u0438\u0441\u043b\u043e \u0440\u0435\u043f\u043b\u0438\u043a*\/}}   replicas: {{ .Values.consumer.deployment.replicas }}   selector: {{\/*    \u041c\u0435\u0442\u043a\u0438 \u043f\u043e\u0434\u043e\u0432*\/}}     matchLabels:       {{- include \"marmarks-chart.selectorLabels\" . | nindent 6 }}       tier: consumer {{\/*      \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f*\/}}   strategy: {{\/*    \u041f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435*\/}}     rollingUpdate: {{\/*      \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f*\/}}       maxSurge: 25% {{\/*      \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f*\/}}       maxUnavailable: 25% {{\/*      \u0422\u0438\u043f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f*\/}}     type: RollingUpdate {{\/*    \u0428\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432*\/}}   template:     metadata: {{\/*      \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438*\/}}       annotations: {{\/*        \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u043a \u0441\u0443\u043c\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432*\/}}         checksum\/config: {{ include \"marmarks-chart.propertiesHash\" . }}       labels:         {{- include \"marmarks-chart.selectorLabels\" . | nindent 8 }}         tier: consumer {{\/*        \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0430*\/}}     spec: {{\/*      \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u043f\u043e\u0434\u0435*\/}}       containers:         - name: {{ include \"marmarks-chart.consumer.container.name\" . }}           image: \"{{ .Values.consumer.image.name }}:{{ .Values.consumer.image.tag }}\"           imagePullPolicy: {{ .Values.consumer.image.pullPolicy }} {{\/*          \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433 \u043c\u0430\u043f\u044b*\/}}           envFrom:             - configMapRef:                 name: {{ include \"marmarks-chart.consumerConfig.defaultName\" . }} {{\/*          \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u044b*\/}}             - secretRef:                 name: {{ include \"marmarks-chart.producerSecrets.defaultName\" . }}           readinessProbe: {{\/*            \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0430*\/}}             httpGet:               path: \/actuator\/health               port: 8080             initialDelaySeconds: 5             periodSeconds: 3           ports: {{\/*            \u041f\u043e\u0440\u0442\u044b \u043f\u043e\u0434\u0430*\/}}             - containerPort: 8080 {{\/*              \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b*\/}}               protocol: TCP           resources: {{\/*            \u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430*\/}}             {{- toYaml .Values.consumer.container.resources | nindent 12 }}  ---  apiVersion: v1 kind: Service metadata:   name: {{ include \"marmarks-chart.consumer.service.name\" . }}   labels:     {{- include \"marmarks-chart.labels\" . | nindent 4 }}     tier: consumer spec:   type: {{ .Values.consumer.service.type }}   ports: {{\/*    \u041f\u043e\u0440\u0442 \u0441\u043b\u0443\u0436\u0431\u044b*\/}}     - port: {{ .Values.consumer.service.port }}       protocol: TCP {{\/*      \u041f\u043e\u0440\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0442\u0440\u0430\u0444\u0438\u043a*\/}}       targetPort: 8080 {{\/*      \u0418\u043c\u044f \u043f\u043e\u0440\u0442\u0430*\/}}       name: http {{\/*    \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0435\u043d\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c*\/}}   selector:     {{- include \"marmarks-chart.selectorLabels\" . | nindent 4 }}     tier: consumer<\/code><\/pre>\n<p>\u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, health checks \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u041d\u0430\u0448 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432 \u043a \u043f\u0440\u0438\u0451\u043c\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u0437 \u0431\u0440\u043e\u043a\u0435\u0440\u0430, \u0430 \u0431\u0440\u043e\u043a\u0435\u0440 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432 \u0435\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f<\/p>\n<h3>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c <\/h3>\n<details class=\"spoiler\">\n<summary>producer-config.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: v1 kind: ConfigMap metadata:   name: {{ include \"marmarks-chart.producerConfig.defaultName\" . }}   labels:     {{- include \"marmarks-chart.labels\" . | nindent 4 }} data:   SERVER_PORT: \"8080\"   SPRING_PROFILES_ACTIVE: \"dev\"   SPRING_DATASOURCE_URL: \"jdbc:postgresql:\/\/postgresql-dev:5432\/postgres\"<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>producer-secrets.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\"># \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 #  \u0412\u0435\u0440\u0441\u0438\u044f API apiVersion: v1 # \u0422\u0438\u043f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 kind: Secret # \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 metadata:   # \u0418\u043c\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430   name: {{ include \"marmarks-chart.producerSecrets.defaultName\" . }}   labels:     # \u041c\u0435\u0442\u043a\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430     {{- include \"marmarks-chart.labels\" . | nindent 4 }}   # \u0422\u0438\u043f \u0441\u0435\u043a\u0440\u0435\u0442\u0430: \u043d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0425\u0440\u0430\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0443  \"\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"   # \u0411\u0435\u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0440\u043e\u0442\u0430\u0446\u0438\u0438 \u0438 \u0442.\u0434. type: Opaque stringData:   SPRING_DATASOURCE_USERNAME: \"postgres\"   SPRING_DATASOURCE_PASSWORD: \"pgpass\"<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>producer.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: apps\/v1 kind: Deployment metadata:   name: {{ include \"marmarks-chart.producer.deployment.name\" . }}   labels:     {{- include \"marmarks-chart.labels\" . | nindent 4 }}     tier: producer spec:   replicas: {{ .Values.producer.deployment.replicas }}   selector:     matchLabels:       {{- include \"marmarks-chart.selectorLabels\" . | nindent 6 }}       tier: producer   strategy:     rollingUpdate:       maxSurge: 25%       maxUnavailable: 25%     type: RollingUpdate   template:     metadata:       labels:         {{- include \"marmarks-chart.selectorLabels\" . | nindent 8 }}         tier: producer     spec:       containers:         - name: {{ include \"marmarks-chart.producer.container.name\" . }}           image: \"{{ .Values.producer.image.name }}:{{ .Values.producer.image.tag }}\"           imagePullPolicy: {{ .Values.producer.image.pullPolicy }}           envFrom:             - configMapRef:                 name: {{ include \"marmarks-chart.producerConfig.defaultName\" . }}             - secretRef:                 name: {{ include \"marmarks-chart.producerSecrets.defaultName\" . }}           ports:             - containerPort: 8080               protocol: TCP           readinessProbe:             httpGet:               path: \/actuator\/health               port: 8080             initialDelaySeconds: 5             periodSeconds: 3           resources:             {{- toYaml .Values.producer.container.resources | nindent 12 }}  ---  apiVersion: v1 kind: Service metadata:   name: {{ include \"marmarks-chart.producer.service.name\" . }}   labels:     {{- include \"marmarks-chart.labels\" . | nindent 4 }}     tier: producer spec:   ports:     - port: {{ .Values.producer.service.port }}       protocol: TCP       targetPort: 8080       name: http   selector:     {{- include \"marmarks-chart.selectorLabels\" . | nindent 4 }}     tier: producer<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b  <\/h3>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/articles\/751256\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 <\/a>\u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 Helm Chart \u0433\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0447\u0430\u0440\u0442\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<p><code>helm install &lt;\u0438\u043c\u044f \u0447\u0430\u0440\u0442\u0430> .<\/code><\/p>\n<p>\u041d\u0430\u0448 \u0447\u0430\u0440\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043b\u043e\u0433\u0438 \u043d\u0435 \u0441\u043a\u0430\u0436\u0443\u0442 \u0438\u043d\u043e\u0433\u043e, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0417\u0430\u0439\u0434\u044f \u0432 \u043b\u043e\u0433\u0438 \u043f\u043e\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u043d \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0441\u0432\u043e\u044e \u0431\u0430\u0437\u0443. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0437\u0430\u0439\u0434\u044f \u0432 \u043b\u043e\u0433\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0431\u044b\u0441\u0442\u0440\u043e. <\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b  <\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0445\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0447\u044c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u044b\u043b\u0430 \u0431\u0435\u0437\u0443\u0441\u043f\u0435\u0448\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0432 DLT \u0442\u043e\u043f\u0438\u043a. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043c\u044b \u0437\u0430\u0439\u0434\u0451\u043c \u0432 \u043f\u043e\u0434 PostgreSQL \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u043c\u0441\u044f:<\/p>\n<p><code>psql -h postgresql-dev -p 5432 -U postgres -d postgres<\/code><\/p>\n<p>\u041d\u0430\u0441 \u043f\u043e\u043f\u0440\u043e\u0441\u044f\u0442 \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044c, \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e pgpass. \u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c:<\/p>\n<p><code>SELECT * FROM client_data;<\/code><\/p>\n<p>id  |  bank_bic        | bank_name | correlation_id    |    fio       |       last_update<br \/> &#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/> 1  | 1179896397   | null                | 1                       | \u0420\u0430\u0443\u043b\u044c 1| 2023-08-06 16:08:16.156<br \/> 2  | -1471064429 | null                | 2                        | \u0420\u0430\u0443\u043b\u044c 2| 2023-08-06 16:08:16.221<br \/> 3  | -604766198   | null                | 3                        | \u0420\u0430\u0443\u043b\u044c 3| 2023-08-06 16:08:16.228<br \/> 4  | -771359675   | null                | 4                        | \u0420\u0430\u0443\u043b\u044c 4| 2023-08-06 16:08:16.232<br \/> 5  | 1082682564  | null                | 5                        | \u0420\u0430\u0443\u043b\u044c 5| 2023-08-06 16:08:16.237<br \/>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435  <\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u0432\u0435\u043d\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0447\u0435\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 Evential Consistency.<br \/>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 <a href=\"https:\/\/github.com\/MarMaksk\/kafka-connect-consumer\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f <\/a>\u0438 <a href=\"https:\/\/github.com\/MarMaksk\/consumer-producer-helm-chart\" rel=\"noopener noreferrer nofollow\">Helm Chart<\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/751330\/\"> https:\/\/habr.com\/ru\/articles\/751330\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438 &#8212;<a href=\"https:\/\/habr.com\/ru\/articles\/751256\/\" rel=\"noopener noreferrer nofollow\"> \u0418\u0432\u0435\u043d\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kafka \u0438 Kafka Connect: \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/a>.<\/p>\n<p>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0433\u0438\u0431\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Apache Kafka \u0438 Kafka Connect! \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0438\u0432\u0435\u043d\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 Kafka, \u0447\u0442\u043e\u0431\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043d\u0430 Java, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c Avro-\u0441\u0445\u0435\u043c\u044b \u0438\u0437 Schema Registry \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 Kafka, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Kafka Connect. \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430, \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u0438\u0445 \u0441\u0432\u043e\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0441\u0432\u043e\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0426\u0435\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<ol>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Kafka.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Avro-\u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0438 Schema Registry \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 Kafka \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 PostgreSQL \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Helm Chart \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0432 Kubernetes.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Kubernetes \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f  <\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u0430\u0448 POM \u0444\u0430\u0439\u043b<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;dependencies> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>com.google.guava&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>guava&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;version>32.1.1-jre&lt;\/version> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>io.confluent&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>kafka-avro-serializer&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;version>7.4.0&lt;\/version> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>io.confluent&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>kafka-schema-registry-client&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;version>7.4.0&lt;\/version> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-data-jpa&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-actuator&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-web&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.kafka&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-kafka&lt;\/artifactId> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.postgresql&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>postgresql&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;scope>runtime&lt;\/scope> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.projectlombok&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>lombok&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;optional>true&lt;\/optional> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.boot&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-boot-starter-test&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;scope>test&lt;\/scope> \u00a0&lt;\/dependency> \u00a0&lt;dependency> \u00a0\u00a0\u00a0&lt;groupId>org.springframework.kafka&lt;\/groupId> \u00a0\u00a0\u00a0&lt;artifactId>spring-kafka-test&lt;\/artifactId> \u00a0\u00a0\u00a0&lt;scope>test&lt;\/scope> \u00a0&lt;\/dependency> &lt;\/dependencies><\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e Schema Regestry, PostgreSQL, Kafka \u0438 \u043f\u0440\u043e\u0447. \u0427\u0442\u043e\u0431\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 io.confluent \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e<\/p>\n<pre><code class=\"xml\">&lt;repositories> \u00a0&lt;repository> \u00a0\u00a0\u00a0&lt;id>confluent&lt;\/id> \u00a0\u00a0\u00a0&lt;url>https:\/\/packages.confluent.io\/maven\/&lt;\/url> \u00a0&lt;\/repository> &lt;\/repositories><\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c yaml \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"yaml\"># \u041f\u043e\u0440\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 server: \u00a0\u00a0port: 8081 # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Spring spring: \u00a0\u00a0main: \u00a0\u00a0\u00a0\u00a0allow-bean-definition-overriding: true \u00a0\u00a0application: \u00a0\u00a0\u00a0\u00a0name: kafka-example-consumer \u00a0\u00a0jpa: \u00a0\u00a0\u00a0\u00a0# \u0414\u0438\u0430\u043b\u0435\u043a\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u00a0\u00a0\u00a0\u00a0database-platform: org.hibernate.dialect.PostgreSQLDialect \u00a0\u00a0\u00a0\u00a0generate-ddl: false \u00a0\u00a0\u00a0\u00a0hibernate: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ddl-auto: update \u00a0\u00a0\u00a0\u00a0show-sql: true \u00a0\u00a0\u00a0\u00a0properties: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0hibernate: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0generate_statistics: false \u00a0\u00a0datasource: \u00a0\u00a0\u00a0\u00a0# URL \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u00a0\u00a0\u00a0\u00a0url: jdbc:postgresql:\/\/localhost:5432\/public \u00a0\u00a0\u00a0\u00a0username: postgres \u00a0\u00a0\u00a0\u00a0password: postgres \u00a0\u00a0kafka: \u00a0\u00a0\u00a0\u00a0schema: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0registry: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u041f\u0443\u0442\u0438 \u0434\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0441\u0445\u0435\u043c \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0urls: http:\/\/schema-registry-cp-schema-registry:8081 \u00a0\u00a0\u00a0\u00a0bootstrap-servers: localhost:29092 \u00a0\u00a0\u00a0\u00a0listener: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u041a\u0430\u043a \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ack-mode: record \u00a0\u00a0\u00a0\u00a0producer: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client-id: ${spring.application.name} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043b\u044e\u0447\u0430 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0key-serializer: org.apache.kafka.common.serialization.StringSerializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 DLT \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value-serializer: ru.marmarks.consumer.config.DltMessageSerializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0retries: 3 \u00a0\u00a0\u00a0\u00a0consumer: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0group-id: ${spring.application.name} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0autoOffsetReset: earliest \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0keyDeserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0valueDeserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0properties: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0422\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 JSON \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spring.json.value.default.type: org.apache.avro.generic.GenericRecord \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spring.deserializer.key.delegate.class: org.apache.kafka.common.serialization.StringDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spring.deserializer.value.delegate.class: io.confluent.kafka.serializers.KafkaAvroDeserializer \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0specific: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0avro: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0reader: true \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u0445\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0schema: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0registry: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url: http:\/\/schema-registry-cp-schema-registry:8081 # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Kafka kafka: \u00a0\u00a0topics: \u00a0\u00a0\u00a0\u00a0# \u0422\u043e\u043f\u0438\u043a \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u00a0\u00a0\u00a0\u00a0personal-data: kafka-connect-personal_data \u00a0\u00a0services: \u00a0\u00a0\u00a0\u00a0# \u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0438\u0437 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0\u00a0personal-data: kafka-connect-personal_data<\/code><\/pre>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Schema Registry \u0438 Kafka \u0431\u0440\u043e\u043a\u0435\u0440\u0443  <\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e Kafka. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u043a\u043e\u0434\u0435. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Schema Regestry, \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 dlt \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/p>\n<details class=\"spoiler\">\n<summary>KafkaConfiguration.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Configuration @EnableKafka @RequiredArgsConstructor @EnableConfigurationProperties(SchemaRegistryProperties.class) public class KafkaConfiguration { \u00a0private static final int DEFAULT_CACHE_CAPACITY = 200; \u00a0private static final String DLT_TOPIC_SUFFIX = \".dlt\"; \u00a0private final ConsumerFactory&lt;String, GenericRecord> consumerFactory; \u00a0private final ProducerFactory&lt;Object, Object> producerFactory;  \u00a0@Bean \u00a0public ConcurrentKafkaListenerContainerFactory&lt;String, GenericRecord> objectKafkaListenerContainerFactory( \u00a0\u00a0\u00a0\u00a0\u00a0DefaultErrorHandler errorHandler \u00a0) { \u00a0\u00a0\u00a0ConcurrentKafkaListenerContainerFactory&lt;String, GenericRecord> factory = new ConcurrentKafkaListenerContainerFactory&lt;>(); \u00a0\u00a0\u00a0factory.setConsumerFactory(consumerFactory); \u00a0\u00a0\u00a0factory.setCommonErrorHandler(errorHandler); \u00a0\u00a0\u00a0return factory; \u00a0}  \u00a0\/** \u00a0\u00a0* \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u00a0\u00a0*\/ \u00a0@Bean \u00a0public CachedSchemaRegistryClient cachedSchemaRegistryClient( \u00a0\u00a0\u00a0\u00a0\u00a0SchemaRegistryProperties schemaRegistryProperties) { \u00a0\u00a0\u00a0\/\/ \u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0441\u043e Schema Registry \u00a0\u00a0\u00a0RestService restService = new RestService(schemaRegistryProperties.urls()); \u00a0\u00a0\u00a0\/\/\u0422\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448\u0430 \u0441\u0445\u0435\u043c \u00a0\u00a0\u00a0return new CachedSchemaRegistryClient(restService, DEFAULT_CACHE_CAPACITY); \u00a0}  \u00a0@Bean \u00a0public KafkaTemplate&lt;Object, Object> kafkaTemplate() { \u00a0\u00a0\u00a0return new KafkaTemplate&lt;>(producerFactory); \u00a0}  \u00a0\/** \u00a0\u00a0* \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0440 \u0432 dead-letter topic. \u00a0\u00a0*\/ \u00a0@Bean \u00a0public DeadLetterPublishingRecoverer publisher(KafkaTemplate&lt;Object, Object> bytesTemplate) { \u00a0\u00a0\u00a0\/\/\u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 DLT. \u00a0\u00a0\u00a0\/\/\u00a0 \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 TopicPartition, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043c\u044f    \/\/\u0442\u043e\u043f\u0438\u043a\u0430 (consumerRecord.topic()) \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0441\u0443\u0444\u0444\u0438\u043a\u0441 DLT_TOPIC_SUFFIX, \u00a0\u00a0\u00a0\/\/\u00a0 \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 (consumerRecord.partition()). \u00a0\u00a0\u00a0\/\/\u00a0 \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 DLT \u0442\u043e\u043f\u0438\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439    \/\/\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 \u043e\u0442\u043a\u0443\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u00a0\u00a0\u00a0return new DeadLetterPublishingRecoverer(bytesTemplate, (consumerRecord, exception) -> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new TopicPartition(consumerRecord.topic() + DLT_TOPIC_SUFFIX, consumerRecord.partition())); \u00a0}  \u00a0\/** \u00a0\u00a0* \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 kafka \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u00a0\u00a0*\/ \u00a0@Bean \u00a0public DefaultErrorHandler errorHandler( \u00a0\u00a0\u00a0\u00a0\u00a0DeadLetterPublishingRecoverer deadLetterPublishingRecoverer) { \u00a0\u00a0\u00a0final var handler = new DefaultErrorHandler(deadLetterPublishingRecoverer); \u00a0\u00a0\u00a0\/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 DLT \u00a0\u00a0\u00a0handler.addNotRetryableExceptions(Exception.class); \u00a0\u00a0\u00a0return handler; \u00a0}  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c:\u00a0<\/p>\n<pre><code class=\"java\">public class ClientData {  \u00a0@Id \u00a0@GeneratedValue(strategy = GenerationType.IDENTITY) \u00a0private Long id; \u00a0private String bankBic; \u00a0private String bankName; \u00a0private String fio; \u00a0private Long correlationId; \u00a0private LocalDateTime lastUpdate;  }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 &#8212; fio, correlationId. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0424\u0418\u041e, \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430  <\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<details class=\"spoiler\">\n<summary>KafkaConsumerListeners.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class KafkaConsumerListeners {  \u00a0\/\/ \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u00a0private final List&lt;ServiceResolver> serviceResolverList; \u00a0\/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u043e\u043f\u0438\u043a\u0438 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c. \u0418\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e.   \/\/\u0422\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043b\u0438\u0441\u0442\u043d\u0435\u0440\u0430 \u00a0@KafkaListener(topics = \"#{'${kafka.topics.personal-data}'.split(',')}\", containerFactory = \"objectKafkaListenerContainerFactory\") \u00a0\/\/ \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 GenericRecord.   \/\/\u041c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430    \/\/\u0441\u0445\u0435\u043c\u0430 \u0432 Schema Regestry \u00a0void readOrganizationConnectorMessages(ConsumerRecord&lt;String, GenericRecord> message) { \u00a0\u00a0\u00a0readMessage(message); \u00a0}  \u00a0private void readMessage(ConsumerRecord&lt;String, GenericRecord> message) { \u00a0\u00a0\u00a0String topic = message.topic(); \u00a0\u00a0\u00a0long offset = message.offset(); \u00a0\u00a0\u00a0log.info(\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u043e\u043f\u0438\u043a\u0430: {} offset: {}\", topic, offset);  \u00a0\u00a0\u00a0\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0430\u043c\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0GenericRecord value = message.value();  \u00a0\u00a0\u00a0if (value<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-407166","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/407166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=407166"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/407166\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=407166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=407166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=407166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}