{"id":326491,"date":"2021-07-15T15:00:14","date_gmt":"2021-07-15T15:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326491"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326491","title":{"rendered":"\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u0437\u0430\u0445\u0432\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0437 PostgreSQL\/MySQL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Flink"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/138\/1fa\/a65\/1381faa65d3a57cef249a497211b5454.jpg\" width=\"1459\" height=\"730\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0430\u0441\u0442\u044c 1: \u0412\u0432\u043e\u0434\u043d\u043e-\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f (\u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f)<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 <strong>Change Data Capture<\/strong> (\u0434\u0430\u043b\u0435\u0435 \u2013 <strong>CDC<\/strong>) \u0432 Apache Flink.&nbsp;<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439: \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b <strong>Change Data Capture<\/strong>, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2013 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b Apache Flink, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 (\u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e\u0431 Apache Flink \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f). \u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u2013 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0437\u0430\u043a\u0430\u0442\u0430\u0435\u043c \u0440\u0443\u043a\u0430\u0432\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0437 WAL PostgreSQL, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0435\u0439, \u0441\u0442\u0435\u043a\u043e\u043c ELK \u0438 \u0446\u0435\u043b\u044b\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c Flink, \u043f\u0440\u0430\u0432\u0434\u0430 \u0432 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, CDC. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Change_data_capture#:~:text=In%20databases%2C%20change%20data%20capture,taken%20using%20the%20changed%20data.\"><u>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f<\/u><\/a> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e <strong>Change Data Capture <\/strong>\u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u043d\u0438\u0447\u0442\u043e \u0438\u043d\u043e\u0435, \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. <em>\u201c\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\u201d<\/em>, <em>\u201c\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u201d<\/em>, <em>\u201c\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u201d<\/em> \u2013 \u044d\u0442\u0438 \u0441\u043b\u043e\u0432\u0430-\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0440\u044e \u044d\u043c\u043e\u0446\u0438\u0439 \u0438 \u043d\u0435\u043c\u0438\u043d\u0443\u0435\u043c\u043e \u0443\u0432\u043e\u0434\u044f\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. <strong>CDC<\/strong> \u2013 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <em>event-driven<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u0445\u043e\u0442\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041c\u044b \u0432 Neoflex \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0441\u0442\u0440\u043e\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0430\u043c \u043d\u0435 \u0447\u0443\u0436\u0434 event-driven \u0434\u0438\u0437\u0430\u0439\u043d (\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2013 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!).<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 event-driven? \u041f\u043e\u0437\u0432\u043e\u043b\u044e \u0441\u0435\u0431\u0435 \u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0443 <em>\u201cEvent Streams in Action\u201d (\u0438\u0437\u0434. Manning, 2019 \u0433.):<\/em><\/p>\n<p><em>\u201c\u0425\u043e\u0442\u0438\u0442\u0435 \u0432\u0435\u0440\u044c\u0442\u0435 \u2013 \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0435\u0442, \u043d\u043e \u0432\u0430\u0448\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u043d\u0435 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u0442 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435 \u0438 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u0445 \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430:<\/em><\/p>\n<ul>\n<li>\n<p><em>\u041b\u044e\u0434\u0435\u0439 \u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435: \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0438, \u043c\u0430\u0440\u043a\u0435\u0442\u043e\u043b\u043e\u0433\u0438, \u043a\u043e\u043c\u043c\u0438\u0442\u044b, \u0440\u0435\u043b\u0438\u0437\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435;<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0421\u043e\u0444\u0442 \u0438 \u0436\u0435\u043b\u0435\u0437\u043e, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f;<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0417\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u0437\u0430\u0432\u0442\u0440\u0430 \u0438\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043d\u0435\u0434\u0435\u043b\u0438.<\/em><\/p>\n<\/li>\n<\/ul>\n<p><em>\u041b\u044e\u0434\u0438 \u0436\u0438\u0432\u0443\u0442 \u0432 \u044d\u0442\u043e\u0439 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0422\u0435, \u043a\u0442\u043e \u043e\u0441\u043c\u0435\u043b\u0438\u0442\u0441\u044f \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043a\u0430\u043a \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u0438 \u0447\u0442\u0435\u043d\u0438\u0439 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0440\u0438\u0441\u043a\u0443\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0441\u0441\u0443\u0434\u043e\u043a, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0438\u043c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430 \u0434\u043d\u0435\u0439 \u043e\u0442\u0433\u0443\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0439\u0442\u0438 \u0432 \u0441\u0435\u0431\u044f.<\/em><\/p>\n<p><em>\u0421\u0443\u0440\u043e\u0432\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u043b\u0438\u0448\u0435\u043d\u044b \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041e\u043d\u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441\u0430:<\/em><\/p>\n<p><strong><em>\u201c\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u2013 \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044f \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\u201d<\/em><\/strong><\/p>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u043d\u0430 \u044d\u0442\u043e\u0439 \u043d\u043e\u0442\u0435 \u043c\u044b \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u043d\u0430\u0448\u0435 \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435.  <\/p>\n<h4>\u0413\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c CDC?<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0431\u0430\u043d\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u0447\u0435\u0442\u0430\u0445 \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0430\u043d\u043a\u0430, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0444\u0440\u043e\u0434-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c. \u041f\u0440\u044f\u043c\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0437\u0440\u044b\u0432\u043d\u043e\u0439 \u0440\u043e\u0441\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0431\u0430\u043d\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0443 15-\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 \u043e\u0431\u0435\u0434\u0430, \u0442\u043e \u043d\u0435\u043c\u0430\u043b\u0430\u044f \u0438\u0445 \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u043d\u0430 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442. \u041f\u0438\u043a\u043e\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0430\u043d\u043a\u0438\u043d\u0433 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0442\u0440\u0443\u0434\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0421\u0445\u0435\u043c\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5da\/d11\/751\/5dad11751561ba5242f5cb432f0d89a3.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 - \u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0411\u0414\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 - \u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0411\u0414\" width=\"1095\" height=\"514\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 &#8212; \u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0411\u0414<\/figcaption><\/figure>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043d\u0435 \u0442\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e (\u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e). \u041e\u043d\u0430 \u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e \u0438 \u0440\u044f\u0434\u043e\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438? \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u2013 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c CDC, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043d\u0430\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c-\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043d\u0430 \u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0432 \u0434\u0443\u0445\u0435 \u201c\u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u201d (\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u2013 <em>event-carried state transfer <\/em>\u0438\u043b\u0438 <em>event sourcing<\/em>).&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/584\/4ab\/414\/5844ab41437f4a4fb3e9750af1235f3c.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2 - \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2 - \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\" width=\"1174\" height=\"798\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2 &#8212; \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/figcaption><\/figure>\n<p>\u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u043d\u043a\u0438\u0439 \u0438 \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u043d\u0443 \u0441\u043e\u0442\u043d\u044e \u043a\u043e\u043f\u0438\u0439 \u2013 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0441\u0442\u0435\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432) \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c\u0438. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0432\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439 \u0431\u044b \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 (\u0430 \u0441 \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u0433\u043e <em>Flink <\/em>\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0438\u043d\u0430\u0447\u0435 \u043a\u0430\u043a <em>\u201c\u0448\u0443\u0441\u0442\u0440\u044b\u0439\u201d<\/em>) \u043d\u0435 \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CDC, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0432\u043e\u044e \u043b\u0435\u043f\u0442\u0443 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.&nbsp;<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 <em>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439<\/em>, \u0430 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435 <em>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 (exactly-once)<\/em> \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c (\u0438\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0431\u044b\u0442\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438). \u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0435\u043e\u0440\u0435\u043c\u0443 CAP, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0436\u0435\u0440\u0442\u0432\u0443\u0435\u043c \u0431\u0443\u043a\u0432\u043e\u0439 \u201cC\u201d (\u0447\u0438\u0442\u0430\u0439 \u2013 consistency), \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0445\u043e\u0434\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0439 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u041d\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u043e\u0434\u0438\u043d\u0435 Apache Flink: <em>\u201cDer Teufel ist nicht so schwarz wie man ihn malt\u201d<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0442 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0441\u0442\u0440\u0430\u0448\u0435\u043d. \u0417\u0430\u0442\u043e \u0432\u0437\u0430\u043c\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0438\u0431\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0437\u0434\u0435\u0441\u044c \u0440\u0435\u0447\u044c \u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 stateful-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435), \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u043c \u043e\u0431\u0449\u0435\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043d\u0430 \u0444\u043e\u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432 \u043c\u044b \u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0430\u043d\u043a\u0430, \u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0431\u043e\u0439 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0441\u0447\u0435\u0442, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e (\u043d\u043e \u0434\u0435\u0440\u0436\u0438\u043c \u0432 \u0443\u043c\u0435 \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u0433\u043e \u0447\u0435\u0440\u0442\u0438\u043a\u0430 \u0441 \u0435\u0433\u043e \u043e\u0431\u0432\u0438\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b).<\/p>\n<p>\u0418 \u0432\u0441\u0435 \u0436\u0435, \u0441\u043d\u043e\u0432\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f\u043c <em>change data capture<\/em>. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0430 \u0433\u043b\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0435\u0440\u0432\u044b\u0439 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u043c <em>full scan<\/em>\u2019\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <em>Kafka JDBC Source<\/em> \u0438 <em>Sqoop<\/em>. \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u044f\u0434 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 full scan\u2019\u043e\u0432 \u0432\u043d\u043e\u0441\u0438\u0442 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 (\u0447\u0438\u0442\u0430\u0439 \u2013 latency). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c <em>slow-change dimension<\/em> \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 DWH.<\/p>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0421\u0423\u0411\u0414, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u043c\u0435\u043a\u0430\u043b\u043a\u0443 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439! \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c <em>binlog<\/em>\u2019\u0438 MySQL \u0438\u043b\u0438 <em>WAL <\/em>PostgreSQL. \u041e\u0431\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445.&nbsp; \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <em>Debezium<\/em>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043b\u043e\u0433\u0435 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u044f\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442\u043e \u0432 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 <em>table scan<\/em>, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u2013 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0443\u0437\u043b\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430 \u0444\u043e\u043d\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0435\u0445\u0438 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0439 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0443\u0441\u043f\u0435\u0445!<\/p>\n<p>\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 CDC \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0433\u0434\u0435 \u201cE\u201d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0430\u043d\u0430\u043b\u0438\u0437 \u043b\u043e\u0433\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u201cT\u201d \u2013 \u043f\u043e \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u201cL\u201d \u2013 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b \u0438\u043b\u0438 \u0441\u044b\u0440\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044e. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 ETL, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e \u0442\u0430\u043a\u043e\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u0442\u0435\u043a\u0435 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ed5\/a22\/1a5\/ed5a221a5bc0bdea5c3d8bfe761dff39.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3 - \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 ETL\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3 - \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 ETL\" width=\"369\" height=\"702\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3 &#8212; \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 ETL<\/figcaption><\/figure>\n<h2>\u0427\u0430\u0441\u0442\u044c 2: \u0423\u0441\u043b\u043e\u0432\u043d\u043e-\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f (\u0440\u0430\u0441\u0441\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f)<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u043a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b\u0438, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Apache Flink \u0438 \u0435\u0433\u043e CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 Apache Flink \u0434\u043b\u044f \u0432\u0430\u0441 \u0432 \u043d\u043e\u0432\u0438\u043d\u043a\u0443, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Neoflex \u043d\u0430 <a href=\"https:\/\/youtu.be\/7O_dVzY0SbU\"><u>YouTube<\/u><\/a>.<\/p>\n<p>\u0412 \u0432\u0435\u0440\u0441\u0438\u0438 1.11 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Apache Flink \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438 CDC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0440\u0430\u043b\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0433\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e (\u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <em>TableSource API<\/em>. \u041d\u043e\u0432\u044b\u0439 API \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0438\u043f\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445:&nbsp;<\/p>\n<ol>\n<li>\n<p><em>INSERT<\/em>;<\/p>\n<\/li>\n<li>\n<p><em>UPDATE_BEFORE<\/em>;<\/p>\n<\/li>\n<li>\n<p><em>UPDATE_AFTER;&nbsp;<\/em><\/p>\n<\/li>\n<li>\n<p><em>DELETE<\/em>.&nbsp;<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u0438\u043b\u0438\u0441\u044c \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043b\u043e\u0433\u043e\u0432 \u0421\u0423\u0411\u0414.&nbsp;<\/p>\n<p>Flink \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0443\u043c\u0435\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 Debezium \u0432 \u0447\u0430\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0411\u0414 \u0432 JSON \u0438 \u0438\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API Apache Flink. \u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e JSON \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0438\u0436\u0435:<\/p>\n<p><code>{<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"before\":null,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"after\": {<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"pk\":\"1\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"value\":\"New data\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;},<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"source\": {<\/code><\/p>\n<p><code>...<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"snapshot\":\"incremental\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;},<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"op\":\"r\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"ts_ms\":\"1620393591654\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"transaction\":null<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0438 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 <em>event-carried state transfer<\/em> \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0447\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u0432 \u0448\u0430\u0433\u0438 \u201cExtract\u201d \u0438 \u201cTransform\u201d \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: Debezium \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u043b\u043e\u0433\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u0442\u043e\u043f\u0438\u043a Apache Kafka. \u0414\u0436\u043e\u0431 Apache Flink \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043f\u0438\u043a \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 JSON \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Debezium, \u043d\u0430\u043b\u0435\u0442\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044f \u0438\u0445 \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <em>Kafka Table<\/em>. \u041f\u0430\u0440\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Flink \u0438 \u0432\u0443\u0430\u043b\u044f \u2013 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0433\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/afa\/a69\/366\/afaa693661b9a7aa8bc6eca3a5e85058.png\" width=\"624\" height=\"875\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u043b\u0438\u0448\u0435\u043d \u0441\u0432\u043e\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0442\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u2013 \u0432\u044b\u0448\u0435. \u041f\u043e\u043b\u043e\u0436\u0430 \u0440\u0443\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0434\u0446\u0435, \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0435\u043c\u0430\u043b\u043e.<\/p>\n<p>\u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0436\u043e\u0431 Apache Flink \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432. \u0421\u0436\u0438\u043c\u0430\u0435\u043c ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0443\u043f\u0435\u0440-\u0448\u0430\u0433\u0430:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/906\/da8\/918\/906da8918455a8a6897cfd210a93999d.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4 - \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 ETL\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4 - \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 ETL\" width=\"369\" height=\"405\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4 &#8212; \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 ETL<\/figcaption><\/figure>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <a href=\"https:\/\/github.com\/ververica\/flink-cdc-connectors\"><u>Flink CDC Connectors<\/u><\/a>! \u042d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f MySQL \u0438 PostgreSQL, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 Alibaba \u0438 Ververica, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u043e\u0433\u0430\u043c \u0411\u0414 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Flink-\u0434\u0436\u043e\u0431\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0432\u044f\u0437\u043a\u0443 Debezium + Apache Kafka. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f \u043a\u0443\u0434\u0430 \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u043f\u0440\u0435\u0436\u043d\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0448\u0430\u0433\u043e\u0432 \u201cE\u201d \u0438 \u201cT\u201d, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u201cL\u201d \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c).<\/p>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b CDC \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Debezium, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u043e\u043d \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043d\u044d\u043f\u0448\u043e\u0442\u044b \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0411\u0414 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0436\u043e\u0431\u0430.<\/p>\n<p>\u041c\u043d\u043e\u0433\u043e\u0433\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432\u043e\u0441\u0445\u0438\u0449\u0430\u0435\u0442 \u0441\u0432\u043e\u0435\u0439 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>Join\u2019\u044b \u0434\u0430\u043d\u043d\u044b\u0445 DWH \u0438 \u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0411\u0414;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 ETL \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0442\u043e\u043f\u0438\u043a\u0438 Apache Kafka;<\/p>\n<\/li>\n<li>\n<p>Join\u2019\u044b \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0411\u0414 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 stateful-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435 \u0445\u043e\u0447\u0443 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043c\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u043c\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0436\u0443 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 3: \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e-\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f&nbsp;<\/h2>\n<h4>\u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/h4>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f&nbsp; \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u0444\u0438\u043d\u0442\u0435\u0445-\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0435\u0435 \u0434\u0435\u0431\u0440\u0438) \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 PostgreSQL), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0440\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75c\/bff\/c91\/75cbffc919e8a0c2b29515141a907a63.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5- \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5- \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435\" width=\"702\" height=\"284\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5- \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/figcaption><\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 <em>Clients <\/em>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435: \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 id, \u0438\u043c\u044f, \u0444\u0430\u043c\u0438\u043b\u0438\u044e, \u043f\u043e\u043b \u0438 \u0442. \u0434. \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u0440\u0430\u0437\u0440\u044f\u0434\u0443 <em>slow-change dimension<\/em>. Flink CDC \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438: \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u043d\u044d\u043f\u0448\u043e\u0442\u0430 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u2013 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437 WAL.<\/p>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 <em>ClientTransactions <\/em>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445 \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0441\u0447\u0435\u0442\u0430\u043c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0430\/\u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2013 <em>ClientLocation<\/em>, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.&nbsp;<\/p>\n<p>\u0418\u0442\u0430\u043a, <strong>\u0437\u0430\u0434\u0430\u0447\u0430<\/strong>: \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f <em>Clients<\/em> \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>Flink Table API<\/em>, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d <em>event-driven state transfer<\/em>. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>ClientTransactions <\/em>\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432 <em>tumbling window<\/em> (\u043d\u0435 \u0445\u043e\u0447\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u201c\u043f\u0440\u044b\u0433\u0430\u044e\u0449\u0438\u043c \u043e\u043a\u043d\u043e\u043c\u201d) \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>ClientLocation <\/em>\u0438 \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0438\u0437 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>Clients<\/em>. \u0415\u0441\u043b\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0438\u043d\u0430\u0447\u0435 \u2013 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 Elasticsearch \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0414\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u043d\u0435\u0441\u0435\u043c \u0432 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u044f: \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439).<\/p>\n<p>\u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c (\u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u2013 \u0441\u0443\u0433\u0443\u0431\u043e \u0432 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445!) \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0441\u0442\u0440\u0438\u043c\u043e\u0432\u044b\u0439 API Apache Flink, \u043e\u0449\u0443\u0442\u0438\u0432 \u0432\u0441\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u043e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da1\/8c0\/84b\/da18c084b760bf2895f3a4afd85ce439.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6 - \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6 - \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\" width=\"753\" height=\"954\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6 &#8212; \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/figcaption><\/figure>\n<h4>\u0411\u0435\u0440\u0435\u043c \u043c\u043e\u043b\u043e\u0442\u043e\u043a, \u0441\u043e\u043e\u0440\u0443\u0436\u0430\u0435\u043c docker compose<\/h4>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <em>docker compose, <\/em>\u0432 YAML \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b (\u0437\u0430\u043f\u0430\u0441\u0438\u0442\u0435\u0441\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e!):<\/p>\n<ol>\n<li>\n<p><strong>PostgreSQL<\/strong> \u2013 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u0430\u0441\u0442\u0435\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p><strong>Elasticsearch<\/strong> \u2013 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p><strong>Kibana<\/strong> \u2013 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 Elasticsearch;<\/p>\n<\/li>\n<li>\n<p><strong>Job Manager<\/strong> \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Apache Flink (\u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0434\u043d\u043e\u0439 \u0448\u0442\u0443\u043a\u0438) \u2013 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c Flink;<\/p>\n<\/li>\n<li>\n<p><strong>Task Manager<\/strong> \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Apache Flink (\u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0434\u043d\u043e\u0439 \u0448\u0442\u0443\u043a\u0438) \u2013 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f DAG-\u0433\u0440\u0430\u0444\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 CDC-\u0434\u0436\u043e\u0431\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b <em>docker-compose.yml<\/em> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e <a href=\"https:\/\/github.com\/Lockdain\/flink-cdc-demo\/blob\/main\/docker\/docker-compose.yml\"><u>\u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 GitHub<\/u><\/a>.&nbsp;<\/p>\n<p>\u041a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, Apache Flink \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0443\u0437\u043b\u043e\u0432, \u0433\u043b\u0430\u0432\u043d\u044b\u043c\u0438 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <em>Job Manager<\/em> \u0438 <em>Task Manager<\/em>. \u0414\u043b\u044f <em>Task Manager<\/em> \u043c\u044b \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0442\u043e\u0432 (\u0447\u0438\u0442\u0430\u0439 \u2013 \u043f\u043e\u0442\u043e\u043a\u043e\u0432) \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0436\u043e\u0431\u0430 (\u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u043e\u0434\u043d\u043e\u0433\u043e):<\/p>\n<p><code>FLINK_PROPERTIES=<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskmanager.numberOfTaskSlots: 1<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parallelism.default: 1<\/code><\/p>\n<p>\u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 WAL Postgres \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>wal_level <\/em>\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<em> <\/em>\u0431\u044b\u043b \u043d\u0435 \u043d\u0438\u0436\u0435 \u0443\u0440\u043e\u0432\u043d\u044f <em>logical<\/em>. \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2013 <em>minimal<\/em>, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.postgresql.org\/docs\/9.6\/runtime-config-wal.html\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>.   <\/p>\n<p><code>ALTER SYSTEM SET wal_level = logical;<\/code>  <\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c <em>docker-compose.yml<\/em> \u044d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <em>command <\/em>\u0441\u0435\u0440\u0432\u0438\u0441\u0430 <em>Postgres<\/em>:<\/p>\n<p><code>command:<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- \"postgres\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- \"-c\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- \"wal_level=logical\"<\/code><\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446 PostgreSQL \u2013 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:<\/p>\n<p><code>ALTER TABLE &lt;table name&gt;<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;REPLICA IDENTITY FULL;<\/code><\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 (\u0432 \u0432\u0438\u0434\u0435 \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u0438 \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 CDC-\u0434\u0436\u043e\u0431\u0430 Flink), \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430:<\/p>\n<p><code>REPLICA IDENTITY for 'accounts.Clients' is 'FULL'; UPDATE AND DELETE events will contain the previous values of all the columns<\/code><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0437 PostgreSQL \u0438\u0437 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 Debezium \u2013 <em>debezium\/postgres<\/em>. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f WAL: <em>wal2json<\/em> \u0438 <em>postgres-decoderbufs<\/em>. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>postgres-decoderbufs<\/em>.<\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0435\u0442\u0430\u043b\u0435\u0439<\/h4>\n<p>CDC-\u0434\u0436\u043e\u0431\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c <em>session-cluster\u2019<\/em>\u0435 Apache Flink. \u042d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0436\u043e\u0431\u043e\u0432 \u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0432\u0435\u0441<em> job-cluster<\/em>\u2019\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0434\u0436\u043e\u0431\u0430. \u041a\u0430\u043a \u0438 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438\u0441\u044c, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 Apache Flink.&nbsp;<\/p>\n<p>\u0417\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 Postgres \u0431\u0443\u0434\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flink SQL, \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 (\u0434\u043b\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c, \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c \u0438 \u043b\u043e\u043a\u0430\u0446\u0438\u044f\u043c) \u0431\u0443\u0434\u0435\u043c \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 Elasticsearch \u0432 \u0446\u0435\u043b\u044f\u0445 \u0430\u0443\u0434\u0438\u0442\u0430. \u0414\u0430\u043b\u0435\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f DataStream API, \u0432 \u043e\u043a\u043d\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043e\u043a\u043d\u043e, \u0433\u0434\u0435 \u0441\u0432\u044f\u0436\u0435\u043c \u0438\u0445 \u0441\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c, \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442 \u0432 Elasticsearch.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e Elasticsearch \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0434\u044d\u0448\u0431\u043e\u0440\u0434 Kibana.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f8\/9dc\/9d9\/2f89dc9d9d9e7aac4ed1ae028e3037cd.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7 - \u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7 - \u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\" width=\"664\" height=\"1024\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7 &#8212; \u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/figcaption><\/figure>\n<p>\u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u0438 \u0433\u0440\u0430\u0444 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c Flink (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6c\/54f\/130\/a6c54f130ebb144c08c43cd866e97d1b.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8 - \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 Flink-job\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8 - \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 Flink-job\" width=\"757\" height=\"625\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8 &#8212; \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 Flink-job<\/figcaption><\/figure>\n<h4>\u041f\u0440\u0438\u0432\u044b\u043a\u0430\u0435\u043c \u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440. \u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (docker-compose, DDL \u0442\u0430\u0431\u043b\u0438\u0446 PostgreSQL, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0434) \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/github.com\/Lockdain\/flink-cdc-demo\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/u><\/a> GitHub. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043a\u043e\u0434 \u0441\u043d\u0430\u0431\u0436\u0435\u043d \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u043c\u044b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u043c \u0430\u043a\u0446\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u0445, \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.&nbsp;<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 <a href=\"https:\/\/github.com\/Lockdain\/flink-cdc-demo\/tree\/main\/docker\"><u>\u043f\u0430\u043f\u043a\u0443 docker<\/u><\/a>. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <em>docker compose<\/em> \u0438 \u0434\u043e\u0436\u0434\u0438\u0442\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f, \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <em>SBT<\/em> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Flink Scala API. \u0414\u0436\u043e\u0431 Flink \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 fat-jar (\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043b\u044e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u044b\u0431\u0440\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <em>sbt-assembly<\/em> \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Apache Flink \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c SBT shell \u0432 <a href=\"https:\/\/github.com\/Lockdain\/flink-cdc-demo\/tree\/main\/flink-cdc-demo\"><u>\u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0435<\/u><\/a> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <em>assembly<\/em>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448 \u0430\u0440\u0441\u0435\u043d\u0430\u043b:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <em>localhost:8081<\/em> \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c Web UI Apache Flink. \u042d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 GUI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435;<\/p>\n<\/li>\n<li>\n<p>Elasticsearch \u0436\u0438\u0432\u0435\u0442 \u043d\u0430 <em>localhost:9200, <\/em>\u043d\u043e \u0432 \u043d\u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kibana, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0430\u043b\u0435\u043a\u0443 &#8212; \u043d\u0430 <em>localhost:5601<\/em>;<\/p>\n<\/li>\n<li>\n<p>Postgres \u043f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u043e\u0431\u0438\u0442\u0430\u0435\u0442 \u043d\u0430 <em>localhost:5432, <\/em>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0432\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u043e, \u044f \u043f\u0440\u0438\u0432\u044b\u043a \u043a <em>pgAdmin<\/em>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 <a href=\"https:\/\/github.com\/Lockdain\/flink-cdc-demo\/tree\/main\/ddl\/scenario\"><u>\u043f\u0430\u043f\u043a\u0435<\/u><\/a> \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0444\u0430\u0439\u043b <em>end-to-end.sql<\/em>. \u042d\u0442\u043e \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 DDL \u0438 insert\u2019\u043e\u0432 \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0432\u0441\u0435 \u0435\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 <em>account <\/em>\u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u0435\u0440\u0432\u044b\u0445 INSERT (\u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u0445 \u0441\u0430\u043c\u0438\u0445). \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/422\/a3c\/342\/422a3c342f94060273b1862364fefac6.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9 - \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9 - \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" width=\"1246\" height=\"707\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9 &#8212; \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/figcaption><\/figure>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c <em>fat-jar<\/em> \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c Flink \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043c\u0438\u043d\u0438-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041e\u0442\u043a\u0440\u043e\u0435\u043c sbt \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 assembly \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 <a href=\"https:\/\/github.com\/Lockdain\/flink-cdc-demo\/tree\/main\/flink-cdc-demo\"><u>\u043f\u0430\u043f\u043a\u0435<\/u><\/a> \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0421\u0431\u043e\u0440\u043a\u0430 \u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e JAR \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u2013 \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0432\u0430\u043b\u0438\u0442\u044c \u0437\u0430 \u0441\u043e\u0442\u043d\u044e \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043f\u0443\u0433\u0430\u0439\u0442\u0435\u0441\u044c. \u0418\u0449\u0438\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 JAR \u0432 <em>\/target<\/em> \u043f\u0430\u043f\u043a\u0435, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f <em>Flink Project-assembly-0.1-SNAPSHOT.jar <\/em>(\u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442).<\/p>\n<p>\u0418\u0434\u0435\u043c \u043d\u0430<em> localhost:8081 <\/em>\u0438 \u0432\u043e\u0441\u0445\u0438\u0449\u0430\u0435\u043c\u0441\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u0435 Flink WebUI. \u0412 \u043b\u0435\u0432\u043e\u043c \u043c\u0435\u043d\u044e \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 <em>Submit New Job<\/em>.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/718\/6a4\/a11\/7186a4a115404cccfa1458b1be6d64c7.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10 - Submit Flink-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10 - Submit Flink-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" width=\"242\" height=\"424\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10 &#8212; Submit Flink-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u0441\u0438\u043d\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 <em>Add New<\/em> \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443<em>. <\/em>\u0412 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0442\u043e\u043b\u0441\u0442\u043e\u043c\u0443 JAR \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Ok. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0436\u043e\u0431\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e3c\/e0c\/e4f\/e3ce0ce4ffc83e7edcb59da0546b8e31.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11 - \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11 - \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\" width=\"1600\" height=\"214\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11 &#8212; \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448, \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u043b\u0430\u0441\u0441 <em>ru.neoflex.flink.cdc.demo.PostgresCdcJob<\/em> \u0438 \u0440\u0435\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 <em>Submit<\/em>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u0432\u0435\u0437\u0435\u043d\u0438\u0435\u043c \u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0441\u043f\u0443\u0441\u0442\u044f \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 GUI \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e43\/d97\/946\/e43d97946378ab44c658f5f62a9b6552.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12 - Flink Web UI\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12 - Flink Web UI\" width=\"797\" height=\"239\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12 &#8212; Flink Web UI<\/figcaption><\/figure>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e! \u0412\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0434\u0435\u043b\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u201c\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u201d \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u0442\u0440\u0435\u0445 \u0442\u0430\u0431\u043b\u0438\u0446. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0445 Elasticsearch.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430:<\/p>\n<ol>\n<li>\n<p><em>locations-index<\/em>: \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u043f\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043b\u043e\u043a\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p><em>aggregations-index<\/em>: \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u043f\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0432 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><em>clients-index<\/em>: \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u043f\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0445;<\/p>\n<\/li>\n<li>\n<p><em>transactions-index<\/em>: \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u043f\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 INSERT \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <em>ClientLocation:<\/em><\/p>\n<p><code>INSERT INTO accounts.\"ClientLocation\" VALUES<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;(1, '40.689015, -74.045110', 'New York', 1621744725),<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;(5, '19.903092, -75.097198', 'Guant\u00e1namo', 1625244725)<\/code><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435.<\/p>\n<p>\u0420\u0430\u0441\u0447\u0435\u0445\u043b\u044f\u0435\u043c Kibana, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e <a href=\"http:\/\/localhost:5601\/app\/kibana#\/management\/elasticsearch\/index_management\/indices?_g=()\"><u>\u0430\u0434\u0440\u0435\u0441\u0443<\/u><\/a> \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u043d\u0434\u0435\u043a\u0441 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <em>locations-index<\/em>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0434\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438:&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c6\/7ea\/387\/1c67ea38762fe23444f27bc4f75224c0.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13 - \u0418\u043d\u0434\u0435\u043a\u0441 Elasticsearch\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13 - \u0418\u043d\u0434\u0435\u043a\u0441 Elasticsearch\" width=\"966\" height=\"173\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13 &#8212; \u0418\u043d\u0434\u0435\u043a\u0441 Elasticsearch<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0432\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f INSERT\u2019\u0430 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446 <em>ClientTransaction <\/em>\u0438 <em>Clients<\/em>. \u0421\u043d\u043e\u0432\u0430 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0435\u043c \u0432 Kibana: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u2013 \u0434\u043b\u044f \u0441\u0447\u0435\u0442\u043e\u0432 \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439. \u042d\u0442\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0443\u0434\u0438\u0442\u0430, \u0432 \u043d\u0438\u0445 \u043c\u044b \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.<\/p>\n<p>\u041d\u043e \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f (\u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f tumbling window), \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u2013 <em>aggregations-index, <\/em>\u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 (\u0441\u043c. \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435).<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <em>index pattern<\/em> \u0432 Kibana \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a9a\/21c\/231\/a9a21c231b6c04a4d2c893b49938f27b.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14 - \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 index pattern\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14 - \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 index pattern\" width=\"704\" height=\"579\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14 &#8212; \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 index pattern<\/figcaption><\/figure>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430:  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2d7\/72e\/542\/2d772e542d35d78c164b008cc707cae3.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15 - \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15 - \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430\" width=\"858\" height=\"312\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15 &#8212; \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/figcaption><\/figure>\n<p>\u0410 \u0442\u0430\u043a \u2013 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1cb\/0e4\/8e8\/1cb0e48e883dd1e1dac3540289c2d9c9.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16 - \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16 - \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\" width=\"922\" height=\"317\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16 &#8212; \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/figcaption><\/figure>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/157\/d0e\/fc2\/157d0efc213715d2ab3ba0775f188da6.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17 - \u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17 - \u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\" width=\"1300\" height=\"334\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17 &#8212; \u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/figcaption><\/figure>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e) \u0431\u044b\u043b\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u043c Apache Flink \u043d\u0430 \u0431\u0430\u0437\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445. \u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0445 <em>Data Stream<\/em>: \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u043c, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0447\u0443\u0442\u044c \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h4>\u041f\u0440\u0435\u043f\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u0432\u0430\u043c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f? \u041e\u0442\u0432\u0435\u0442: \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2013 <em>ru.neoflex.flink.cdc.demo.PostgresCdcJob<\/em>,&nbsp; \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441 \u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0447\u043d\u0435\u043c.<\/p>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <em>Flink Table API<\/em>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>Clients <\/em>Postgres:<\/p>\n<p><code>tableEnv.executeSql(<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"CREATE TABLE clients (id INT, name STRING, surname STRING, gender STRING, address STRING) \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"WITH ('connector' = 'postgres-cdc', \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'hostname' = 'postgres', \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'port' = '5432', \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'username' = 'test', \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'password' = 'test', \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'database-name' = 'account',&nbsp; \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'schema-name' = 'accounts', \" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'table-name' = 'Clients',\" +<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"'debezium.slot.name' = 'clients_cdc')\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;)<\/code><\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0438 \u0432 \u0431\u043b\u043e\u043a\u0435 <em>WITH <\/em>\u0437\u0430\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0438\u0445 \u2013 <a href=\"https:\/\/github.com\/ververica\/flink-cdc-connectors\/wiki\/Postgres-CDC-Connector\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>).&nbsp;<\/p>\n<p>\u042f \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Flink <em>DataStream API<\/em>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 (\u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2013 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u201c\u0447\u0438\u0441\u0442\u043e\u043c\u201d <em>Flink SQL<\/em>) \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f <em>clients<\/em> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <em>Flink Table<\/em> \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <em>clients<\/em>.<\/p>\n<p><code>\/\/ Updates from clients<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;val clients: Table = tableEnv.sqlQuery(\"SELECT * FROM clients\")<\/code><\/p>\n<p>\u042d\u0442\u0430 \u043c\u0430\u0433\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 Postgres, \u043d\u043e \u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u043d\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0432\u0448\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0441\u043d\u044d\u043f\u0448\u043e\u0442\u0430 (\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Data Stream:<\/p>\n<p><code>\/\/ Clients to change stream<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;val clientsDataStream: DataStream[Row] = tableEnv.toChangelogStream(clients)<\/code><\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438. \u041a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 Data Stream \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c Sink Elasticsearch\u2019\u0430 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0430\u0443\u0434\u0438\u0442\u0430, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0435 <em>Row<\/em> \u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u0435\u0439\u0441-\u043a\u043b\u0430\u0441\u0441\u044b:<\/p>\n<p><code>\/\/ Send Clients to Elasticsearch for monitoring purposes<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;val clientsStream: DataStream[Client] = clientsDataStream.map { row =&gt;<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client(<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.getFieldAs[Integer](\"id\"),<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.getFieldAs[String](\"name\"),<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.getFieldAs[String](\"surname\"),<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.getFieldAs[String](\"gender\"),<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.getFieldAs[String](\"address\")<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;}<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;clientsStream.addSink(elasticSinkClientBuilder.build)<\/code><\/p>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b: \u043c\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c Data Stream\u2019\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439:<\/p>\n<p><code>\/\/ Joining transactions on locations<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;val preAggregateStream: DataStream[AggregatedInfo] = transactionsStream<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.join(locationsStream)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.where(_.id)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equalTo(_.id)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.window(TumblingProcessingTimeWindows.of(Time.minutes(2)))<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.apply { (transaction, location) =&gt;<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggregatedInfo(<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction.id,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location.coordinates,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location.nearestCity,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction.amount<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/code><\/p>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u044d\u0442\u043e\u0442 <em>Data Stream<\/em> \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0445. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 Elasticsearch:<\/p>\n<p><code>\/\/ Joining aggregate on client info<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;val fullyAggregatedStream: DataStream[AggregatedInfo] = clientsStream<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.join(preAggregateStream)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.where(_.id)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equalTo(_.id)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.window(TumblingProcessingTimeWindows.of(Time.minutes(5)))<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.allowedLateness(Time.seconds(30))<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.apply { (clientInfo, preAggregate) =&gt;<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggregatedInfo(<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientInfo.id,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientInfo.name,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientInfo.surname,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientInfo.gender,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preAggregate.coordinates,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preAggregate.nearestCity,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preAggregate.amount<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/code><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CDC \u0433\u043e\u0442\u043e\u0432\u0430.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b:<\/p>\n<ol>\n<li>\n<p><em>ru.neoflex.flink.cdc.demo.secondary.PostgresSource<\/em> \u2013 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CDC-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u043b\u044f <em>DataStream API<\/em> (\u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u044b\u0440\u0430\u044f \u0438\u0437-\u0437\u0430 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>SourceRecord <\/em>\u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e);<\/p>\n<\/li>\n<li>\n<p><em>ru.neoflex.flink.cdc.demo.secondary.ElasticSink \u2013 <\/em>\u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043a Elasticsearch, \u0433\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Json \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d <a href=\"https:\/\/github.com\/circe\/circe\"><u>Circe<\/u><\/a>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0442\u0440\u0435\u043f\u0435\u0442\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044e \u0432\u0435\u0440\u0441\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 CDC \u0438 Apache Flink (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u0449\u0438\u0442\u0435 \u0432 <em>build.sbt<\/em>). \u0412\u0430\u0448 \u043f\u043e\u043a\u043e\u0440\u043d\u044b\u0439 \u0441\u043b\u0443\u0433\u0430 \u043f\u0440\u043e\u0432\u0435\u043b \u043d\u0435\u043c\u0430\u043b\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u044b\u0445 \u0447\u0430\u0441\u043e\u0432 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432.<\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d <strong>Change Data Capture <\/strong>\u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0434\u0441\u043f\u043e\u0440\u044c\u0435\u043c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u0440\u0438 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 (\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c), \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Apache Flink \u0438 \u0435\u0433\u043e CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b. \u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 API Apache Flink. \u0421\u0440\u0435\u0434\u0438 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (at-least-once \u0438 exactly-once) \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u044f\u0432\u043b\u044f\u0442\u044c \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 real-time \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 Apache Flink \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f: \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043b\u043e\u0434\u043e\u043c \u0442\u0440\u0443\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Alibaba \u2013 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043b\u0430\u0434\u0435\u0435\u0442 Aliexpress. \u041d\u043e\u0432\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0441 \u0437\u0430\u0432\u0438\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 <em>mailing list<\/em> Apache Flink \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 Apache.<\/p>\n<\/div>\n<p> \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\/company\/neoflex\/blog\/567930\/\"> https:\/\/habr.com\/ru\/company\/neoflex\/blog\/567930\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0430\u0441\u0442\u044c 1: \u0412\u0432\u043e\u0434\u043d\u043e-\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f (\u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f)<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 <strong>Change Data Capture<\/strong> (\u0434\u0430\u043b\u0435\u0435 \u2013 <strong>CDC<\/strong>) \u0432 Apache Flink.&nbsp;<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439: \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b <strong>Change Data Capture<\/strong>, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2013 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b Apache Flink, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 (\u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e\u0431 Apache Flink \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f). \u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u2013 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0437\u0430\u043a\u0430\u0442\u0430\u0435\u043c \u0440\u0443\u043a\u0430\u0432\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0437 WAL PostgreSQL, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0435\u0439, \u0441\u0442\u0435\u043a\u043e\u043c ELK \u0438 \u0446\u0435\u043b\u044b\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c Flink, \u043f\u0440\u0430\u0432\u0434\u0430 \u0432 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, CDC. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Change_data_capture#:~:text=In%20databases%2C%20change%20data%20capture,taken%20using%20the%20changed%20data.\"><u>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f<\/u><\/a> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e <strong>Change Data Capture <\/strong>\u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u043d\u0438\u0447\u0442\u043e \u0438\u043d\u043e\u0435, \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. <em>\u201c\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\u201d<\/em>, <em>\u201c\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u201d<\/em>, <em>\u201c\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u201d<\/em> \u2013 \u044d\u0442\u0438 \u0441\u043b\u043e\u0432\u0430-\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0440\u044e \u044d\u043c\u043e\u0446\u0438\u0439 \u0438 \u043d\u0435\u043c\u0438\u043d\u0443\u0435\u043c\u043e \u0443\u0432\u043e\u0434\u044f\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. <strong>CDC<\/strong> \u2013 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <em>event-driven<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u0445\u043e\u0442\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041c\u044b \u0432 Neoflex \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0441\u0442\u0440\u043e\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0430\u043c \u043d\u0435 \u0447\u0443\u0436\u0434 event-driven \u0434\u0438\u0437\u0430\u0439\u043d (\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u2013 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!).<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 event-driven? \u041f\u043e\u0437\u0432\u043e\u043b\u044e \u0441\u0435\u0431\u0435 \u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0443 <em>\u201cEvent Streams in Action\u201d (\u0438\u0437\u0434. Manning, 2019 \u0433.):<\/em><\/p>\n<p><em>\u201c\u0425\u043e\u0442\u0438\u0442\u0435 \u0432\u0435\u0440\u044c\u0442\u0435 \u2013 \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0435\u0442, \u043d\u043e \u0432\u0430\u0448\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u043d\u0435 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u0442 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435 \u0438 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u0445 \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430:<\/em><\/p>\n<ul>\n<li>\n<p><em>\u041b\u044e\u0434\u0435\u0439 \u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435: \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0438, \u043c\u0430\u0440\u043a\u0435\u0442\u043e\u043b\u043e\u0433\u0438, \u043a\u043e\u043c\u043c\u0438\u0442\u044b, \u0440\u0435\u043b\u0438\u0437\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435;<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0421\u043e\u0444\u0442 \u0438 \u0436\u0435\u043b\u0435\u0437\u043e, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f;<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u0417\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u0437\u0430\u0432\u0442\u0440\u0430 \u0438\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043d\u0435\u0434\u0435\u043b\u0438.<\/em><\/p>\n<\/li>\n<\/ul>\n<p><em>\u041b\u044e\u0434\u0438 \u0436\u0438\u0432\u0443\u0442 \u0432 \u044d\u0442\u043e\u0439 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0422\u0435, \u043a\u0442\u043e \u043e\u0441\u043c\u0435\u043b\u0438\u0442\u0441\u044f \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043a\u0430\u043a \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u0438 \u0447\u0442\u0435\u043d\u0438\u0439 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0440\u0438\u0441\u043a\u0443\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0441\u0441\u0443\u0434\u043e\u043a, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0438\u043c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430 \u0434\u043d\u0435\u0439 \u043e\u0442\u0433\u0443\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0439\u0442\u0438 \u0432 \u0441\u0435\u0431\u044f.<\/em><\/p>\n<p><em>\u0421\u0443\u0440\u043e\u0432\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u043b\u0438\u0448\u0435\u043d\u044b \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041e\u043d\u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441\u0430:<\/em><\/p>\n<p><strong><em>\u201c\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u2013 \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044f \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\u201d<\/em><\/strong><\/p>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u043d\u0430 \u044d\u0442\u043e\u0439 \u043d\u043e\u0442\u0435 \u043c\u044b \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u043d\u0430\u0448\u0435 \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435.  <\/p>\n<h4>\u0413\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c CDC?<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0431\u0430\u043d\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u0447\u0435\u0442\u0430\u0445 \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0430\u043d\u043a\u0430, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0444\u0440\u043e\u0434-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c. \u041f\u0440\u044f\u043c\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0437\u0440\u044b\u0432\u043d\u043e\u0439 \u0440\u043e\u0441\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0431\u0430\u043d\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0443 15-\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 \u043e\u0431\u0435\u0434\u0430, \u0442\u043e \u043d\u0435\u043c\u0430\u043b\u0430\u044f \u0438\u0445 \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u043d\u0430 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442. \u041f\u0438\u043a\u043e\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0430\u043d\u043a\u0438\u043d\u0433 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0442\u0440\u0443\u0434\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0421\u0445\u0435\u043c\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1:<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 &#8212; \u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0411\u0414<\/figcaption><\/figure>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043d\u0435 \u0442\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e (\u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e). \u041e\u043d\u0430 \u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e \u0438 \u0440\u044f\u0434\u043e\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438? \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u2013 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c CDC, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043d\u0430\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c-\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043d\u0430 \u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0432 \u0434\u0443\u0445\u0435 \u201c\u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u201d (\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u2013 <em>event-carried state transfer <\/em>\u0438\u043b\u0438 <em>event sourcing<\/em>).&nbsp;<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2 &#8212; \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/figcaption><\/figure>\n<p>\u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u043d\u043a\u0438\u0439 \u0438 \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u043d\u0443 \u0441\u043e\u0442\u043d\u044e \u043a\u043e\u043f\u0438\u0439 \u2013 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0441\u0442\u0435\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432) \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c\u0438. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0432\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439 \u0431\u044b \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 (\u0430 \u0441 \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u0433\u043e <em>Flink <\/em>\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0438\u043d\u0430\u0447\u0435 \u043a\u0430\u043a <em>\u201c\u0448\u0443\u0441\u0442\u0440\u044b\u0439\u201d<\/em>) \u043d\u0435 \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CDC, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0432\u043e\u044e \u043b\u0435\u043f\u0442\u0443 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.&nbsp;<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 <em>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439<\/em>, \u0430 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435 <em>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 (exactly-once)<\/em> \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c (\u0438\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0431\u044b\u0442\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438). \u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0435\u043e\u0440\u0435\u043c\u0443 CAP, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0436\u0435\u0440\u0442\u0432\u0443\u0435\u043c \u0431\u0443\u043a\u0432\u043e\u0439 \u201cC\u201d (\u0447\u0438\u0442\u0430\u0439 \u2013 consistency), \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0445\u043e\u0434\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0439 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u041d\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u043e\u0434\u0438\u043d\u0435 Apache Flink: <em>\u201cDer Teufel ist nicht so schwarz wie man ihn malt\u201d<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0442 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0441\u0442\u0440\u0430\u0448\u0435\u043d. \u0417\u0430\u0442\u043e \u0432\u0437\u0430\u043c\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0438\u0431\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u044d\u0448\u0435\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0437\u0434\u0435\u0441\u044c \u0440\u0435\u0447\u044c \u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 stateful-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435), \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u043c \u043e\u0431\u0449\u0435\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043d\u0430 \u0444\u043e\u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432 \u043c\u044b \u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0431\u0430\u043d\u043a\u0430, \u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0431\u043e\u0439 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0441\u0447\u0435\u0442, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e (\u043d\u043e \u0434\u0435\u0440\u0436\u0438\u043c \u0432 \u0443\u043c\u0435 \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u0433\u043e \u0447\u0435\u0440\u0442\u0438\u043a\u0430 \u0441 \u0435\u0433\u043e \u043e\u0431\u0432\u0438\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b).<\/p>\n<p>\u0418 \u0432\u0441\u0435 \u0436\u0435, \u0441\u043d\u043e\u0432\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f\u043c <em>change data capture<\/em>. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0430 \u0433\u043b\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0435\u0440\u0432\u044b\u0439 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u043c <em>full scan<\/em>\u2019\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <em>Kafka JDBC Source<\/em> \u0438 <em>Sqoop<\/em>. \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u044f\u0434 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 full scan\u2019\u043e\u0432 \u0432\u043d\u043e\u0441\u0438\u0442 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 (\u0447\u0438\u0442\u0430\u0439 \u2013 latency). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c <em>slow-change dimension<\/em> \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 DWH.<\/p>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0421\u0423\u0411\u0414, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u043c\u0435\u043a\u0430\u043b\u043a\u0443 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439! \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c <em>binlog<\/em>\u2019\u0438 MySQL \u0438\u043b\u0438 <em>WAL <\/em>PostgreSQL. \u041e\u0431\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445.&nbsp; \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <em>Debezium<\/em>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043b\u043e\u0433\u0435 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u044f\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442\u043e \u0432 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 <em>table scan<\/em>, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u2013 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0443\u0437\u043b\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430 \u0444\u043e\u043d\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0435\u0445\u0438 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u043e\u0439 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0443\u0441\u043f\u0435\u0445!<\/p>\n<p>\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 CDC \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0433\u0434\u0435 \u201cE\u201d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0430\u043d\u0430\u043b\u0438\u0437 \u043b\u043e\u0433\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u201cT\u201d \u2013 \u043f\u043e \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u201cL\u201d \u2013 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b \u0438\u043b\u0438 \u0441\u044b\u0440\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044e. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 ETL, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e \u0442\u0430\u043a\u043e\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u0442\u0435\u043a\u0435 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<figure class=\"\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3 &#8212; \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 ETL<\/figcaption><\/figure>\n<h2>\u0427\u0430\u0441\u0442\u044c 2: \u0423\u0441\u043b\u043e\u0432\u043d\u043e-\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f (\u0440\u0430\u0441\u0441\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f)<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u043a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b\u0438, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Apache Flink \u0438 \u0435\u0433\u043e CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 Apache Flink \u0434\u043b\u044f \u0432\u0430\u0441 \u0432 \u043d\u043e\u0432\u0438\u043d\u043a\u0443, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Neoflex \u043d\u0430 <a href=\"https:\/\/youtu.be\/7O_dVzY0SbU\"><u>YouTube<\/u><\/a>.<\/p>\n<p>\u0412 \u0432\u0435\u0440\u0441\u0438\u0438 1.11 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Apache Flink \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438 CDC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0440\u0430\u043b\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0433\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e (\u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <em>TableSource API<\/em>. \u041d\u043e\u0432\u044b\u0439 API \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0438\u043f\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445:&nbsp;<\/p>\n<ol>\n<li>\n<p><em>INSERT<\/em>;<\/p>\n<\/li>\n<li>\n<p><em>UPDATE_BEFORE<\/em>;<\/p>\n<\/li>\n<li>\n<p><em>UPDATE_AFTER;&nbsp;<\/em><\/p>\n<\/li>\n<li>\n<p><em>DELETE<\/em>.&nbsp;<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u0438\u043b\u0438\u0441\u044c \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043b\u043e\u0433\u043e\u0432 \u0421\u0423\u0411\u0414.&nbsp;<\/p>\n<p>Flink \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0443\u043c\u0435\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 Debezium \u0432 \u0447\u0430\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0411\u0414 \u0432 JSON \u0438 \u0438\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API Apache Flink. \u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e JSON \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0438\u0436\u0435:<\/p>\n<p><code>{<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"before\":null,<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"after\": {<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"pk\":\"1\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"value\":\"New data\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;},<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"source\": {<\/code><\/p>\n<p><code>...<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"snapshot\":\"incremental\"<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;},<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"op\":\"r\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"ts_ms\":\"1620393591654\",<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;\"transaction\":null<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0438 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 <em>event-carried state transfer<\/em> \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0447\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u0432 \u0448\u0430\u0433\u0438 \u201cExtract\u201d \u0438 \u201cTransform\u201d \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: Debezium \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u043b\u043e\u0433\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u0442\u043e\u043f\u0438\u043a Apache Kafka. \u0414\u0436\u043e\u0431 Apache Flink \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043f\u0438\u043a \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 JSON \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Debezium, \u043d\u0430\u043b\u0435\u0442\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044f \u0438\u0445 \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <em>Kafka Table<\/em>. \u041f\u0430\u0440\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Flink \u0438 \u0432\u0443\u0430\u043b\u044f \u2013 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0433\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<figure class=\"float full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u043b\u0438\u0448\u0435\u043d \u0441\u0432\u043e\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0442\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u2013 \u0432\u044b\u0448\u0435. \u041f\u043e\u043b\u043e\u0436\u0430 \u0440\u0443\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0434\u0446\u0435, \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0435\u043c\u0430\u043b\u043e.<\/p>\n<p>\u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0436\u043e\u0431 Apache Flink \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u043b\u043e\u0433\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432. \u0421\u0436\u0438\u043c\u0430\u0435\u043c ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0443\u043f\u0435\u0440-\u0448\u0430\u0433\u0430:<\/p>\n<figure class=\"\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4 &#8212; \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 ETL<\/figcaption><\/figure>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <a href=\"https:\/\/github.com\/ververica\/flink-cdc-connectors\"><u>Flink CDC Connectors<\/u><\/a>! \u042d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f MySQL \u0438 PostgreSQL, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 Alibaba \u0438 Ververica, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 <\/p>\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-326491","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326491","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=326491"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326491\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}