{"id":500457,"date":"2026-10-27T11:20:24","date_gmt":"2026-10-27T08:20:24","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500457"},"modified":"2026-10-27T11:20:24","modified_gmt":"2026-10-27T08:20:24","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500457","title":{"rendered":"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 Postgres: \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, inbox \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 Kafka \u0438 RabbitMq"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/fb\/4a\/fb\/fb4afbb67f31e039d47e2301285e2a32.jpg\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/fb\/4a\/fb\/fb4afbb67f31e039d47e2301285e2a32.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/fb\/4a\/fb\/fb4afbb67f31e039d47e2301285e2a32.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1082062\/\" rel=\"noopener nofollow\">\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u044f \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u043b, \u0447\u0442\u043e Kafka \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 PostgreSQL \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b <em>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0412\u043e\u0437\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/em> \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445: \u0441\u043b\u043e\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0436\u0443\u0440\u043d\u0430\u043b \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c. <\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u043f\u043e \u0432\u044b\u0431\u043e\u0440\u0443 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430: \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0440\u043e\u043a\u0435\u0440 \u043d\u0443\u0436\u0435\u043d, \u0438 \u043e\u043d\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0438\u0437 \u0442\u0435\u0445 \u0436\u0435 \u0446\u0438\u0444\u0440.<\/p>\n<h2>\u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u043e\u043c\u0443 \u043b\u0435\u043d\u044c \u0447\u0438\u0442\u0430\u0442\u044c<\/h2>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0430 \u2014 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 (\u0431\u0430\u0437\u0430, \u0431\u0440\u043e\u043a\u0435\u0440, CDC-\u0437\u0432\u0435\u043d\u043e, \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u0442\u0435\u0441\u0442), \u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<blockquote>\n<p>\u043c\u0441 CPU \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 = \u0441\u0443\u043c\u043c\u0430 CPU-\u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0437\u0430 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \/ \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/p>\n<\/blockquote>\n<p>100 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d, 200 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">1 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">2<\/p>\n<\/th>\n<th>\n<p align=\"left\">4<\/p>\n<\/th>\n<th>\n<p align=\"left\">8<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.19<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">1.21<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.48<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.88<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435, 64 \u0448\u0430\u0440\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.27<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">1.33<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.66<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.60<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium \u2192 Kafka<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.35<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">1.99<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.03<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.16<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium \u2192 RabbitMQ quorum<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.20<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">2.10<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.25<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.21<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><em>\u043c\u0441 CPU \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c; \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u0434\u0435\u0448\u0435\u0432\u043b\u0435.<\/em><\/p>\n<p>\u0422\u0440\u0438 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0448\u0438\u0440\u0435, \u0447\u0435\u043c \u043e\u043d\u0430 \u0435\u0441\u0442\u044c.<\/p>\n<ul>\n<li>\n<p><strong>\u042d\u0442\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u043d\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c.<\/strong> \u041d\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430, \u043d\u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u044b: \u0441\u0442\u0435\u043d\u0434 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439 (\u0437\u0430\u043f\u0438\u0441\u044c \u0432 outbox), \u0430 \u043d\u0435 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b, \u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 N \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0447\u0442\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0430:<\/strong> \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 1\u20138 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0443<\/strong> \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u043c \u0434\u0440\u0435\u0439\u0444\u0435 \u0441\u0442\u0435\u043d\u0434\u0430 10%, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u043d\u044c\u0448\u0435 10% \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e\u0442: 2.16 \u043f\u0440\u043e\u0442\u0438\u0432 2.21 \u0438 1.60 \u043f\u0440\u043e\u0442\u0438\u0432 1.88 \u2014 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438, \u0430 1.19 \u043f\u0440\u043e\u0442\u0438\u0432 2.35 \u2014 \u043d\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0437\u0430\u043c\u0435\u0440\u044f\u043b\u0441\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.<\/p>\n<h2>\u0421\u0442\u0435\u043d\u0434<\/h2>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0430\u0448\u0438\u043d\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u043d\u0430, 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, 31 \u0413\u0411, Windows; \u0431\u0440\u043e\u043a\u0435\u0440\u044b \u0438 Debezium \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445, \u0432\u0435\u0431 \u0438 \u0442\u0435\u0441\u0442 \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0440\u044f\u0434\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PostgreSQL<\/p>\n<\/td>\n<td>\n<p align=\"left\">18 (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b pgoutput V4 \u0441 <code>binary: true<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 16+)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Kafka<\/p>\n<\/td>\n<td>\n<p align=\"left\">confluent-local 8.2, \u0442\u043e\u043f\u0438\u043a <code>2\u00d7N<\/code> \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439, <code><strong>ReplicationFactor = 1<\/strong><\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">RabbitMQ<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.3, quorum-\u043e\u0447\u0435\u0440\u0435\u0434\u044c (Raft, fsync \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CDC<\/p>\n<\/td>\n<td>\n<p align=\"left\">Debezium Server 3.6.2.Final, \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0440\u043e\u043a\u0430 <code>messages<\/code>: <code>id<\/code>, <code>content = \"helloworld\"<\/code>, <code>created_at<\/code> \u2014 \u043e\u043a\u043e\u043b\u043e 30 \u0431\u0430\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u043d\u0432\u0435\u0440\u0442 Debezium \u2014 \u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u0442\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">4900\u20138000 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1 \u041c\u0411\/\u0441: \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0438\u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b 10 \u041c\u0411\/\u0441 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0447\u0442\u043e \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 docker \u0432 wsl<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0430\u0437\u044b \u2014 \u0432 AppHost:<\/p>\n<pre><code class=\"cs\">.WithArgs(\"-c\", \"wal_level=logical\").WithArgs(\"-c\", \"max_wal_senders=64\")           \/\/ 8 \u0441\u043b\u043e\u0442\u043e\u0432 \u0432\u0435\u0435\u0440\u0430 + 2 Debezium + \u0437\u0430\u043f\u0430\u0441; \u0434\u0435\u0444\u043e\u043b\u0442 10.WithArgs(\"-c\", \"max_slot_wal_keep_size=4096\")  \/\/ 4 \u0413\u0411; \u0434\u0435\u0444\u043e\u043b\u0442 -1 - \u0431\u0435\u0437\u043b\u0438\u043c\u0438\u0442\u043d\u043e\u0435 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 WAL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0438\u0441\u043b\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043d\u043e \u0438 \u0432 <code>max_wal_senders<\/code>, \u0430 \u043e\u0442\u0441\u0442\u0430\u0432\u0448\u0438\u0439 \u0441\u043b\u043e\u0442 \u0431\u0435\u0437 <code>max_slot_wal_keep_size<\/code> \u0441\u044a\u0435\u0441\u0442 \u0434\u0438\u0441\u043a parimary-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p>\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434 <strong>\u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b<\/strong>: \u0442\u043e\u043f\u0438\u043a \u0441 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u043e\u0439, \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b\u043e\u0441\u044c. \u041b\u044e\u0431\u044b\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e \u043f\u043e\u0442\u0435\u0440\u0438 Kafka \u0438\u043b\u0438 RabbitMQ \u2014 \u043d\u0435 \u043e\u0442\u0441\u044e\u0434\u0430.<\/p>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p>\u041e\u0431\u0449\u0438\u0439 \u0443 \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0432\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438. \u0420\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0437\u043e\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u043c. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/extt\/e1\/f1\/e8\/e1f1e80ea73d0a10d021de35e7fac967.svg\" alt=\" flowchart TB NB[&quot;NBomber200 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439&quot;] -- &quot;POST \/load\/messages&quot; --&gt; WEB[&quot;\u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441&quot;] WEB -- &quot;INSERT INTO messages&quot; --&gt; PG[(&quot;PostgreSQLpublication load_test_pub&quot;)] PG -- &quot;\u0441\u043b\u043e\u0442 dbz_kafka_slot&quot; --&gt; DZK[&quot;Debezium Serversink: kafka&quot;] PG -- &quot;\u0441\u043b\u043e\u0442 dbz_quorum_slot&quot; --&gt; DZQ[&quot;Debezium Serversink: rabbitmq&quot;] PG -- &quot;\u0441\u043b\u043e\u0442 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f&quot; --&gt; W[&quot;\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL&quot;] PG -- &quot;\u0441\u043b\u043e\u0442 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f+ 64 \u0448\u0430\u0440\u0434\u0430&quot; --&gt; WS[&quot;\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435,\u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435&quot;] DZK --&gt; K[(&quot;\u0442\u043e\u043f\u0438\u043a, 2\u00d7N \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439&quot;)] DZQ --&gt; Q[(&quot;quorum-\u043e\u0447\u0435\u0440\u0435\u0434\u044c&quot;)] K --&gt; C[&quot;N \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439&quot;] Q --&gt; C W --&gt; C WS --&gt; C C -- &quot;claim&quot; --&gt; INB[(&quot;inbox \/ inbox_wal&quot;)] C -- &quot;POST \/send-email&quot; --&gt; WORK[&quot;no-op \u0441\u0435\u0440\u0432\u0438\u0441&quot;] \" title=\"\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/extt\/e1\/f1\/e8\/e1f1e80ea73d0a10d021de35e7fac967.svg 780w,&#10;       https:\/\/habrastorage.org\/extt\/e1\/f1\/e8\/e1f1e80ea73d0a10d021de35e7fac967.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<h3>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c<\/h3>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0430\u0443\u0442\u0431\u043e\u043a\u0441, \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u044f \u043f\u0438\u0441\u0430\u043b \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<pre><code class=\"cs\">app.MapPost(\"\/load\/messages\", async (Message dto, AppDbContext db, CancellationToken ct) =&gt;{    db.Messages.Add(new Message { Content = dto.Content });    await db.SaveChangesAsync(ct);    return Results.Created();});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"cs\">entity.Property(x =&gt; x.CreatedAt).HasDefaultValueSql(\"now()\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u0431\u0430\u0437\u0430: \u0443 \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043e\u0434\u043d\u0438 \u0447\u0430\u0441\u044b, \u0438 \u044d\u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0435\u0434\u0435\u0442 \u0438 \u0432 WAL, \u0438 \u0432 \u043a\u043e\u043d\u0432\u0435\u0440\u0442 Debezium.<\/p>\n<h3>CDC-\u0437\u0432\u0435\u043d\u043e<\/h3>\n<p>\u041e\u0431\u0430 CDC-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u2014 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 Debezium Server, \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a.<\/p>\n<pre><code class=\"nginx\">debezium.source.plugin.name=pgoutput            # \u0442\u043e \u0436\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0443 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044fdebezium.source.publication.name=load_test_pub  # \u0442\u0430 \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044fdebezium.source.snapshot.mode=no_data           # \u043c\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0442\u043e\u043a, \u0430 \u043d\u0435 initial loaddebezium.source.skipped.operations=t,u,d        # \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0435\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e insertdebezium.source.max.batch.size=8192debezium.source.max.queue.size=32768debezium.source.poll.interval.ms=100debezium.source.offset.storage=...MemoryOffsetBackingStoredebezium.source.slot.drop.on.stop=truedebezium.format.value.schemas.enable=false      # \u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b: \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0430\u0439\u0442 \u0438 CPUdebezium.sink.kafka.producer.acks=alldebezium.sink.kafka.producer.linger.ms=10<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b <code>compression.type<\/code> \u0438 <code>batch.size<\/code> \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u2014 \u0442\u044e\u043d\u0438\u043d\u0433 \u0441\u0436\u0430\u0442\u0438\u044f \u043c\u043e\u0433 \u0431\u044b \u043e\u0442\u044a\u0435\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u044b\u0432\u0430, \u0438 \u044d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430. \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 <code>slot.drop.on.stop<\/code> \u2014 \u0440\u0430\u0434\u0438 \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432, \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/extt\/84\/fb\/e1\/84fbe162cf13c83b746811df7b3fbc7d.svg\" alt=\" flowchart LR PG[(&quot;PostgreSQL&quot;)] -- &quot;pgoutput, \u0441\u043b\u043e\u0442&quot; --&gt; D1[&quot;\u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430&quot;] subgraph DBZ[&quot;Debezium Server (JVM)&quot;] D1 --&gt; D2[&quot;\u0444\u0438\u043b\u044c\u0442\u0440: \u0442\u043e\u043b\u044c\u043a\u043e insert&quot;] --&gt; D3[&quot;\u043a\u043e\u043d\u0432\u0435\u0440\u0442 JSON&quot;] --&gt; D4[&quot;sink-\u043a\u043b\u0438\u0435\u043d\u0442&quot;] end D4 --&gt; SINK[(&quot;\u0442\u043e\u043f\u0438\u043a \u0438\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c&quot;)] \" title=\"Postgres - Debezium Server - \u0411\u0440\u043e\u043a\u0435\u0440\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/extt\/84\/fb\/e1\/84fbe162cf13c83b746811df7b3fbc7d.svg 780w,&#10;       https:\/\/habrastorage.org\/extt\/84\/fb\/e1\/84fbe162cf13c83b746811df7b3fbc7d.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Postgres &#8212; Debezium Server &#8212; \u0411\u0440\u043e\u043a\u0435\u0440<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c Kafka<\/h3>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0438\u0434 \u2014 \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0437\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cs\">var result = consumer.Consume(ct);var message = DebeziumEnvelope.ReadMessage(result.Message.Value);await web.Work.PostAsJsonAsync(\"\/send-email\", message, ct);consumer.StoreOffset(result);          \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f - \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"cs\">new ConsumerConfig{    GroupId = $\"{Name}-{Guid.NewGuid():N}\",   \/\/ \u0441\u0432\u043e\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d: \u0447\u0443\u0436\u0438\u0435 \u043e\u0444\u0444\u0441\u0435\u0442\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u044b    AutoOffsetReset = AutoOffsetReset.Earliest,    EnableAutoCommit = true,    EnableAutoOffsetStore = false,            \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0441\u0430\u043c\u0438    PartitionAssignmentStrategy = PartitionAssignmentStrategy.CooperativeSticky,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u0432\u0434\u0432\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0433\u0440\u0443\u043f\u043f\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d: \u0438\u043c\u0435\u043d\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u0435\u043b\u0438\u0442 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e.<\/p>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c RabbitMQ<\/h3>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0443\u0448\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430 \u0436\u0438\u0432\u0451\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438:<\/p>\n<pre><code class=\"cs\">consumer.ReceivedAsync += async (_, delivery) =&gt;{    var message = DebeziumEnvelope.ReadMessage(delivery.Body);    await web.Work.PostAsJsonAsync(\"\/send-email\", message, ct);    await channel.BasicAckAsync(delivery.DeliveryTag, multiple: false, ct);};await channel.BasicQosAsync(prefetchSize: 0, prefetchCount: 1000, global: false);await channel.BasicConsumeAsync(queue, autoAck: false, consumer);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043d\u043e\u0432\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u043c\u0443. Prefetch 1000 \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 Kafka, \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0440\u043e\u043a\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e.<\/p>\n<h3>\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043d\u0435\u0442, \u0438 \u044d\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0451: \u0441\u043b\u043e\u0442 \u043e\u0442\u0434\u0430\u0451\u0442 <strong>\u0432\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0443<\/strong>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u0438\u0434\u044f\u0442 \u0432\u0441\u0435 N \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"cs\">await using var conn = new LogicalReplicationConnection(connectionString);await conn.Open(ct);var slot = new PgOutputReplicationSlot($\"load_test_slot_{reader}\");   \/\/ \u0441\u0432\u043e\u0439 \u0441\u043b\u043e\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044fvar options = new PgOutputReplicationOptions(\"load_test_pub\", PgOutputProtocolVersion.V4, binary: true);await foreach (var walMessage in conn.StartReplication(slot, options, ct)){    if (walMessage is InsertMessage insert)    {        var message = await ReadRowAsync(insert, ct);        if (await TryClaimAsync(walMessage.WalEnd, slotName, ct))      \/\/ \u0440\u0430\u0437\u044b\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443            await web.Work.PostAsJsonAsync(\"\/send-email\", message, ct);    }    conn.SetReplicationStatus(walMessage.WalEnd);   \/\/ \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 Begin\/Relation\/Commit\/keep-alive    await conn.SendStatusUpdate(ct);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0437\u0438\u0446\u0438\u044e \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0438 \u043d\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445: \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043d\u0438\u043c \u043d\u0435\u0442, \u043d\u043e \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0431\u0430\u0437\u0435 \u0447\u0438\u0441\u0442\u0438\u0442\u044c WAL.<\/p>\n<p>\u0420\u043e\u0437\u044b\u0433\u0440\u044b\u0448 \u2014 \u043e\u0434\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u043e\u0431\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443: \u043a\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u043b, \u0442\u043e\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"sql\">insert into inbox_wal (wal, slot) values ($1, $2)on conflict do nothingreturning wal                          -- \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c: \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0448\u0430; \u043f\u0443\u0441\u0442\u043e - \u0435\u0451 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043e\u0441\u0435\u0434<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0411\u0440\u043e\u043a\u0435\u0440\u043d\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c \u0442\u0430\u043a\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430: \u0442\u0430\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044e \u0437\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0440\u0435\u0448\u0438\u043b \u0431\u0440\u043e\u043a\u0435\u0440. \u0412 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u0440\u0431\u0438\u0442\u0440, \u0438 \u0431\u0435\u0437 \u043d\u0435\u0451 N \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0443 N \u0440\u0430\u0437. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>inbox_wal<\/code> \u043d\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a:<\/p>\n<pre><code class=\"cs\">switch (columns[i].ColumnName){    case \"id\": message.Id = await value.Get&lt;int&gt;(ct); break;    case \"content\": message.Content = await value.Get&lt;string&gt;(ct); break;    case \"created_at\": message.CreatedAt = await value.Get&lt;DateTime&gt;(ct); break;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u2014 \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438 \u044d\u0442\u043e <em>\u201c\u0446\u0435\u043d\u0430\u201d<\/em> \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u0430 \u043d\u0435 \u0434\u0435\u0442\u0430\u043b\u044c.<\/p>\n<h3>\u0427\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">Kafka<\/p>\n<\/th>\n<th>\n<p align=\"left\">RabbitMQ quorum<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0442\u043e \u0434\u0435\u043b\u0438\u0442 \u043f\u043e\u0442\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0438\u043a\u0442\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0438\u0434\u0438\u0442 \u0432\u0441\u0451<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u043e\u0434\u0435\u043b\u044c \u0447\u0442\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0443\u043b\u043b, <code>Consume(timeout)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0443\u0448, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0443\u043b\u043b, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u043d\u043e\u043c\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u043d\u043e\u043c\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0441\u0435\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0443\u0436\u0435\u043d \u043b\u0438 \u0430\u0440\u0431\u0438\u0442\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>inbox_wal<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>StoreOffset<\/code>, \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>basic.ack<\/code> \u043f\u043e delivery tag<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>SetReplicationStatus<\/code> + <code>SendStatusUpdate<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041b\u0438\u0448\u043d\u0435\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435-insert \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435-insert \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Begin<\/code> \/ <code>Relation<\/code> \/ <code>Commit<\/code> \/ keep-alive<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u201c\u041f\u043e\u043b\u0435\u0437\u043d\u0430\u044f\u201d \u0440\u0430\u0431\u043e\u0442\u0430<\/h3>\n<pre><code class=\"cs\">app.MapPost(\"\/send-email\", async (Message message, LoadStats stats) =&gt;{    stats.Work(message.Id);    await Task.Yield();    return Results.Accepted();});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439. \u0412\u0441\u044f \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u2014 HTTP-\u0445\u043e\u043f (\u043e\u043a\u043e\u043b\u043e 0.3 \u043c\u0441); <code>stats.Work<\/code> \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 id \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0430.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0431\u043e\u043a\u0441<\/h3>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0434\u0430\u044e\u0442 at-least-once: Kafka \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043f\u0438\u043a \u043e\u0442 \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0444\u0444\u0441\u0435\u0442\u0430, RabbitMQ \u043f\u0435\u0440\u0435\u0432\u044b\u0434\u0430\u0451\u0442 \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u043e\u0435, \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0436\u0443\u0440\u043d\u0430\u043b \u043e\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u043e\u0433\u043e LSN. \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e HTTP-\u0432\u044b\u0437\u043e\u0432 \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0436\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u00ab\u0432\u0437\u044f\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0443\u00bb \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f <strong>\u0434\u043e<\/strong> \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u043d\u0431\u043e\u043a\u0441\u043e\u043c: \u0435\u0441\u043b\u0438 \u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043d\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u2014 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0441 <code>upsert<\/code>, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u2014 \u0442\u043e \u044d\u0442\u0430 \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0433\u0434\u0435 \u043f\u043e\u0432\u0442\u043e\u0440 \u043e\u0442\u043b\u0438\u0447\u0438\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<h4>\u0418\u043d\u0431\u043e\u043a\u0441 \u0434\u043b\u044f Kafka \u0438 RabbitMQ<\/h4>\n<p>\u041a\u043b\u044e\u0447 \u2014 <code>id<\/code> \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u2014 \u0438\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"sql\">with claimed as (    insert into inbox (id, consumer) values ($1, $2)    on conflict do nothing    returning id)select id from claimed                        -- \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441: \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0448\u0430union allselect id from inboxwhere id = $1 and consumer = $2                -- \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u0443\u0436\u0435 \u043d\u0430\u0448\u0430: \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u043a\u0430, \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0435 \u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 data-modifying CTE \u0432\u0438\u0434\u044f\u0442 \u043e\u0434\u0438\u043d \u0441\u043d\u0438\u043c\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0442\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0448\u043b\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0438, \u0430 \u0441\u0432\u0435\u0436\u0430\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>returning<\/code> \u2014 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0430 \u043d\u0435\u0442. \u0411\u0435\u0437 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0431\u0435\u0437 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>\u0427\u0442\u043e \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c id \u043d\u0435 \u0431\u0443\u0434\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0443\u0436\u0430\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c\u00bb, \u0430 \u043d\u0435 \u00ab\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430, <code>done<\/code>, \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0418\u043d\u0431\u043e\u043a\u0441 \u0434\u043b\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 <code>inbox_wal<\/code> \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043f\u0440\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u2014 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0431\u043e\u043a\u0441, \u043d\u043e \u043a\u043b\u044e\u0447 \u0434\u0440\u0443\u0433\u043e\u0439: LSN \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u043d \u0436\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0430 \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u2014 \u0438\u043c\u044f \u0441\u043b\u043e\u0442\u0430.<\/p>\n<pre><code class=\"sql\">insert into inbox_wal (wal, slot) values ($1, $2)on conflict do nothingreturning wal<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0449\u0435, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u0423 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u0430: \u043f\u0440\u0438 N \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u0445 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0432\u0441\u0435 N, \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f N \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0431\u0430\u0437\u0435. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <strong>\u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0435\u043c \u043f\u0443\u0442\u0438<\/strong>.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/extt\/99\/8d\/b4\/998db49844154c6fc81a19e23afbfdc7.svg\" alt=\" flowchart LR WAL[&quot;WAL&quot;] --&gt; S0[&quot;\u0441\u043b\u043e\u0442 wal_0&quot;] --&gt; R0[&quot;\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c 0&quot;] WAL --&gt; S1[&quot;\u0441\u043b\u043e\u0442 wal_1&quot;] --&gt; R1[&quot;\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c 1&quot;] WAL --&gt; S2[&quot;\u0441\u043b\u043e\u0442 wal_2&quot;] --&gt; R2[&quot;\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c 2&quot;] R0 --&gt; I R1 --&gt; I R2 --&gt; I I[(&quot;inbox_wal: LSN \u2192 \u0441\u043b\u043e\u0442\u0430\u0440\u0431\u0438\u0442\u0440 \u0440\u0430\u0437\u0434\u0430\u0447\u0438&quot;)] --&gt; W[&quot;\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0434\u0438\u043d,\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0432\u0438\u0433\u0430\u044e\u0442 LSN&quot;] \" title=\"\u0412\u0435\u0435\u0440\u043d\u044b\u0439 \u043d\u0430\u043b\u043e\u0433 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/extt\/99\/8d\/b4\/998db49844154c6fc81a19e23afbfdc7.svg 780w,&#10;       https:\/\/habrastorage.org\/extt\/99\/8d\/b4\/998db49844154c6fc81a19e23afbfdc7.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u0435\u0435\u0440\u043d\u044b\u0439 \u043d\u0430\u043b\u043e\u0433 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 <strong>\u0432\u0435\u0435\u0440\u043d\u044b\u0439 \u043d\u0430\u043b\u043e\u0433<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043d \u0432 \u0446\u0438\u0444\u0440\u0430\u0445: <code>skipped<\/code>-\u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u0431\u044b\u043b\u043e, \u2014 \u0440\u043e\u0432\u043d\u043e <code>(N\u22121)\u00d7M<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c 700 000 \u043d\u0430 100 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0432\u043e\u0441\u044c\u043c\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u0445.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h2>\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u0447\u043a\u0430\u043c\u0438 (\u0431\u0430\u0447\u0442\u0430\u043c\u0438)<\/h2>\n<p>\u041f\u0430\u0447\u043a\u0430 \u0438\u0437 100 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0431\u0430\u0437\u0435 \u0432 \u043e\u0434\u043d\u043e \u2014 0.01 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0420\u043e\u0432\u043d\u043e \u044d\u0442\u043e \u0438 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0447\u0438\u0442\u0430\u044e\u0442 \u043f\u0430\u0447\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u041f\u0430\u0447\u043a\u0430 \u0443 Kafka \u0438 RabbitMQ<\/h3>\n<pre><code class=\"cs\">while (batch.Count &lt; BatchSize)                       \/\/ BatchSize = 100{    var result = consumer.Consume(batch.Count == 0 ? PollDelay : FlushDelay);    if (result is null)    {        if (batch.Count &gt; 0) break;                   \/\/ \u0434\u043e\u0431\u043e\u0440 \u043d\u0435 \u043f\u0440\u0438\u0448\u0451\u043b - \u0438\u0434\u0451\u043c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c        if (state.IsDrained || state.IsExpired) return false;        continue;    }    batch.Add(result);}var claimed = await InboxBatch.ClaimAsync(dataSource, Ids(batch), consumerName, ct);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f 100 \u043c\u0441, \u0434\u043e\u0431\u043e\u0440 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0430\u0447\u043a\u0438 50 \u043c\u0441: \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442 \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0438 \u043d\u0435 \u0436\u0434\u0451\u0442 \u0441\u043e\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0436\u0435 \u043d\u0435\u0442.<\/p>\n<p>\u0423 RabbitMQ \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440 \u2014 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u0443\u0448\u0438\u0442, \u0430 \u0446\u0438\u043a\u043b\u0443 \u043d\u0443\u0436\u0435\u043d \u043f\u0443\u043b\u043b:<\/p>\n<pre><code class=\"cs\">consumer.ReceivedAsync += (_, delivery) =&gt;{    buffer.Writer.TryWrite((delivery.DeliveryTag, delivery.Body.ToArray()));    return Task.CompletedTask;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0431\u043e\u043a\u0441\u0430, \u043d\u043e \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<pre><code class=\"sql\">with claimed as (    insert into inbox (id, consumer)    select unnest($1), $2    on conflict do nothing    returning id)select id from claimedunion allselect id from inbox where id = any($1) and consumer = $2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u043f\u0430\u0447\u043a\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430\u0448\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0447\u0443\u0436\u0438\u0435, \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043d\u0435\u043b\u044c\u0437\u044f: \u043e\u0444\u0444\u0441\u0435\u0442 Kafka \u0438 LSN \u0441\u043b\u043e\u0442\u0430 <strong>\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435<\/strong> \u2014 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044f \u043d\u043e\u043c\u0435\u0440, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0448\u044c \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c.<\/p>\n<pre><code class=\"cs\">public void Hold(T position) =&gt; _inflight.Add(position);public bool TryResolve(T position, out T confirmed){    _inflight.Remove(position);    _resolved.Add(position);    var moved = false;    while (_resolved.Count &gt; 0 &amp;&amp; (_inflight.Count == 0 || _resolved.Min!.CompareTo(_inflight.Min!) &lt; 0))    {        _confirmed = _resolved.Min;        _resolved.Remove(_confirmed!);        moved = true;    }    confirmed = _confirmed!;    return moved;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>Hold<\/code> \u2014 \u0432\u0437\u044f\u043b\u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443, <code>TryResolve<\/code> \u2014 \u0437\u0430\u043a\u0440\u044b\u043b\u0438 (\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430, \u043b\u0438\u0431\u043e \u0435\u0451 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442); \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e, \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445:<\/p>\n<pre><code class=\"cs\">foreach (var item in batch){    if (claimed.Contains(item.Id)) { Watermark(item.Partition).Hold(item.Offset); pending.Enqueue(item); }    else Resolve(item);                               \/\/ \u0447\u0443\u0436\u0430\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0430: \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0434\u0435\u0444\u0435\u043a\u0442 \u043d\u0430\u0448\u0451\u043b \u0418\u0418 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432: \u0434\u043e \u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0443\u0436\u043e\u0433\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u043b\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0448\u0443 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<p>Quorum-\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 RabbitMq \u043e\u043d\u0430 \u043d\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f: <code>basic.ack<\/code> \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442 delivery tag, \u0430 \u043d\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044e.<\/p>\n<h3>\u041f\u0430\u0447\u043a\u0430 \u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c, \u0438 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0442\u0435\u0440\u044f\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">var move = moving[index] ??= stream.MoveNextAsync().AsTask();if (!move.IsCompleted &amp;&amp; await Task.WhenAny(move, Task.Delay(wait, ct)) != move) { \/* \u0434\u043e\u0431\u043e\u0440 \u043d\u0435 \u043f\u0440\u0438\u0448\u0451\u043b *\/ }if (stream.Current is not InsertMessage insert){    Resolve(index, stream.Current.WalEnd);   \/\/ \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435: \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u0442, \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0435\u0441\u0442\u044c    continue;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0447\u043a\u0438 LSN \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0441\u0430\u043c\u0438 LSN, \u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u043f\u0430\u0447\u043a\u0435 \u2014 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443:<\/p>\n<pre><code class=\"sql\">with input as (    select ord, txt::pg_lsn as wal    from unnest($1::text[]) with ordinality as t(txt, ord)),claimed as (    insert into inbox_wal (wal, slot)    select wal, $2 from input    on conflict do nothing    returning wal)select i.ord from input i join claimed c on c.wal = i.wal     -- \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0438 \u0433\u043e\u043d\u043a\u0443: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043cunion allselect i.ord from input i join inbox_wal w  on w.wal = i.wal and w.slot = $2                            -- \u0441\u0432\u043e\u0439 LSN: \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u043a\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0438\u0433\u0440\u0430\u0432\u0448\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0443 \u0441\u0435\u0431\u044f. \u0412\u0435\u0435\u0440\u043d\u044b\u0439 \u043d\u0430\u043b\u043e\u0433 \u043e\u0441\u0442\u0430\u043b\u0441\u044f, \u043d\u043e \u0441\u0442\u0430\u043b \u0434\u0435\u0448\u0435\u0432\u043b\u0435.<\/p>\n<h2>\u0428\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/h2>\n<p>\u041f\u0430\u0447\u043a\u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u043d\u0435 \u0447\u0438\u0441\u043b\u043e \u043b\u0438\u0448\u043d\u0438\u0445 \u0440\u043e\u0437\u044b\u0433\u0440\u044b\u0448\u0435\u0439: \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0432\u0441\u0435 N \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439. \u0425\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0445\u043e\u0434\u0438\u043b \u0432 \u0431\u0430\u0437\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438. \u0421\u0442\u0440\u043e\u043a\u0438 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 64 \u0448\u0430\u0440\u0434\u0430 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043a\u0443 \u043e\u0442 <code>id<\/code> \u2014 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0435\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u0442\u043e\u043c, \u043a\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0448\u0430\u0440\u0434\u043e\u043c.<\/p>\n<h3>\u041b\u043e\u043a \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 advisory-\u043b\u043e\u043a PostgreSQL. \u0411\u0435\u0440\u0451\u0442\u0441\u044f \u0438 \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u043d \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">select pg_try_advisory_lock(0x7761, 5);   -- true, \u0435\u0441\u043b\u0438 \u0448\u0430\u0440\u0434 5 \u0431\u044b\u043b \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d; false - \u0437\u0430\u043d\u044f\u0442select pg_advisory_unlock(0x7761, 5);     -- \u043e\u0442\u0434\u0430\u043b\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u2014 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u043b\u044e\u0447\u0435\u0439 (\u0443 \u0448\u0430\u0440\u0434\u043e\u0432 \u044d\u0442\u043e <code>0x7761<\/code>), \u0432\u0442\u043e\u0440\u043e\u0435 \u2014 \u043d\u043e\u043c\u0435\u0440 \u0448\u0430\u0440\u0434\u0430. \u0412\u0430\u0436\u043d\u044b \u0442\u0440\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<ul>\n<li>\n<p><code>try<\/code>-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 <strong>\u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0436\u0434\u0451\u0442 \u0438 \u043d\u0435 \u043e\u0442\u0431\u0438\u0440\u0430\u0435\u0442<\/strong>: \u043b\u0438\u0431\u043e \u043b\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u0448\u0438\u043c, \u043b\u0438\u0431\u043e \u043d\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p>\u043b\u043e\u043a \u0436\u0438\u0432\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>\u0436\u0438\u0432\u0451\u0442 \u0441\u0435\u0441\u0441\u0438\u044f<\/strong>: \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043f\u0430\u043b, \u0441\u0435\u0442\u044c \u043f\u043e\u0440\u0432\u0430\u043b\u0430\u0441\u044c, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u0431\u0438\u043b\u0438 \u2014 PostgreSQL \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0441\u0435 \u043b\u043e\u043a\u0438 \u0432\u0438\u0434\u043d\u044b \u0432 <code>pg_locks<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e <strong>\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c<\/strong>, \u0430 \u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0411\u0435\u0440\u0451\u043c \u0438 \u043e\u0442\u0434\u0430\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e<\/h3>\n<p>\u0428\u0430\u0440\u0434\u044b \u0434\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0438 \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0447\u043a\u043e\u0439, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u0423 \u0434\u043e\u0431\u043e\u0440\u0430 \u0432\u0430\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0437\u044f\u043b\u0438\u0441\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0435.<\/p>\n<pre><code class=\"sql\">select s, pg_try_advisory_lock(0x7761, s) from unnest($shards::int[]) as s;   -- \u0434\u043e\u0431\u043e\u0440select pg_advisory_unlock(0x7761, s)      from unnest($shards::int[]) as s;   -- \u043e\u0442\u0434\u0430\u0447\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0440\u0434\u043e\u0432 \u0431\u0440\u0430\u0442\u044c<\/h3>\n<p>\u0421\u0432\u043e\u044f \u0434\u043e\u043b\u044f \u2014 \u044d\u0442\u043e 64, \u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u0436\u0438\u0432\u044b\u0445 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441. \u0418 \u0442\u0443\u0442 \u043c\u0435\u0448\u0430\u0435\u0442 \u0434\u0435\u0442\u0430\u043b\u044c: \u0432 <code>pg_locks<\/code> \u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u0442 <strong>\u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e<\/strong> \u0448\u0430\u0440\u0434\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0443\u0432\u0438\u0434\u0435\u043b \u0431\u044b \u043f\u0443\u0441\u0442\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443, \u0441\u0447\u0451\u043b \u0441\u0435\u0431\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438 \u0437\u0430\u0431\u0440\u0430\u043b \u0432\u0441\u0435 64.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043b\u043e\u043a \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439, \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0439:<\/p>\n<pre><code class=\"sql\">-- \u0432\u0445\u043e\u0434 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430select m from generate_series(0, $members_max - 1) as mwhere pg_try_advisory_lock(0x7762, m)   -- 0x7762 - \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438limit 1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>limit 1<\/code> \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0441\u043f\u0435\u0445\u0435: \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432 <code>FROM<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0435\u043d\u0438\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0438\u0448\u043d\u0438\u0445 \u043b\u043e\u043a\u043e\u0432 \u043d\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043e\u0431\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441 \u0438 \u043a\u0442\u043e \u0447\u0442\u043e \u0434\u0435\u0440\u0436\u0438\u0442:<\/p>\n<pre><code class=\"sql\">select objid::bigint as shard, pid, classid::bigint as nsfrom pg_lockswhere locktype = 'advisory'  and classid in (0x7761::oid, 0x7762::oid)   -- \u0448\u0430\u0440\u0434\u044b \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438  and objsubid = 2 and granted<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 \u0441 <code>classid = 0x7762<\/code> \u2014 \u044d\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438, \u0438\u0445 \u0447\u0438\u0441\u043b\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b; \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 <code>0x7761<\/code> \u2014 \u0437\u0430\u043d\u044f\u0442\u044b\u0435 \u0448\u0430\u0440\u0434\u044b.<\/p>\n<h3>\u0420\u0435\u0431\u0430\u043b\u0430\u043d\u0441: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0448\u0430\u0440\u0434\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0430\u0448\u0438<\/h3>\n<p>\u0420\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 <code>pg_locks<\/code> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0451 \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u043e \u0441 \u043f\u0440\u0438\u0447\u0438\u0442\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u0434\u043e\u043b\u0435\u0439:<\/p>\n<pre><code class=\"cs\">var (others, members) = await ReadLocksAsync(ct);var target = (int)Math.Ceiling(shardCount \/ (double)members);if (mine.Count &gt; target)      await ReleaseAsync(Largest(mine, mine.Count - target), ct);else if (mine.Count &lt; target) await AcquireAsync(Free(others, target - mine.Count), ct);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041b\u0438\u0448\u043d\u0435\u0435 \u043e\u0442\u0434\u0430\u0451\u043c, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435 \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u2014 \u043d\u043e <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043d\u0438\u0447\u0435\u0439\u043d\u044b\u0445<\/strong>: <code>Free<\/code> \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438 \u0441\u0432\u043e\u0438, \u0438 \u0447\u0443\u0436\u0438\u0435 \u0448\u0430\u0440\u0434\u044b, \u0430 <code>try<\/code>-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0434\u0430\u043b \u0431\u044b \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043d\u044f\u0442\u044b\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0448\u0430\u0440\u0434 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0447\u0435\u0439\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438 \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u043d\u0435 \u043e \u0447\u0435\u043c.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/extt\/7c\/22\/28\/7c222847fa57c2349e568a4eeb80e3f8.svg\" alt=\" stateDiagram-v2 [*] --&gt; \u041d\u0438\u0447\u0435\u0439 \u041d\u0438\u0447\u0435\u0439 --&gt; \u041c\u043e\u0439: pg_try_advisory_lock \u0443\u0441\u043f\u0435\u0448\u0435\u043d \u041d\u0438\u0447\u0435\u0439 --&gt; \u0427\u0443\u0436\u043e\u0439: \u043b\u043e\u043a \u0443\u0441\u043f\u0435\u043b \u0432\u0437\u044f\u0442\u044c \u0441\u043e\u0441\u0435\u0434 \u041c\u043e\u0439 --&gt; \u041d\u0438\u0447\u0435\u0439: \u043e\u0442\u0434\u0430\u043b\u0438 \u043b\u0438\u0448\u043d\u0435\u0435 \u043f\u0440\u0438 \u0440\u0435\u0431\u0430\u043b\u0430\u043d\u0441\u0435 \u041c\u043e\u0439 --&gt; \u041d\u0438\u0447\u0435\u0439: \u0441\u0435\u0441\u0441\u0438\u044f \u043e\u0431\u043e\u0440\u0432\u0430\u043b\u0430\u0441\u044c - \u043b\u043e\u043a \u0441\u043d\u044f\u043b PostgreSQL \u0427\u0443\u0436\u043e\u0439 --&gt; \u041d\u0438\u0447\u0435\u0439: \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u043e\u0442\u0434\u0430\u043b \u0438\u043b\u0438 \u0443\u043c\u0435\u0440 \" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043b\u043e\u043a\u043e\u0432\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/extt\/7c\/22\/28\/7c222847fa57c2349e568a4eeb80e3f8.svg 780w,&#10;       https:\/\/habrastorage.org\/extt\/7c\/22\/28\/7c222847fa57c2349e568a4eeb80e3f8.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043b\u043e\u043a\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u00ab\u0441\u0435\u0441\u0441\u0438\u044f \u043e\u0431\u043e\u0440\u0432\u0430\u043b\u0430\u0441\u044c\u00bb \u0438 \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b: \u043d\u0438 heartbeat-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u0438 \u044d\u043f\u043e\u0445, \u043d\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0451\u0440\u0442\u0432\u044b\u0445 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u0432 \u2014 \u0443\u043c\u0435\u0440\u0448\u0438\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0448\u0430\u0440\u0434\u044b \u0441\u0430\u043c, \u0441\u0430\u043c\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u043c \u0441\u043c\u0435\u0440\u0442\u0438.<\/p>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442<\/h4>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0435\u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u2014 \u0434\u0432\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0445\u043e\u0434\u0430 \u0432 \u0431\u0430\u0437\u0443:<\/p>\n<pre><code class=\"cs\">var shard = (int)(id % shardCount);bool mayClaim = isMine[shard] || !heldByOthers[shard];<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u00ab\u043c\u043e\u0439 <strong>\u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0439<\/strong>\u00bb \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e: \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043c\u043e\u0436\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0435\u0451 \u0448\u0430\u0440\u0434 \u0442\u043e\u0447\u043d\u043e \u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439. \u041d\u0438\u0447\u0435\u0439\u043d\u044b\u0439 \u0448\u0430\u0440\u0434 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0431\u0435\u0440\u0451\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u0435\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u2014 \u043f\u043e\u043a\u0430 \u0448\u0430\u0440\u0434\u0430 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b, \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0442\u043e-\u0442\u043e. \u0415\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0439\u043d\u044b\u0439 \u0448\u0430\u0440\u0434 \u0432\u043e\u0437\u044c\u043c\u0443\u0442 \u0434\u0432\u043e\u0435, \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0442 <code>inbox_wal<\/code>: \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043b\u0438\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u043e \u043d\u0435 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439. \u0412 \u0446\u0438\u0444\u0440\u0430\u0445 \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a <code>skipped<\/code> = 1044 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0443\u043b\u044f \u2014 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u043f\u0430\u043b\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0448\u0430\u0440\u0434\u043e\u0432.<\/p>\n<h3>\u0414\u0432\u0435 \u043b\u043e\u0432\u0443\u0448\u043a\u0438<\/h3>\n<pre><code class=\"cs\">var connection = new NpgsqlConnection(    new NpgsqlConnectionStringBuilder(connectionString) { Pooling = false }.ConnectionString);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043b\u043e\u043a \u043d\u0430 \u043f\u0443\u043b\u044f\u0449\u0435\u043c\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0436\u0438\u0432\u0451\u0442 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u044c\u044e: \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u0432 \u043f\u0443\u043b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043b\u043e\u043a\u043e\u043c, \u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u043f\u043e\u0434 \u043d\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0435\u0433\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0437\u0430 \u0443\u0436\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432\u0448\u0438\u043c\u0441\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c.<\/p>\n<p>\u0418 \u0432\u0442\u043e\u0440\u043e\u0435: \u0440\u0435\u0431\u0430\u043b\u0430\u043d\u0441 \u0438\u0434\u0451\u0442 \u0442\u0435\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0447\u0442\u043e \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u0441\u0442\u0440\u043e\u0433\u043e \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u0447\u043a\u0430\u043c\u0438. \u0418\u043d\u0430\u0447\u0435 \u0448\u0430\u0440\u0434 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0438 \u043d\u043e\u0432\u044b\u0439 \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0435\u0451.<\/p>\n<h2>\u0413\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438<\/h2>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/extt\/81\/94\/b1\/8194b1f325d0e6f58cc1aba38c462938.svg\" alt=\" sequenceDiagram participant T as \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 participant C as \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c participant I as inbox participant E as \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 T-&gt;&gt;C: \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 C-&gt;&gt;I: \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u00ab\u0432\u0437\u044f\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0443\u00bb Note over C,I: \u0443\u043f\u0430\u043b \u0437\u0434\u0435\u0441\u044c \u2192 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430,\u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u0441\u0432\u043e\u044f \u2192 \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u043a\u0435 C-&gt;&gt;E: \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 Note over C,E: \u0443\u043f\u0430\u043b \u0437\u0434\u0435\u0441\u044c \u2192 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:\u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c C-&gt;&gt;T: \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 Note over C,T: \u0443\u043f\u0430\u043b \u0437\u0434\u0435\u0441\u044c \u2192 \u0440\u0430\u0431\u043e\u0442\u0430 \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u0430,\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0441\u044f: \u044d\u0442\u043e \u0434\u0443\u0431\u043b\u044c \" title=\"\u0422\u043e\u0447\u043a\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/extt\/81\/94\/b1\/8194b1f325d0e6f58cc1aba38c462938.svg 780w,&#10;       https:\/\/habrastorage.org\/extt\/81\/94\/b1\/8194b1f325d0e6f58cc1aba38c462938.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u043e\u0447\u043a\u0438 \u043e\u0442\u043a\u0430\u0437\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438\u0437-\u0437\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 inbox. \u0422\u0440\u0435\u0442\u044c\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0442\u043a\u043e\u0439 <code>done<\/code> \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b. \u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f  \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0440\u044b. \u041d\u043e \u043e\u043a\u043d\u043e \u0434\u0443\u0431\u043b\u0435\u0439 \u043e\u043d\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442, \u0430 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442: \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c\u044e <code>done<\/code> \u0434\u0430\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0432\u0442\u043e\u0440. \u0412 \u0442\u0435\u0441\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u0435 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0430 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438: <strong>\u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0430\u0437\u044b<\/strong>. \u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 \u043b\u044e\u0431\u043e\u0439 \u043e\u0442\u043c\u0435\u0442\u043a\u043e\u0439 \u043e \u043d\u0451\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u0440\u0435\u0442\u044c, \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u00ab\u0441\u0434\u0435\u043b\u0430\u043b, \u043d\u043e \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u00bb \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u043e \u043e\u0442 \u00ab\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0431\u043e\u043a\u0441 \u0434\u0430\u0451\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044c, \u0430 \u0440\u043e\u0432\u043d\u043e-\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0432 \u043d\u0435\u0439 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u2014 \u043a\u043b\u044e\u0447 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0435\u0433\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u2014 \u043b\u0438\u0431\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0442\u0430\u0449\u0438\u0442\u044c \u0432 \u0442\u0443 \u0436\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0447\u0442\u043e \u0438 \u043e\u0442\u043c\u0435\u0442\u043a\u0443, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0438\u043d\u0431\u043e\u043a\u0441 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432\u043e\u0432\u0441\u0435.<\/p>\n<blockquote>\n<p>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0435 \u043a\u043e\u0434 \u043a\u043e\u043d\u0441\u044a\u044e\u043c\u0435\u0440\u0430, \u0430 \u0441\u0430\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0435.<\/p>\n<\/blockquote>\n<h2>\u041f\u0440\u043e\u0433\u043e\u043d\u044b<\/h2>\n<p>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"cs\">public bool Success =&gt; Error is null &amp;&amp; SendFailed == 0 &amp;&amp; Sent == Messages &amp;&amp; Processed == Messages                       &amp;&amp; DistinctIds == Messages                       &amp;&amp; WorkCalls == Messages &amp;&amp; WorkDistinct == Messages;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>WorkCalls<\/code> \u0438 <code>WorkDistinct<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438\u0437 no-op \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e \u0438\u043d\u0431\u043e\u043a\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442. \u0412\u0441\u0435 16 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u0434\u0430\u043b\u0438 <code>OK<\/code> \u2014 \u043d\u043e \u044d\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432, \u0430 \u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b: \u0441\u0431\u043e\u0435\u0432 \u0432 \u043d\u0438\u0445 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b.<\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0438 \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u043b\u043e\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u0442: \u0436\u0438\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0434\u043e \u0441\u043b\u043e\u0442\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0451\u0442.<\/p>\n<pre><code class=\"sql\">SELECT count(*) FROM pg_replication_slots sWHERE s.slot_name = $1 AND s.active_pid IS NOT NULL AND s.restart_lsn IS NOT NULL  AND EXISTS (SELECT 1 FROM pg_stat_replication r WHERE r.pid = s.active_pid AND r.state = 'streaming')<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"sql\">SELECT slot_name FROM pg_replication_slots WHERE slot_name LIKE $1 AND active_pid IS NOT NULL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u0438\u043c \u0442\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0436\u0443\u0440\u043d\u0430\u043b \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0438\u043a\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0439: \u0447\u0443\u0436\u043e\u0439 CDC-\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u043e\u043d \u0444\u043e\u043d\u043e\u043c.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0435\u0440\u0438\u0438: \u0442\u043e\u043f\u0438\u043a \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d, \u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 (\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u043c \u0430\u0432\u0442\u043e\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u043e\u043f\u0438\u043a \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0435\u0439); exchange \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439, \u0438\u043d\u0430\u0447\u0435 \u043d\u0435\u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 routing key \u0442\u0438\u0445\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0431\u044b \u0432\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a. \u0417\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u0432 \u0441\u0435\u0440\u0438\u0438 18: \u043f\u0440\u043e\u0433\u0440\u0435\u0432 \u043d\u0430 20 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, 16 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0437\u043e\u043d\u0434 \u0434\u0440\u0435\u0439\u0444\u0430 \u2014 \u043f\u043e\u0432\u0442\u043e\u0440 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h2>\n<p>100 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d, 200 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439, \u0441\u0432\u043e\u0438 \u0441\u043b\u043e\u0442\u044b \u0438 \u0442\u043e\u043f\u0438\u043a \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">1 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">2<\/p>\n<\/th>\n<th>\n<p align=\"left\">4<\/p>\n<\/th>\n<th>\n<p align=\"left\">8<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.19<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">1.21<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.48<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.88<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435, 64 \u0448\u0430\u0440\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.27<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">1.33<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.66<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.60<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium \u2192 Kafka<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.35<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">1.99<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.03<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.16<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium \u2192 RabbitMQ quorum<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.20<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">2.10<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.25<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.21<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><em>\u043c\u0441 CPU \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c.<\/em><\/p>\n<p>\u041f\u043e\u043b\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 <a href=\"https:\/\/github.com\/gandjustas\/habr-aspnet-kafka\/blob\/outbox-to-inbox\/load-tests\/results\/results-20260922-203603.md\" rel=\"noopener nofollow\">\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u041e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043d\u0435\u0439 \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0438 \u043e\u0434\u0438\u043d \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0435 \u0441\u0442\u0430\u043b.<\/p>\n<p>\u0420\u0430\u0437\u043b\u043e\u0436\u0438\u043c \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043f\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c, <em>CPU-\u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/em> \u0437\u0430 \u043f\u0440\u043e\u0433\u043e\u043d:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">PostgreSQL<\/p>\n<\/th>\n<th>\n<p align=\"left\">Kafka<\/p>\n<\/th>\n<th>\n<p align=\"left\">RabbitMQ<\/p>\n<\/th>\n<th>\n<p align=\"left\">Debezium<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0432\u0435\u0431<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0442\u0435\u0441\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0441\u0443\u043c\u043c\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL<\/p>\n<\/td>\n<td>\n<p align=\"left\">64.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.7<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.3<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">38.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">15.2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>118.7<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium \u2192 Kafka<\/p>\n<\/td>\n<td>\n<p align=\"left\">78.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">16.9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.4<\/p>\n<\/td>\n<td>\n<p align=\"left\">75.8<\/p>\n<\/td>\n<td>\n<p align=\"left\">45.7<\/p>\n<\/td>\n<td>\n<p align=\"left\">18.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>235.1<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u043e\u043b\u043e\u043d\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u043d\u0435 \u043d\u0443\u043b\u0438: \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043f\u043e\u0434\u043d\u044f\u0442\u044b \u0438 \u0432 \u0442\u0435\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442. \u041e\u043d\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u043d\u043e \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043a\u0430\u0436\u0430\u044e\u0442 \u0432\u0441\u0435 \u0437\u0430\u043c\u0435\u0440\u044b.<\/p>\n<h3>\u0411\u0440\u043e\u043a\u0435\u0440 \u043d\u0435 \u0440\u0430\u0437\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0431\u0430\u0437\u0443<\/h3>\n<p>\u0412 \u043f\u0443\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 Kafka PostgreSQL \u0442\u0440\u0430\u0442\u0438\u0442 78 CPU-\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u043e\u0442\u0438\u0432 64 \u043f\u0440\u0438 \u043f\u0440\u044f\u043c\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0438 \u2014 \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0431\u043e\u043b\u044c\u0448\u0435. Debezium \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 WAL \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 <code>pgoutput<\/code> \u0438 \u0442\u0443 \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u043e\u043d, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438. \u0421\u0432\u0435\u0440\u0445\u0443 \u2014 76 \u0441\u0435\u043a\u0443\u043d\u0434 Debezium \u0438 17 \u0441\u0430\u043c\u043e\u0439 Kafka.<\/p>\n<h3>\u042d\u0442\u0438 \u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u0431\u0430\u0437\u0435<\/h3>\n<p>93 CPU-\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 Kafka \u0438 Debezium \u2014 \u044d\u0442\u043e 0.93 \u043c\u0441 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0412 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442\u0435 \u043d\u0430 \u044f\u0434\u0440\u0430 \u0437\u0430 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0432 46.4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b:<\/p>\n<pre><code>Debezium: 75.8 \/ 46.4 = 1.63 \u044f\u0434\u0440\u0430Kafka:    16.9 \/ 46.4 = 0.36 \u044f\u0434\u0440\u0430\u0432\u043c\u0435\u0441\u0442\u0435                  2.0 \u044f\u0434\u0440\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043b\u044e\u0441 \u043f\u0430\u043c\u044f\u0442\u044c: Debezium Server 820\u2013900 \u041c\u0411 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0437\u0430 \u043f\u0440\u043e\u0433\u043e\u043d, Kafka 980\u20131150 \u041c\u0411. \u0421\u0445\u0435\u043c\u0430 \u0441 \u043a\u0430\u0444\u043a\u043e\u0439 \u0435\u0441\u0442 \u0434\u0432\u0430 \u044f\u0434\u0440\u0430 \u0438 \u0434\u0432\u0430 \u0433\u0431 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u043d\u0430 \u0442\u0440\u0438.<\/p>\n<p>\u041e\u0442\u0434\u0430\u0439\u0442\u0435 \u0442\u0435 \u0436\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b Postgres \u0438 \u043e\u043d \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<h3>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043d\u0435\u0442<\/h3>\n<p>\u0412\u0441\u0435 \u0437\u0430\u043c\u0435\u0440\u044b \u0432\u044b\u0448\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0432 \u043b\u0443\u0447\u0448\u0435\u043c \u0434\u043b\u044f \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u0440\u0435\u0436\u0438\u043c\u0435: \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430, 0.3 \u043c\u0441. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u2014 \u0442\u0430 \u0436\u0435 \u043e\u0431\u0432\u044f\u0437\u043a\u0430, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e <code>Task.Yield()<\/code> \u0441\u0442\u043e\u0438\u0442 <code>Task.Delay(1)<\/code>, \u0447\u0442\u043e \u043d\u0430 Windows \u0434\u0430\u0451\u0442 15.3 \u043c\u0441 (\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u0430). 20 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432<\/p>\n<\/th>\n<th>\n<p align=\"left\">Kafka<\/p>\n<\/th>\n<th>\n<p align=\"left\">RabbitMQ<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0440\u0430\u0437\u0431\u0440\u043e\u0441<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">147<\/p>\n<\/td>\n<td>\n<p align=\"left\">150<\/p>\n<\/td>\n<td>\n<p align=\"left\">144<\/p>\n<\/td>\n<td>\n<p align=\"left\">4 %<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">282<\/p>\n<\/td>\n<td>\n<p align=\"left\">299<\/p>\n<\/td>\n<td>\n<p align=\"left\">290<\/p>\n<\/td>\n<td>\n<p align=\"left\">6 %<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">556<\/p>\n<\/td>\n<td>\n<p align=\"left\">588<\/p>\n<\/td>\n<td>\n<p align=\"left\">571<\/p>\n<\/td>\n<td>\n<p align=\"left\">6 %<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><em>\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/em><\/p>\n<p>\u042d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0446\u0438\u043a\u043b\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 13.6 \/ 14.2 \/ 14.4 \u043c\u0441 \u0432\u043c\u0435\u0441\u0442\u043e 15.3 \u2014 \u043d\u0430 6\u201312% \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 <code>N \/ 15.3 \u043c\u0441<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e HTTP-\u0432\u044b\u0437\u043e\u0432 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432. \u041b\u0438\u043d\u0435\u0439\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0447\u043d\u0430\u044f, \u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u041f\u043e\u0440\u043e\u0433, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u0435\u043d, \u2014 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: \u044d\u0442\u043e \u043e\u0446\u0435\u043d\u043a\u0430 \u043f\u043e \u0434\u0432\u0443\u043c \u0442\u043e\u0447\u043a\u0430\u043c, 0.3 \u043c\u0441 \u0438 15.3 \u043c\u0441, \u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430. \u041b\u044e\u0431\u0430\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430 \u043d\u0438\u043c.<\/p>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432. \u0422\u043e\u0433\u0434\u0430 \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0435\u0440\u0435\u0442\u044c\u0441\u044f \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f WAL \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041d\u043e \u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0442\u044c, \u0447\u0438\u0442\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0442\u044b \u0441 \u0440\u0435\u043f\u043b\u0438\u043a Postgres.<\/p>\n<h3>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439<\/h3>\n<p>\u0426\u0435\u043d\u0430 CDC \u0434\u043b\u044f \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043e\u0442 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u2014 \u0436\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0426\u0435\u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442: \u0431\u0430\u0437\u0430 \u043f\u043b\u0430\u0442\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 9.4 CPU-\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0437\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u0442\u043e \u0435\u0441\u0442\u044c<\/p>\n<pre><code>1.19 + 0.094 \u00d7 (N \u2212 1) \u043c\u0441 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435      \/\/ N = 8: \u043c\u043e\u0434\u0435\u043b\u044c 1.85, \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e 1.88<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0432 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043d\u0435\u0442<\/strong>: \u043f\u0440\u0438 \u0432\u043e\u0441\u044c\u043c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f\u0445 \u043e\u0431\u0430 \u043f\u0440\u044f\u043c\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f (1.88 \u0438 1.60) \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043e\u0431\u043e\u0438\u0445 \u0431\u0440\u043e\u043a\u0435\u0440\u043d\u044b\u0445 (2.16 \u0438 2.21). \u041f\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c CDC (2.16) \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 N \u2248 11 \u2014 \u043d\u043e \u044d\u0442\u043e \u044d\u043a\u0441\u0442\u0440\u0430\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u043e\u0447\u0435\u043a, \u0430 \u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435: <code>max_replication_slots<\/code> \u0438 <code>max_wal_senders<\/code> \u0432 Postgres \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u043d\u044b 10, \u0430 \u043f\u043e \u044d\u0442\u0438\u043c \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0432\u0435\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u043e\u043a\u0443\u043f\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u043e\u0434\u0438\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435. \u0412 \u0441\u0442\u0435\u043d\u0434\u0435 \u043e\u0431\u0430 \u043f\u043e\u0434\u043d\u044f\u0442\u044b \u0434\u043e 64, \u0438 \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0439\u0442\u0438 \u0434\u043e \u0432\u043e\u0441\u044c\u043c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c. \u0414\u0435\u0444\u043e\u043b\u0442 \u0432 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u043b\u043e\u0442\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0445\u0435\u043c\u0443 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u0440\u0430 \u043c\u0435\u043d\u044f\u0442\u044c, \u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0438\u0440\u0430\u0442\u044c.<\/p>\n<p>\u0428\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043d\u0430\u043b\u043e\u0433\u0430: <code>skipped<\/code> \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 700 000 \u0434\u043e 1044, \u0440\u0430\u0437\u0434\u0430\u0447\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u2014 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u0438 12392 \u0438 12783 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432 9600 \u0438 15800 \u0443 \u043d\u0435\u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u0435\u0440\u0430. \u041d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0430\u0437\u044b \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043e 130 \u0434\u043e 107 \u0441\u0435\u043a\u0443\u043d\u0434: \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u2014 \u043d\u0435 \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435, \u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0432 \u0432\u043e\u0441\u044c\u043c\u0438 walsender-\u0430\u0445.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u0432\u0435\u0440\u044b\u0445: \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0442\u0435\u0441\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u0442\u043e\u044f\u0442 50\u201371 CPU-\u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0437\u0430 \u043f\u0440\u043e\u0433\u043e\u043d \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432. \u0414\u043e\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u0447\u0451\u0442\u0435 \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u0430, \u0438 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u0434 \u043f\u0440\u043e\u0442\u0438\u0432 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451; \u0437\u0430\u0442\u043e \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u0443 \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438 \u0432 \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h2>\u0426\u0435\u043d\u0430 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438<\/h2>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u2014 \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432, \u0438 \u043f\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u043e\u0440\u043e\u0436\u0435.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL<\/p>\n<\/th>\n<th>\n<p align=\"left\">CDC \u2192 \u0431\u0440\u043e\u043a\u0435\u0440<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u0434\u0435 \u043a\u043e\u043f\u0438\u0442\u0441\u044f \u043b\u0430\u0433 \u043e\u0442\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">WAL \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043f\u0440\u0438\u043c\u0430\u0440\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0436\u0443\u0440\u043d\u0430\u043b \u0431\u0440\u043e\u043a\u0435\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0441\u0442\u0430 \u043b\u0430\u0433\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>max_slot_wal_keep_size<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u22121 \u2014 \u0431\u0435\u0437\u043b\u0438\u043c\u0438\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">retention \u0431\u0440\u043e\u043a\u0435\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0427\u0442\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>pg_replication_slots.wal_status<\/code>, \u0430\u043b\u0435\u0440\u0442 \u043d\u0430 <code>keeping<\/code>, <code>lost<\/code> \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u043e\u0442\u0435\u0440\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043b\u0430\u0433 \u0433\u0440\u0443\u043f\u043f\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u0435\u0437\u0434 \u043f\u0440\u0438 failover<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>slot sync<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 PG17<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0431\u0440\u043e\u043a\u0435\u0440 \u0436\u0438\u0432\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u0434\u0430\u0447\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0432\u043e\u044f, \u043d\u0430 advisory-\u043b\u043e\u043a\u0430\u0445, \u0441 <code>Pooling = false<\/code> (\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0433\u0440\u0443\u043f\u043f\u0430 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432 \u0431\u0440\u043e\u043a\u0435\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u2014 \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043d\u0432\u0435\u0440\u0442 CDC \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u0440\u043e <code>wal_status<\/code> \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0430: \u043e\u0434\u0438\u043d \u0437\u0430\u043b\u0438\u043f\u0448\u0438\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043a\u043b\u0430\u0434\u0451\u0442 \u043f\u0440\u0438\u043c\u0430\u0440\u0438 \u043f\u043e \u0434\u0438\u0441\u043a\u0443, \u0438 \u044d\u0442\u043e \u0432\u0435\u0441\u043e\u043c\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u0441\u0442\u0435\u043d\u0434\u0435 \u043b\u0438\u043c\u0438\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 4 \u0413\u0411, \u043d\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0433\u043e \u043d\u0435\u0442.<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e: \u0441 PostgreSQL 16 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e standby-\u0440\u0435\u043f\u043b\u0438\u043a\u0438 (\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 17 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u0438 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432)  \u2014 \u0432\u0435\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0443\u0431\u0440\u0430\u0442\u044c \u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u0412 \u044d\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0440\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442.<\/p>\n<h2>\u0427\u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438<\/h2>\n<ul>\n<li>\n<p><strong>\u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f.<\/strong> \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0441\u044a\u044e\u043c\u0435\u0440\u0430, \u0430 \u043d\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u043a\u0430\u0437\u043e\u0432.<\/strong> \u0421\u0431\u043e\u0435\u0432 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u043c\u0435\u0442\u043a\u043e\u0439, \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/strong>  \u042d\u0442\u043e \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0437\u0430\u043c\u0435\u0440\u043e\u0432, \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044e\u043d\u0438\u043d\u0433\u0430 \u0441\u0436\u0430\u0442\u0438\u044f \u0438 <\/strong><code><strong>batch.size<\/strong><\/code> \u0443 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 Kafka.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u0443\u0442\u0431\u043e\u043a\u0441-\u043f\u043e\u043b\u043b\u0438\u043d\u0433\u0430 (<code>SELECT \u2026 FOR UPDATE SKIP LOCKED<\/code> \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439) \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e: \u043e\u043d \u043c\u0435\u0440\u044f\u043b\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b \u2014 \u043e\u043f\u0440\u043e\u0441 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0431\u0430\u0437\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a \u0432\u0441\u0442\u0430\u0432\u043e\u043a, \u0438 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u0435\u043c \u0434\u043e\u0440\u043e\u0436\u0435 \u043e\u043d \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f. \u0420\u0435\u0436\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u2014 \u043a\u0430\u043a \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u043b\u0435\u0440 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f.<\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0441\u043d\u044f\u0442\u044b \u0441\u044d\u043c\u043f\u043b\u0435\u0440\u043e\u043c \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c 2\u20133 \u0441\u0435\u043a\u0443\u043d\u0434\u044b: \u0441\u0440\u0435\u0434\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b, \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u0438\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u043d\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c.<\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 \u0431\u0430\u0437\u0443 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439, \u0447\u0442\u043e \u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u2014 \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e dual write, \u0438 \u043e\u043d \u0442\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B4%D0%B2%D1%83%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2\" rel=\"noopener nofollow\">\u0417\u0430\u0434\u0430\u0447\u0430 \u0434\u0432\u0443\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u043b\u043e\u0432<\/a>).<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u0442\u043e\u043c, \u043a\u0442\u043e \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0436\u0443\u0440\u043d\u0430\u043b:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u043e\u0431\u0430 \u043a\u043e\u043d\u0446\u0430 \u0443 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/strong> \u0412 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043f\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u2014 1.19 \u043f\u0440\u043e\u0442\u0438\u0432 2.20\u20132.35 \u043c\u0441 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435, \u2014 \u0438 \u0431\u0430\u0437\u0430 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435  \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435, \u0430 \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435. \u0426\u0435\u043d\u0430: \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f WAL.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043d\u043e\u0433\u043e.<\/strong> \u0426\u0435\u043d\u0430 \u0432\u0435\u0435\u0440\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 0.094 \u043c\u0441 \u0437\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u0446\u0435\u043d\u0430 CDC \u043f\u043b\u043e\u0441\u043a\u0430\u044f; \u043f\u043e  \u044d\u043a\u0441\u0442\u0440\u0430\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u043e\u043d\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e \u043e\u0434\u0438\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0438 \u0443\u043f\u0435\u0440\u0435\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u2014 \u0432  <code>max_wal_senders<\/code>. \u0414\u043e 4 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u0434\u043e\u0441\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0442 4 \u0434\u043e 10 (\u043c\u0438\u043d\u0443\u0441 \u0441\u043b\u043e\u0442\u044b \u0434\u043b\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438) \u2014 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0411\u043e\u043b\u0435\u0435 10 \u2014 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u043e\u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/strong> \u041d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u2014 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430-\u0430\u0443\u0442\u0431\u043e\u043a\u0441, \u2014 \u0430 \u0437\u0430  \u043d\u0435\u0439 \u0443\u0436\u0435 \u0431\u0440\u043e\u043a\u0435\u0440: \u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0443\u0436\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0417\u0430\u0447\u0435\u043c \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u0435\u043d \u0431\u0440\u043e\u043a\u0435\u0440<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e Kafka \u0431\u044b\u043b\u0430 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u2014 \u043a\u043b\u0438\u043a\u0441\u0442\u0438\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440, \u043f\u0440\u0438\u0447\u0435\u043c \u0431\u0430\u0442\u0447\u0430\u043c\u0438. \u041f\u043e\u0442\u0435\u0440\u044f \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0430 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u0417\u0430\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u043e\u0436\u0435 \u0431\u0430\u0442\u0447\u0430\u043c\u0438.<\/p>\n<p>\u042f \u043f\u0440\u043e\u0432\u0435\u043b \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u0440. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u0431\u0440\u043e\u043a\u0435\u0440, \u043c\u0438\u043d\u0443\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0443. 200 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0432\u043e\u0441\u0435\u043c\u044c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">Kafka<\/p>\n<\/th>\n<th>\n<p align=\"left\">RabbitMQ quorum<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u043c\u0441 CPU \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>0.45<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>0.58<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.22<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0417\u0434\u0435\u0441\u044c \u0431\u0440\u043e\u043a\u0435\u0440 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0438\u0445\u0438\u0438: \u043a\u043e\u0433\u0434\u0430 \u0435\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u0431\u0430\u0437\u044b.<\/p>\n<p>\u041a\u0430\u043a \u0447\u0438\u0441\u0442\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 Kafka \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u0432\u0441\u0435\u0445. RabbitMQ Streams \u0434\u0430\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043b\u0438\u0448\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u044f Kafka. RabbitMQ Quorum Queue \u043e\u0442\u0441\u0442\u0430\u0435\u0442, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439. \u041d\u043e \u0432\u044b\u0440\u0443\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 (DLX, Routing) \u0438 \u043c\u0435\u043d\u0435\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043d \u043a \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u0421 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u044d\u0442\u0438 \u0447\u0438\u0441\u043b\u0430 \u043d\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u044b \u2014 \u0434\u0440\u0443\u0433\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u0442\u0435\u043d\u0434\u0430, \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043c\u0438\u043d\u0443\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441. \u0413\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u0430\u044f: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0431\u0430\u0437\u0435, \u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0435\u0449\u0451 \u0438 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440 \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0434\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043b\u0438\u043a\u0441\u0442\u0440\u0438\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0433\u0434\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0431\u0430\u0437\u0443, \u0443 Kafka \u0438 RabbitMQ \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u0438 \u043e\u043d\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0437\u043a\u0430\u044f: <strong>\u043c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432-\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u0440\u0438\u0447\u0451\u043c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u044f \u0431\u0430\u0437\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/strong>.<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0438 \u043d\u0435 \u0443\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u043f\u0438\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u0431\u0430\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0432\u043e\u0438 \u0438\u043d\u0431\u043e\u043a\u0441\u044b, \u0442\u043e\u0436\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443 \u0441\u0435\u0431\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0440\u043e\u043a\u0435\u0440 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0432\u0441\u0451 \u0438 \u0434\u0435\u043b\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u043f\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u043a\u0443\u043f\u0430\u044e\u0442\u0441\u044f \u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0438 \u0435\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u044c: \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0442, \u043a\u0430\u043a \u043d\u0435\u0442 \u0438 \u0435\u0434\u0438\u043d\u043e\u0439 \u0431\u0430\u0437\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b.<\/p>\n<p>\u041d\u043e \u0443 \u0442\u0430\u043a\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0432\u043e\u044f \u0446\u0435\u043d\u0430 \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0437\u0430\u043c\u0438, \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438, \u2014 \u0438 \u043e\u043d\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041e\u0431 \u044d\u0442\u043e\u043c \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<\/p>\n<p>\u041e\u0431\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f:<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440\\\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0431\u0430\u0437\u044b \u0438 \u043d\u0430 \u043d\u0451\u043c PostgreSQL, \u0442\u043e: <strong>\u043f\u043e\u043a\u0430 \u0431\u0430\u0437\u0430 \u0432\u044b\u0432\u043e\u0437\u0438\u0442 \u0432\u0430\u0448\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u0431\u0440\u043e\u043a\u0435\u0440 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d<\/strong>.<\/p>\n<\/blockquote>\n<p>\u041a\u043e\u0434 \u0438 \u043f\u043e\u043b\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u2014 <a href=\"https:\/\/github.com\/gandjustas\/habr-aspnet-kafka\/tree\/outbox-to-inbox\" rel=\"noopener nofollow\">https:\/\/github.com\/gandjustas\/habr-aspnet-kafka\/tree\/outbox-to-inbox<\/a>. \u0417\u0430\u043c\u0435\u0440 \u0431\u0435\u0437 \u0430\u0443\u0442\u0431\u043e\u043a\u0441\u0430 \u2014 \u0432\u0435\u0442\u043a\u0430 <code>queue-load-test<\/code>.<\/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\/articles\/1099894\/\">https:\/\/habr.com\/ru\/articles\/1099894\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u043b, \u0447\u0442\u043e Kafka \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 PostgreSQL \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0412\u043e\u0437\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445: \u0441\u043b\u043e\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0436\u0443\u0440\u043d\u0430\u043b \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430.\u042d\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u043f\u043e \u0432\u044b\u0431\u043e\u0440\u0443 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430: \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0440\u043e\u043a\u0435\u0440 \u043d\u0443\u0436\u0435\u043d, \u0438 \u043e\u043d\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0438\u0437 \u0442\u0435\u0445 \u0436\u0435 \u0446\u0438\u0444\u0440.\u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u043e\u043c\u0443 \u043b\u0435\u043d\u044c \u0447\u0438\u0442\u0430\u0442\u044c\u041c\u0435\u0442\u0440\u0438\u043a\u0430 \u2014 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 (\u0431\u0430\u0437\u0430, \u0431\u0440\u043e\u043a\u0435\u0440, CDC-\u0437\u0432\u0435\u043d\u043e, \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u0442\u0435\u0441\u0442), \u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:\u043c\u0441 CPU \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 = \u0441\u0443\u043c\u043c\u0430 CPU-\u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0437\u0430 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \/ \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439100 000 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d, 200 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439:\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u04401 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c248\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f)1.191.211.481.88\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435, 64 \u0448\u0430\u0440\u0434\u04301.271.331.661.60Debezium \u2192 Kafka2.351.992.032.16Debezium \u2192 RabbitMQ quorum2.202.102.252.21\u043c\u0441 CPU \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c; \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u0434\u0435\u0448\u0435\u0432\u043b\u0435.\u0422\u0440\u0438 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0448\u0438\u0440\u0435, \u0447\u0435\u043c \u043e\u043d\u0430 \u0435\u0441\u0442\u044c.\u042d\u0442\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u043d\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u041d\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430, \u043d\u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u044b: \u0441\u0442\u0435\u043d\u0434 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439 (\u0437\u0430\u043f\u0438\u0441\u044c \u0432 outbox), \u0430 \u043d\u0435 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b, \u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 N \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0447\u0442\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u0422\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0430: \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 1\u20138 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.\u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0443 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u043c \u0434\u0440\u0435\u0439\u0444\u0435 \u0441\u0442\u0435\u043d\u0434\u0430 10%, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u043d\u044c\u0448\u0435 10% \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e\u0442: 2.16 \u043f\u0440\u043e\u0442\u0438\u0432 2.21 \u0438 1.60 \u043f\u0440\u043e\u0442\u0438\u0432 1.88 \u2014 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438, \u0430 1.19 \u043f\u0440\u043e\u0442\u0438\u0432 2.35 \u2014 \u043d\u0435\u0442.\u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0437\u0430\u043c\u0435\u0440\u044f\u043b\u0441\u044f \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.\u0421\u0442\u0435\u043d\u0434\u041c\u0430\u0448\u0438\u043d\u0430\u043e\u0434\u043d\u0430, 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, 31 \u0413\u0411, Windows; \u0431\u0440\u043e\u043a\u0435\u0440\u044b \u0438 Debezium \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445, \u0432\u0435\u0431 \u0438 \u0442\u0435\u0441\u0442 \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0440\u044f\u0434\u043e\u043cPostgreSQL18 (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b pgoutput V4 \u0441 binary: true \u0442\u0440\u0435\u0431\u0443\u0435\u0442 16+)Kafkaconfluent-local 8.2, \u0442\u043e\u043f\u0438\u043a 2\u00d7N \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439, ReplicationFactor = 1RabbitMQ4.3, quorum-\u043e\u0447\u0435\u0440\u0435\u0434\u044c (Raft, fsync \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)CDCDebezium Server 3.6.2.Final, \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u0441\u0442\u0440\u043e\u043a\u0430 messages: id, content = &#171;helloworld&#187;, created_at \u2014 \u043e\u043a\u043e\u043b\u043e 30 \u0431\u0430\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u043d\u0432\u0435\u0440\u0442 Debezium \u2014 \u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442\u041f\u043e\u0442\u043e\u043a4900\u20138000 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1 \u041c\u0411\/\u0441: \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0438\u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b 10 \u041c\u0411\/\u0441 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0447\u0442\u043e \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 docker \u0432 wsl\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0430\u0437\u044b \u2014 \u0432 AppHost:.WithArgs(&#171;-c&#187;, &#171;wal_level=logical&#187;).WithArgs(&#171;-c&#187;, &#171;max_wal_senders=64&#187;)           \/\/ 8 \u0441\u043b\u043e\u0442\u043e\u0432 \u0432\u0435\u0435\u0440\u0430 + 2 Debezium + \u0437\u0430\u043f\u0430\u0441; \u0434\u0435\u0444\u043e\u043b\u0442 10.WithArgs(&#171;-c&#187;, &#171;max_slot_wal_keep_size=4096&#187;)  \/\/ 4 \u0413\u0411; \u0434\u0435\u0444\u043e\u043b\u0442 -1 &#8212; \u0431\u0435\u0437\u043b\u0438\u043c\u0438\u0442\u043d\u043e\u0435 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 WAL\u0427\u0438\u0441\u043b\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043d\u043e \u0438 \u0432 max_wal_senders, \u0430 \u043e\u0442\u0441\u0442\u0430\u0432\u0448\u0438\u0439 \u0441\u043b\u043e\u0442 \u0431\u0435\u0437 max_slot_wal_keep_size \u0441\u044a\u0435\u0441\u0442 \u0434\u0438\u0441\u043a parimary-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b: \u0442\u043e\u043f\u0438\u043a \u0441 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u043e\u0439, \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b\u043e\u0441\u044c. \u041b\u044e\u0431\u044b\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e \u043f\u043e\u0442\u0435\u0440\u0438 Kafka \u0438\u043b\u0438 RabbitMQ \u2014 \u043d\u0435 \u043e\u0442\u0441\u044e\u0434\u0430.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u041e\u0431\u0449\u0438\u0439 \u0443 \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043f\u0443\u0442\u044c \u0434\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0432\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438. \u0420\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0437\u043e\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u043c. \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c\u041f\u0440\u043e\u0441\u0442\u043e \u0430\u0443\u0442\u0431\u043e\u043a\u0441, \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u044f \u043f\u0438\u0441\u0430\u043b \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.app.MapPost(&#171;\/load\/messages&#187;, async (Message dto, AppDbContext db, CancellationToken ct) =&gt;{    db.Messages.Add(new Message { Content = dto.Content });    await db.SaveChangesAsync(ct);    return Results.Created();});entity.Property(x =&gt; x.CreatedAt).HasDefaultValueSql(&#171;now()&#187;);\u0412\u0440\u0435\u043c\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u0431\u0430\u0437\u0430: \u0443 \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043e\u0434\u043d\u0438 \u0447\u0430\u0441\u044b, \u0438 \u044d\u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0435\u0434\u0435\u0442 \u0438 \u0432 WAL, \u0438 \u0432 \u043a\u043e\u043d\u0432\u0435\u0440\u0442 Debezium.CDC-\u0437\u0432\u0435\u043d\u043e\u041e\u0431\u0430 CDC-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u2014 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 Debezium Server, \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a.debezium.source.plugin.name=pgoutput            # \u0442\u043e \u0436\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0443 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044fdebezium.source.publication.name=load_test_pub  # \u0442\u0430 \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044fdebezium.source.snapshot.mode=no_data           # \u043c\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0442\u043e\u043a, \u0430 \u043d\u0435 initial loaddebezium.source.skipped.operations=t,u,d        # \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0435\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e insertdebezium.source.max.batch.size=8192debezium.source.max.queue.size=32768debezium.source.poll.interval.ms=100debezium.source.offset.storage=&#8230;MemoryOffsetBackingStoredebezium.source.slot.drop.on.stop=truedebezium.format.value.schemas.enable=false      # \u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b: \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0430\u0439\u0442 \u0438 CPUdebezium.sink.kafka.producer.acks=alldebezium.sink.kafka.producer.linger.ms=10\u041d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b compression.type \u0438 batch.size \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u2014 \u0442\u044e\u043d\u0438\u043d\u0433 \u0441\u0436\u0430\u0442\u0438\u044f \u043c\u043e\u0433 \u0431\u044b \u043e\u0442\u044a\u0435\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u044b\u0432\u0430, \u0438 \u044d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430. \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 slot.drop.on.stop \u2014 \u0440\u0430\u0434\u0438 \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432, \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f.Postgres &#8212; Debezium Server &#8212; \u0411\u0440\u043e\u043a\u0435\u0440\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c Kafka\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0438\u0434 \u2014 \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0437\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e:var result = consumer.Consume(ct);var message = DebeziumEnvelope.ReadMessage(result.Message.Value);await web.Work.PostAsJsonAsync(&#171;\/send-email&#187;, message, ct);consumer.StoreOffset(result);          \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044bnew ConsumerConfig{    GroupId = $&#187;{Name}-{Guid.NewGuid():N}&#187;,   \/\/ \u0441\u0432\u043e\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d: \u0447\u0443\u0436\u0438\u0435 \u043e\u0444\u0444\u0441\u0435\u0442\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u044b    AutoOffsetReset = AutoOffsetReset.Earliest,    EnableAutoCommit = true,    EnableAutoOffsetStore = false,            \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0441\u0430\u043c\u0438    PartitionAssignmentStrategy = PartitionAssignmentStrategy.CooperativeSticky,}\u041f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u0432\u0434\u0432\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0433\u0440\u0443\u043f\u043f\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d: \u0438\u043c\u0435\u043d\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u0435\u043b\u0438\u0442 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e.\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c RabbitMQ\u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0443\u0448\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430 \u0436\u0438\u0432\u0451\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438:consumer.ReceivedAsync += async (_, delivery) =&gt;{    var message = DebeziumEnvelope.ReadMessage(delivery.Body);    await web.Work.PostAsJsonAsync(&#171;\/send-email&#187;, message, ct);    await channel.BasicAckAsync(delivery.DeliveryTag, multiple: false, ct);};await channel.BasicQosAsync(prefetchSize: 0, prefetchCount: 1000, global: false);await channel.BasicConsumeAsync(queue, autoAck: false, consumer);\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043d\u043e\u0432\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u043c\u0443. Prefetch 1000 \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 Kafka, \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0440\u043e\u043a\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e.\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438\u0417\u0434\u0435\u0441\u044c \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043d\u0435\u0442, \u0438 \u044d\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0451: \u0441\u043b\u043e\u0442 \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u0438\u0434\u044f\u0442 \u0432\u0441\u0435 N \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439.await using var conn = new LogicalReplicationConnection(connectionString);await conn.Open(ct);var slot = new PgOutputReplicationSlot($&#187;load_test_slot_{reader}&#187;);   \/\/ \u0441\u0432\u043e\u0439 \u0441\u043b\u043e\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044fvar options = new PgOutputReplicationOptions(&#171;load_test_pub&#187;, PgOutputProtocolVersion.V4, binary: true);await foreach (var walMessage in conn.StartReplication(slot, options, ct)){    if (walMessage is InsertMessage insert)    {        var message = await ReadRowAsync(insert, ct);        if (await TryClaimAsync(walMessage.WalEnd, slotName, ct))      \/\/ \u0440\u0430\u0437\u044b\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443            await web.Work.PostAsJsonAsync(&#171;\/send-email&#187;, message, ct);    }    conn.SetReplicationStatus(walMessage.WalEnd);   \/\/ \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 Begin\/Relation\/Commit\/keep-alive    await conn.SendStatusUpdate(ct);}\u041f\u043e\u0437\u0438\u0446\u0438\u044e \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0438 \u043d\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445: \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043d\u0438\u043c \u043d\u0435\u0442, \u043d\u043e \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0431\u0430\u0437\u0435 \u0447\u0438\u0441\u0442\u0438\u0442\u044c WAL.\u0420\u043e\u0437\u044b\u0433\u0440\u044b\u0448 \u2014 \u043e\u0434\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u043e\u0431\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443: \u043a\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u043b, \u0442\u043e\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.insert into inbox_wal (wal, slot) values ($1, $2)on conflict do nothingreturning wal                          &#8212; \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c: \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0448\u0430; \u043f\u0443\u0441\u0442\u043e &#8212; \u0435\u0451 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043e\u0441\u0435\u0434\u0411\u0440\u043e\u043a\u0435\u0440\u043d\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c \u0442\u0430\u043a\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430: \u0442\u0430\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044e \u0437\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0440\u0435\u0448\u0438\u043b \u0431\u0440\u043e\u043a\u0435\u0440. \u0412 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u0440\u0431\u0438\u0442\u0440, \u0438 \u0431\u0435\u0437 \u043d\u0435\u0451 N \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0443 N \u0440\u0430\u0437. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 inbox_wal \u043d\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0447\u0435\u043c\u0443.\u0421\u0442\u0440\u043e\u043a\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a:switch (columns[i].ColumnName){    case &#171;id&#187;: message.Id = await value.Get&lt;int&gt;(ct); break;    case &#171;content&#187;: message.Content = await value.Get&lt;string&gt;(ct); break;    case &#171;created_at&#187;: message.CreatedAt = await value.Get&lt;DateTime&gt;(ct); break;}\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u2014 \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438 \u044d\u0442\u043e \u201c\u0446\u0435\u043d\u0430\u201d \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u0430 \u043d\u0435 \u0434\u0435\u0442\u0430\u043b\u044c.\u0427\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438KafkaRabbitMQ quorum\u043f\u0440\u044f\u043c\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 WAL\u041a\u0442\u043e \u0434\u0435\u043b\u0438\u0442 \u043f\u043e\u0442\u043e\u043a\u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b\u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438\u043d\u0438\u043a\u0442\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0438\u0434\u0438\u0442 \u0432\u0441\u0451\u041c\u043e\u0434\u0435\u043b\u044c \u0447\u0442\u0435\u043d\u0438\u044f\u043f\u0443\u043b\u043b, Consume(timeout)\u043f\u0443\u0448, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438\u043f\u0443\u043b\u043b, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430\u041a\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043e\u0434\u043d\u043e\u043c\u0443\u043e\u0434\u043d\u043e\u043c\u0443\u0432\u0441\u0435\u043c\u041d\u0443\u0436\u0435\u043d \u043b\u0438 \u0430\u0440\u0431\u0438\u0442\u0440\u043d\u0435\u0442\u043d\u0435\u0442\u0434\u0430, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 inbox_wal\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435StoreOffset, \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443basic.ack \u043f\u043e delivery tagSetReplicationStatus + SendStatusUpdate\u041b\u0438\u0448\u043d\u0435\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435\u043d\u0435-insert \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0443\u043d\u0435-insert \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0443Begin \/ Relation \/ Commit \/ keep-alive\u201c\u041f\u043e\u043b\u0435\u0437\u043d\u0430\u044f\u201d \u0440\u0430\u0431\u043e\u0442\u0430app.MapPost(&#171;\/send-email&#187;, async (Message message, LoadStats stats) =&gt;{    stats.Work(message.Id);    await Task.Yield();    return Results.Accepted();});\u041d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439. \u0412\u0441\u044f \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u2014 HTTP-\u0445\u043e\u043f (\u043e\u043a\u043e\u043b\u043e 0.3 \u043c\u0441); stats.Work \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 id \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u0430.\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0431\u043e\u043a\u0441\u0412\u0441\u0435 \u0442\u0440\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0434\u0430\u044e\u0442 at-least-once: Kafka \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043f\u0438\u043a \u043e\u0442 \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0444\u0444\u0441\u0435\u0442\u0430, RabbitMQ \u043f\u0435\u0440\u0435\u0432\u044b\u0434\u0430\u0451\u0442 \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u043e\u0435, \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0436\u0443\u0440\u043d\u0430\u043b \u043e\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u043e\u0433\u043e LSN. \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e HTTP-\u0432\u044b\u0437\u043e\u0432 \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0436\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u00ab\u0432\u0437\u044f\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0443\u00bb \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u044b.\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u043d\u0431\u043e\u043a\u0441\u043e\u043c: \u0435\u0441\u043b\u0438 \u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043d\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u2014 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0441 upsert, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u2014 \u0442\u043e \u044d\u0442\u0430 \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0433\u0434\u0435 \u043f\u043e\u0432\u0442\u043e\u0440 \u043e\u0442\u043b\u0438\u0447\u0438\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.\u0418\u043d\u0431\u043e\u043a\u0441 \u0434\u043b\u044f Kafka \u0438 RabbitMQ\u041a\u043b\u044e\u0447 \u2014 id \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u2014 \u0438\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f:with claimed as (    insert into inbox (id, consumer) values ($1, $2)    on conflict do nothing    returning id)select id from claimed                        &#8212; \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441: \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0448\u0430union allselect id from inboxwhere id = $1 and consumer = $2                &#8212; \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u0443\u0436\u0435 \u043d\u0430\u0448\u0430:&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-500457","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500457","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=500457"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500457\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}