{"id":482148,"date":"2026-06-02T17:44:39","date_gmt":"2026-06-02T17:44:39","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482148"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482148","title":{"rendered":"redb.Route \u0438\u0437\u043d\u0443\u0442\u0440\u0438: \u0447\u0435\u0442\u044b\u0440\u0435 in-memory \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 Exchange, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0445 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb6\/e39\/c04\/eb6e39c04daf113bceeba2b3fb8344c8.png\" alt=\"exchange\" title=\"exchange\" width=\"629\" height=\"717\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eb6\/e39\/c04\/eb6e39c04daf113bceeba2b3fb8344c8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb6\/e39\/c04\/eb6e39c04daf113bceeba2b3fb8344c8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>exchange<\/figcaption><\/div>\n<\/figure>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042392\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0448\u043b\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a>\u00a0\u0431\u044b\u043b\u0430 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u2014 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 redb.Route, \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0439 Apache Camel \u043f\u043e\u0434 .NET, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u0435\u0432\u043e\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0447\u0438\u0442\u0430\u043b\u0438, \u043a\u043e\u0440\u043e\u0442\u043a\u043e: \u044d\u0442\u043e fluent C# DSL \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u2014\u00a0<strong>22 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430<\/strong>\u00a0(~30 URI-\u0441\u0445\u0435\u043c, \u0435\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u00a0<code>https<\/code>\/<code>wss<\/code>\/<code>es<\/code>-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b),\u00a0<strong>~30 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 EIP<\/strong>\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437\u00a0<strong>41 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440<\/strong>,\u00a0<strong>8 in-process \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/strong>, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 expression-\u0434\u0432\u0438\u0436\u043e\u043a. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u044c. \u041d\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0447, \u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440.<\/p>\n<p>\u0421\u0435\u0440\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u0427\u0430\u0441\u0442\u044c 1 (\u044d\u0442\u0430)<\/strong>\u00a0\u2014 \u0447\u0435\u0442\u044b\u0440\u0435 in-process \u043a\u0430\u043d\u0430\u043b\u0430 +\u00a0<code>Exchange<\/code>. \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0430\u0441\u0442\u044c 2<\/strong>\u00a0\u2014\u00a0<code>Splitter<\/code>\u00a0+\u00a0<code>Aggregator<\/code>: \u043e\u0434\u0438\u043d exchange \u2192 \u043c\u043d\u043e\u0433\u043e \u2192 \u043e\u0434\u0438\u043d, \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u043e\u043c \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0430\u0441\u0442\u0438 3\u20135<\/strong>\u00a0\u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b EIP: \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0430\u0441\u0442\u044c 6<\/strong>\u00a0\u2014 expression-\u0434\u0432\u0438\u0436\u043e\u043a: \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043c\u0438\u043d\u0438-\u044f\u0437\u044b\u043a \u0441 Tokenizer \u2192 Parser \u2192 AST \u2192\u00a0<code>IL<\/code>, ~22 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, 17 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0430\u0441\u0442\u0438 7+<\/strong>\u00a0\u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0443 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044e, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430 \u2014 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0437 \u0447\u0430\u0441\u0442\u0438 3\u20135, \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0447\u0430\u0441\u0442\u0438 6 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0447\u0430\u0441\u0442\u0438 7+ \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0435\u0449\u0430\u0445:\u00a0<strong>\u043a\u0430\u043d\u0430\u043b\u0435<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0441\u0451\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u0438\u00a0<code><strong>Exchange<\/strong><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0420\u0430\u0437\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0441 \u043d\u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014 \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0440\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f. \u041e\u0448\u0438\u0431\u0438\u0442\u0435\u0441\u044c \u2014 \u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0447\u0430\u0441 \u0438\u0441\u043a\u0430\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0442\u0438\u0445\u043e \u043d\u0435 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0430\u0441\u044c.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041b\u044e\u0431\u043e\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u2014 \u044d\u0442\u043e\u00a0<code>From \u2192 [\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b] \u2192 To<\/code>. \u041c\u0435\u0436\u0434\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0447\u0442\u043e-\u0442\u043e \u00ab\u0442\u0435\u0447\u0451\u0442\u00bb, \u0438 \u0442\u0435\u0447\u0451\u0442 \u043e\u043d\u043e \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c. \u041a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0447\u0435\u0442\u044b\u0440\u0435:\u00a0<code>direct<\/code>,\u00a0<code>direct-vm<\/code>,\u00a0<code>seda<\/code>,\u00a0<code>vm<\/code>. \u0410 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e \u043d\u0438\u043c \u0442\u0435\u0447\u0451\u0442, \u2014 \u044d\u0442\u043e\u00a0<code>Exchange<\/code>. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441 \u0442\u0435\u043c,\u00a0<em>\u0447\u0442\u043e<\/em>\u00a0\u0442\u0435\u0447\u0451\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441 \u0442\u0435\u043c,\u00a0<em>\u043f\u043e \u0447\u0435\u043c\u0443<\/em>.<\/p>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430: \u044f \u0437\u0430\u043b\u0435\u0437 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u043d\u0430\u0448\u0451\u043b \u0442\u0430\u043c \u043f\u0430\u0440\u0443 \u043c\u0435\u0441\u0442, \u0433\u0434\u0435 XML-doc-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442\u0441\u0442\u0430\u043b \u043e\u0442 \u043a\u043e\u0434\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f: redb.Route \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Camel \u2014 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u00a0<code>Exchange<\/code>, \u0438 doc-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u043e\u0439 \u0436\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u0439 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435. \u041f\u043e\u0437\u0436\u0435 Apache Camel \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 3 \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u043b (\u0437\u0430\u0434\u0435\u043f\u0440\u0435\u043a\u0435\u0439\u0442\u0438\u043b\u00a0<code>getOut()<\/code>\/<code>setOut()<\/code>, \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u043b \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432) \u2014 \u0438 \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0430 \u0437\u0430 \u044d\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0438\u0435\u043c. \u0422\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/p>\n<hr\/>\n<h3>Exchange \u2014 \u0441\u0435\u0440\u0434\u0446\u0435, \u0438 \u043e\u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0435<\/h3>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443, \u2014 \u044d\u0442\u043e\u00a0<code>IExchange<\/code>. \u041d\u0435\u00a0<code>byte[]<\/code>, \u043d\u0435 \u0432\u0430\u0448 DTO, \u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e. \u0412\u043e\u0442 \u0444\u043e\u0440\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0430\u0436\u043d\u0430:<\/p>\n<pre><code>public interface IExchange : IAsyncDisposable{    IMessage  In  { get; set; }     \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430    IMessage? Out { get; set; }     \/\/ \u043e\u0442\u0432\u0435\u0442 \u2014 \u043b\u0435\u043d\u0438\u0432\u044b\u0439, null \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f    ExchangePattern Pattern { get; set; }   \/\/ InOnly (default), InOut \u0438\u043b\u0438 OutOnly    IDictionary&lt;string, object?&gt; Properties { get; }   \/\/ \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430    Exception? Exception { get; set; }                 \/\/ \u043e\u0448\u0438\u0431\u043a\u0430, in-band    bool ExceptionHandled { get; set; }    string ExchangeId { get; }                         \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435    IExchange Clone();                                 \/\/ \u043a\u043e\u043f\u0438\u044f + \u041d\u041e\u0412\u042b\u0419 DI-scope    IServiceProvider? ServiceProvider { get; }         \/\/ DI-scope \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d \u043d\u0435\u0441\u0451\u0442:<\/p>\n<pre><code>public interface IMessage{    object? Body { get; set; }                        \/\/ \u0432\u0430\u0448 payload \u2014 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 null    string? ContentType { get; set; }    IDictionary&lt;string, object?&gt; Headers { get; }     \/\/ \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0423\u0425\u041e\u0414\u042f\u0422 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440    T? GetHeader&lt;T&gt;(string key);    IMessage Clone();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u044f\u0442\u044c \u0432\u0435\u0449\u0435\u0439 \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0438 \u0432\u0441\u0435\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432. \u0418 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0442\u0438\u043f\u0430.<\/p>\n<h4>1.\u00a0In\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0Out\u00a0\u0438\u00a0Pattern<\/h4>\n<p><code>In<\/code>\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0434\u0451\u0442 \u043f\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443.\u00a0<code>Out<\/code>\u00a0\u2014 \u043e\u0442\u0432\u0435\u0442, \u0438 \u043e\u043d\u00a0<strong>\u043b\u0435\u043d\u0438\u0432\u044b\u0439<\/strong>: \u0434\u043b\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u00a0<code>InOnly<\/code>\u00a0\u043e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f\u00a0<code>null<\/code>\u00a0\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041e\u043d \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0435\u0433\u043e \u044f\u0432\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b (request\/reply \u0438\u043b\u0438\u00a0<code>.Respond()<\/code>).<\/p>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432\u00a0<strong>\u0442\u0440\u0438<\/strong>, \u0430 \u043d\u0435 \u0434\u0432\u0430 \u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c Apache Camel 2.x, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043d\u043d\u0430\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c:<\/p>\n<pre><code>public enum ExchangePattern{    InOnly  = 0,   \/\/ fire-and-forget. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 In; Out \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f null. (default)    InOut   = 1,   \/\/ request\/reply. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u043b\u0435\u0436\u0438\u0442 \u0432 In, \u043e\u0442\u0432\u0435\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 Out.    OutOnly = 2,   \/\/ \u044f\u0432\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 .Respond(); RPC-\u043e\u0442\u0432\u0435\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 Out.}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043f\u0440\u044f\u0447\u0435\u0442, \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f:\u00a0<code><strong>HasOut<\/strong><\/code><strong>\u00a0\u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0432\u0430\u043c, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043e\u0442\u0432\u0435\u0442.<\/strong>\u00a0\u0414\u0430\u0436\u0435 \u043d\u0430\u00a0<code>InOut<\/code>-\u043e\u0431\u043c\u0435\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u00a0<code>Out<\/code>\u00a0\u2014 \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u00a0<code>In.Body<\/code>, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u0435\u0436\u0438\u0442 \u0432\u00a0<code>In<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u00a0<code>HasOut<\/code>\u00a0\u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u041e\u043d \u0447\u0438\u0442\u0430\u0435\u0442\u00a0<code><strong>Out ?? In<\/strong><\/code>, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437:<\/p>\n<pre><code>\/\/ ProducerTemplate.RequestBody \u2014 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430exchange.Pattern = ExchangePattern.InOut;await producer.Process(exchange);return exchange.Out?.Body ?? exchange.In.Body;   \/\/ Out \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 In<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u0442\u043e, \u043a\u0430\u043a\u00a0<code>ProducerTemplate<\/code>\u00a0\u0432 Camel \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (<code>getResultMessage<\/code>: \u00ab\u0435\u0441\u0442\u044c Out \u2192 \u0431\u0435\u0440\u0451\u043c Out, \u0438\u043d\u0430\u0447\u0435 In\u00bb). \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043a \u0441\u0435\u0431\u0435 \u0432 \u043a\u043e\u0434 \u2014\u00a0<code>exchange.Out ?? <\/code><a href=\"http:\/\/exchange.In\" rel=\"noopener noreferrer nofollow\"><code>exchange.In<\/code><\/a>\u00a0\u2014 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u0445\u043e \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432\u00a0<code>In<\/code>.\u00a0<code>HasOut<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0444\u0430\u043a\u0442 \u043f\u0440\u043e\u00a0<em>\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e<\/em>, \u0430 \u043d\u0435 \u043f\u0440\u043e \u0442\u043e,\u00a0<em>\u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/em>; \u043d\u0435 \u0432\u0435\u0442\u0432\u0438\u0442\u0435\u0441\u044c \u043f\u043e \u043d\u0435\u043c\u0443 \u043d\u0430 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0418 \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0438\u0448\u0451\u043b \u0441 JVM: \u0436\u0438\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u00a0<code>Out<\/code>\u00a0\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u00a0<code>OutOnly<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<strong>\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 Camel 2.x<\/strong>. \u0412 Camel 3+\u00a0<code>getOut()<\/code>\/<code>setOut()<\/code>\u00a0\u0437\u0430\u0434\u0435\u043f\u0440\u0435\u043a\u0435\u0439\u0442\u0438\u043b\u0438 \u0438 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u043b\u0438 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443\u00a0<code>InOnly<\/code>\/<code>InOut<\/code>\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435\u00a0<code>Out<\/code>-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043f\u043b\u043e\u0434\u0438\u043b\u043e \u0442\u043e\u043d\u043a\u0438\u0435 \u0431\u0430\u0433\u0438. redb.Route \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c 2.x \u2014 \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0437 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Camel, \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0431\u0440\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430.<\/p>\n<h4>2.\u00a0Properties\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0Headers\u00a0\u2014 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0442\u0435\u043a\u0430\u044e\u0442 \u0431\u0430\u0433\u0438<\/h4>\n<p>\u041e\u0431\u0430 \u2014\u00a0<code>IDictionary&lt;string, object?&gt;<\/code>. \u0418 \u043e\u043d\u0438\u00a0<strong>\u043d\u0435<\/strong>\u00a0\u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p><code><strong>In.Headers<\/strong><\/code>\u00a0\u0443\u0435\u0437\u0436\u0430\u044e\u0442\u00a0<strong>\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0432 \u0431\u0440\u043e\u043a\u0435\u0440.<\/strong>\u00a0\u041f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0441\u044e\u0434\u0430\u00a0<code>correlationId<\/code>\u00a0\u2014 Kafka\/RabbitMQ \u0443\u043d\u0435\u0441\u0443\u0442 \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/exchange.Properties\" rel=\"noopener noreferrer nofollow\"><code><strong>exchange.Properties<\/strong><\/code><\/a>\u00a0\u2014 \u044d\u0442\u043e\u00a0<strong>\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430<\/strong>:\u00a0<code>RouteId<\/code>, \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0432\u0430\u0448\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041e\u043d\u0438\u00a0<strong>\u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/strong>\u00a0(XML-doc \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0442\u0430\u043a \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442:\u00a0<em>\u00abDoes NOT travel to brokers \u2014 use In.Headers for that\u00bb<\/em>). \u0421\u044e\u0434\u0430 \u043a\u043b\u0430\u0434\u0443\u0442 \u0445\u044d\u043d\u0434\u043b\u00a0<code>DbContext<\/code>\u00a0\u0438\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0435\u0442\u0440\u0430\u0435\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0432 \u0442\u043e\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u2014 \u0438 \u043e\u043d\u043e \u043b\u0438\u0431\u043e \u043d\u0435 \u0434\u043e\u0435\u0434\u0435\u0442 \u0434\u043e \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Properties), \u043b\u0438\u0431\u043e \u0443\u0442\u0435\u0447\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0440\u0443\u0436\u0443, \u0432 \u0431\u0440\u043e\u043a\u0435\u0440 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Headers). \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0439\u043c\u0430\u0435\u0442: \u043e\u0431\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e string-\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0438. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e, \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0443\u043c\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c.<\/p>\n<p>\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u043a\u0441\u0435\u0441\u0441\u043e\u0440\u044b, \u0430 \u043d\u0435 \u043a\u0430\u0441\u0442\u0443\u044f \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<pre><code>var attempt = exchange.GetProperty&lt;int&gt;(\"retryCount\");        \/\/ \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435var corr    = exchange.In.GetHeader&lt;string&gt;(\"correlationId\"); \/\/ \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u0438\u0448\u0435\u0442 \u0441\u0430\u043c<\/h3>\n<p>\u042d\u0442\u043e \u0442\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c, \u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u0430 \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435\u00a0<em>\u043b\u0435\u0436\u0438\u0442<\/em>\u00a0\u0432 Properties?\u00bb. Pipeline \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f exchange \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439. \u0415\u0434\u0438\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u00a0<code>ExchangeProperties<\/code>\u00a0\u043d\u0435\u0442 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u0436\u0438\u0432\u0451\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442, \u2014 \u043d\u043e \u0432\u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440, \u0434\u043e\u0431\u044b\u0442\u044b\u0439 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432.<\/p>\n<p><a href=\"http:\/\/exchange.Properties\" rel=\"noopener noreferrer nofollow\"><code><strong>exchange.Properties<\/strong><\/code><\/a><strong>\u00a0\u2014 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441:<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043b\u044e\u0447<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432 \u043a\u043e\u0434\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u0442\u043e \u043f\u0438\u0448\u0435\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u043c\u044b\u0441\u043b<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>TRANSACT_ACTION<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>TransactedProcessor.TransactActionPropertyKey<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>.Transacted()<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0435\u043a transacted-\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>TRANSACTION_SCOPE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>BeginTransactionProcessor.ScopePropertyKey<\/code>\u00a0(internal)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>.Transaction()<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0436\u0438\u0432\u043e\u0439\u00a0<code>TransactionScope<\/code>\u00a0\u0431\u043b\u043e\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CamelDuplicateMessage<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>IdempotentConsumerProcessor.DuplicatePropertyKey<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Idempotent Consumer<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>true<\/code>, \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ClaimCheck.Stack<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ClaimCheckHeaders.StackPropertyKey<\/code>\u00a0(internal)<\/p>\n<\/td>\n<td>\n<p align=\"left\">Claim Check<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0435\u043a \u043a\u043b\u044e\u0447\u0435\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e payload&#8217;\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ValidationErrors<\/code>\u00a0\/\u00a0<code>ValidationResult<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ValidateProcessor.*Property<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>.Validate()<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e exchange<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CamelSplitSize<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 (streaming splitter)<\/p>\n<\/td>\n<td>\n<p align=\"left\">streaming Splitter<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u043f\u043b\u0438\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>__redb_scope:*<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 (\u043f\u0440\u0435\u0444\u0438\u043a\u0441)<\/p>\n<\/td>\n<td>\n<p align=\"left\">DI-\u043e\u0431\u0432\u044f\u0437\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 DI-scope&#8217;\u044b, \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f\u00a0<code>ReleaseScopes()<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043b\u044e\u0441\u00a0<code>RouteId<\/code>\u00a0\u043f\u043e\u0434\u043d\u044f\u0442 \u0434\u043e\u00a0<strong>first-class \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/strong>\u00a0\u043d\u0430 \u0441\u0430\u043c\u043e\u043c exchange (<code>exchange.RouteId<\/code>), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043b\u043e\u0433\u0433\u0435\u0440 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043a\u0430\u043a\u00a0<code>[rId:\u2026]<\/code>.<\/p>\n<p><code><strong>In.Headers<\/strong><\/code><strong>\u00a0\u2014 \u0443\u0435\u0437\u0436\u0430\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:<\/strong><\/p>\n<p>Camel-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u0438\u0440\u0430, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 Camel. Splitter, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0448\u0442\u0430\u043c\u043f\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0447\u0430\u0441\u0442\u044c:<\/p>\n<pre><code>\/\/ SplitterProcessor \u2014 \u043a\u0430\u0436\u0434\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043f\u043b\u0438\u0442\u0430 \u043d\u0435\u0441\u0451\u0442 \u0441\u0432\u043e\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044bsplitMessage.Headers[\"CamelSplitIndex\"]    = index;          \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0441 \u043d\u0443\u043b\u044fsplitMessage.Headers[\"CamelSplitSize\"]     = total;          \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u0447\u043a\u0438splitMessage.Headers[\"CamelSplitComplete\"] = index == total - 1; \/\/ \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 namespaced-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u2014\u00a0<code>KafkaHeaders<\/code>\u00a0(<code>redbKafka.Topic<\/code>,\u00a0<code>redbKafka.Partition<\/code>,\u00a0<code>redbKafka.Offset<\/code>, \u2026),\u00a0<code>SqlHeaders<\/code>\u00a0(<code>redbSql.rowCount<\/code>,\u00a0<code>redbSql.generatedKeys<\/code>, \u2026),\u00a0<code>SignalRHeaders<\/code>\u00a0(<code>redbSignalR.ConnectionId<\/code>, \u2026),\u00a0<code>TcpHeaders<\/code>,\u00a0<code>WsHeaders<\/code>,\u00a0<code>ElasticsearchHeaders<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u2014 \u044d\u0442\u043e\u00a0<code>static class<\/code>\u00a0\u0438\u0437\u00a0<code>public const string<\/code>, \u0447\u0442\u043e\u0431\u044b \u0431\u0438\u043d\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u00a0<code>KafkaHeaders.Offset<\/code>, \u0430 \u043d\u0435 \u043d\u0430 stringly-typed\u00a0<code>\"redbKafka.Offset\"<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c\u0441\u044f. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435: \u0432\u0441\u0451 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c\u00a0<code>Camel*<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>redb&lt;Transport&gt;.*<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (\u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440); \u0432\u0441\u0451 \u0432\u00a0<code>Properties<\/code>\u00a0\u2014 \u0432\u0430\u0448\u0435 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<h4>3. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0435\u0434\u0435\u0442\u00a0in-band<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0431\u0440\u043e\u0441\u0430\u0435\u0442, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0435\u043a \u2014 \u043e\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u00a0<code>exchange.Exception<\/code>, \u0440\u044f\u0434\u043e\u043c \u0441 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0<code>ExceptionHandled<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 dead-letter-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443 \u0432\u0435\u0442\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0442\u043e\u043c\u0443,\u00a0<em>\u043f\u043e\u0447\u0435\u043c\u0443<\/em>\u00a0\u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0430\u043b\u043e (<code>when e.Exception is TimeoutException \u2192 \u2026<\/code>), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0442\u043e\u043c\u0443,\u00a0<em>\u0447\u0442\u043e<\/em>\u00a0\u0443\u043f\u0430\u043b\u043e. \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043b\u043e\u0442\u043d\u043e \u0441\u0442\u043e\u0438\u043c \u0432 \u0432\u044b\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<h4>4.\u00a0ExchangeId\u00a0\u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 exchange \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u00a0<code>ExchangeId<\/code>\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435\u00a0<code>Guid<\/code>. \u041d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c:\u00a0<code><strong>Clone()<\/strong><\/code><strong>\u00a0\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442.<\/strong>\u00a0\u0421\u043f\u043b\u0438\u0442 \u043d\u0430 500 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438\u043b\u0438\u00a0<code>seda<\/code>-\u0445\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 exchange, \u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u0442 \u0436\u0435 id \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0433\u0438 \u0438 \u0442\u0440\u0435\u0439\u0441\u044b \u0441\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0434\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435. \u0418\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e.<\/p>\n<h4>5. DI-scope \u2014 \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c exchange<\/h4>\n<p>\u0412\u043e\u0442 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u0430\u043d\u0430\u043b\u044b \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u0435\u0434\u0443\u0442.<\/p>\n<p><code>Exchange<\/code>\u00a0\u043c\u043e\u0436\u0435\u0442 \u0432\u043b\u0430\u0434\u0435\u0442\u044c\u00a0<strong>DI-scope<\/strong>\u00a0\u2014\u00a0<code>IServiceScope<\/code>\u00a0\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0440\u0435\u0437\u043e\u043b\u0432\u044f\u0442 scoped-\u0441\u0435\u0440\u0432\u0438\u0441\u044b (<code>DbContext<\/code>,\u00a0<code>IRedbService<\/code>, \u2026) \u0438\u0437\u00a0<code>exchange.ServiceProvider<\/code>\u00a0\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u00a0<em>\u0442\u0435 \u0436\u0435<\/em>\u00a0\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u043d\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u044d\u0442\u043e\u0433\u043e exchange.\u00a0<code>TransactionScope<\/code>\u00a0\u0436\u0438\u0432\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u0432 \u044d\u0442\u043e\u043c scope. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u044d\u0442\u0438 \u0434\u0432\u0430 exchange \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438?\u00bb \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u00ab\u043e\u043d\u0438 \u0434\u0435\u043b\u044f\u0442 DI-scope?\u00bb.<\/p>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c exchange \u2014\u00a0<strong>\u0447\u0435\u0442\u044b\u0440\u0435<\/strong>, \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438\u00a0<em>\u0442\u043e\u043b\u044c\u043a\u043e<\/em>\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0441 \u044d\u0442\u0438\u043c scope:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u043e\u0434<\/p>\n<\/th>\n<th>\n<p align=\"left\">Body\/Headers<\/p>\n<\/th>\n<th>\n<p align=\"left\">DI-scope<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u043b\u0430\u0434\u0435\u0435\u0442 scope?<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u0430\u0447\u0435\u043c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>Clone()<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u043d\u043e\u0432\u044b\u0439 scope<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a (<code>seda<\/code>,\u00a0<code>vm<\/code>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CloneLinked()<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u043e\u0431\u0449\u0438\u0439 \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 fan-out \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CreateChild(msg)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u043e\u0432\u044b\u0439 scope<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 exchange, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0436\u0438\u0437\u043d\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CreateLinkedChild(msg)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u043e\u0431\u0449\u0438\u0439 \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0442\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre><code>\/\/ \u0438\u0437 Exchange.Clone() \u2014 \u0432\u0435\u0442\u043a\u0430, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0430\u044f scopeif (_scopeFactory != null){    clone._scopeFactory = _scopeFactory;    clone._scope = _scopeFactory.CreateScope();   \/\/ &lt;-- \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u043e\u0432\u044b\u0439 scope}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code>\/\/ \u0438\u0437 Exchange.CloneLinked() \u2014 \u0432\u0435\u0442\u043a\u0430, \u0434\u0435\u043b\u044f\u0449\u0430\u044f scope_ownsScope = false,_scope = _scope,            \/\/ &lt;-- \u0422\u041e\u0422 \u0416\u0415 scope, \u0438 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u0434\u0438\u0441\u043f\u043e\u0437\u0438\u043c_scopeFactory = _scopeFactory<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0412\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439\u00a0<code>seda<\/code>\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0<code>direct<\/code>, \u0438\u00a0<code>Multicast<\/code>\u00a0\u043f\u0440\u043e\u0442\u0438\u0432 \u0431\u0440\u043e\u043a\u0435\u0440\u043d\u043e\u0433\u043e \u0445\u043e\u043f\u0430, \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u00a0<em>\u043a\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430<\/em>.\u00a0<code>Clone()<\/code>\u00a0(\u043d\u043e\u0432\u044b\u0439 scope) \u2014 \u043d\u043e\u0432\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f;\u00a0<code>CloneLinked()<\/code>\u00a0(\u043e\u0431\u0449\u0438\u0439 scope) \u2014 \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0451\u00a0<code>ReleaseScopes()<\/code>\u00a0\u2014 \u043e\u043d \u0434\u0438\u0441\u043f\u043e\u0437\u0438\u0442 DI-scope&#8217;\u044b\u00a0<strong>\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f\u00a0<\/strong><code><strong>Body<\/strong><\/code>, \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u043e\u0433 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a \u0411\u0414 \u0440\u0430\u043d\u044c\u0448\u0435, \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u0435\u0440\u0436\u0430 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0410\u00a0<code>DisposeAsync()<\/code>\u00a0\u0447\u0438\u0441\u0442\u0438\u0442 \u0438 \u0442\u0435\u043b\u043e (\u0441\u0442\u0440\u0438\u043c\u044b, stream-\u043a\u044d\u0448\u0438), \u0438 scope&#8217;\u044b. \u041e\u0431\u044a\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u00a0<code>IAsyncDisposable<\/code>\u00a0\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u0438:\u00a0Clone()\u00a0\u041d\u0415 \u0434\u0435\u043b\u0430\u0435\u0442 \u0433\u043b\u0443\u0431\u043e\u043a\u0443\u044e \u043a\u043e\u043f\u0438\u044e Body<\/h4>\n<p>\u0427\u0438\u0442\u0430\u0435\u043c\u00a0<code>Message.Clone()<\/code>\u00a0\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code>public IMessage Clone(){    var clone = new Message(Body) { ContentType = ContentType };  \/\/ \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 Body \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f    foreach (var kvp in _headers)        clone._headers[kvp.Key] = kvp.Value;    return clone;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u0435\u0436\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.\u00a0<code><strong>Body<\/strong><\/code><strong>\u00a0\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.<\/strong>\u00a0\u041f\u043e\u0441\u043b\u0435\u00a0<code>seda<\/code>-\u0445\u043e\u043f\u0430 exchange \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u0438 \u043a\u043b\u043e\u043d \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, properties \u0438 DI-scope&#8217;\u044b \u2014 \u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u00a0<strong>\u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0435\u043b\u0430.<\/strong>\u00a0\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0435\u043b\u043e \u2014 \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439\u00a0<code>List&lt;T&gt;<\/code>\u00a0\u0438\u043b\u0438 POCO, \u0438 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432 \u043d\u0435\u0433\u043e \u043f\u0438\u0448\u0443\u0442, \u0443 \u0432\u0430\u0441 \u0433\u043e\u043d\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00a0<em>\u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e<\/em>\u00a0\u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u043b\u043e. XML-doc \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u00abdeep copy\u00bb \u2014 \u043f\u0438\u0441\u0430\u043b\u0438 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e Camel \u0432 \u0433\u043e\u043b\u043e\u0432\u0435, \u0433\u0434\u0435 \u044d\u0442\u043e \u0437\u0432\u0443\u0447\u0430\u043b\u043e \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e; \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u0430\u0432\u0434\u0430 \u2014 \u00abdeep copy \u0432\u0441\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 payload&#8217;\u0430\u00bb. \u0421\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0435\u043b\u043e \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c, \u043f\u043e\u043a\u0430 \u043e\u043d\u043e \u0432 \u043f\u043e\u043b\u0451\u0442\u0435, \u0438\u043b\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u0441\u0430\u043c\u0438.<\/p>\n<h4>\u0414\u0432\u0430 API \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435 \u0432 IntelliSense: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u043b\u0435\u043d\u0430 \u0435\u0441\u0442\u044c C#-\u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 (<code>In<\/code>,\u00a0<code>Body<\/code>,\u00a0<code>GetHeader&lt;T&gt;<\/code>) \u0438 Java-style \u0430\u043b\u0438\u0430\u0441 (<code>getIn()<\/code>,\u00a0<code>setBody()<\/code>,\u00a0<code>getHeader&lt;T&gt;()<\/code>). \u042d\u0442\u043e default interface methods \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a Apache Camel, \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0438\u0448\u0451\u043b \u0441 JVM. \u041f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043b\u044e\u0431\u044b\u043c \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u2014 \u043a\u0430\u043d\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0435\u0441\u0443\u0442.<\/p>\n<hr\/>\n<h3>\u0427\u0435\u0442\u044b\u0440\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 \u2014 \u0434\u0432\u0435 \u043e\u0441\u0438<\/h3>\n<p><code>direct<\/code>,\u00a0<code>direct-vm<\/code>,\u00a0<code>seda<\/code>,\u00a0<code>vm<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c\u00a0<em>\u0432\u043d\u0443\u0442\u0440\u0438<\/em>\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u2014 \u0441\u0430\u043c\u043e\u0435 \u0447\u0430\u0441\u0442\u043e\u0435, \u0447\u0442\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043b\u044f\u00a0<em>\u043f\u043e\u0447\u0435\u043c\u0443<\/em>: \u0432\u0441\u0451 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u0438 scope. \u041e\u043d\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0434\u0432\u0443\u043c \u043e\u0441\u044f\u043c \u2014\u00a0<strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439\/\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439<\/strong>\u00a0\u0438\u00a0<strong>\u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\/\u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438<\/strong>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0421\u0445\u0435\u043c\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">Sync\/Async<\/p>\n<\/th>\n<th>\n<p align=\"left\">Scope<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 exchange?<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0430 \u0436\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f?<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>direct:\/\/<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0434\u0430<\/strong>\u00a0\u2014 \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0442\u043e\u043a, \u0442\u043e\u0442 \u0436\u0435 scope<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>direct-vm:\/\/<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>seda:\/\/<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0434\u0430<\/strong>\u00a0(<code>Clone()<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u043d\u0435\u0442<\/strong>\u00a0\u2014 \u043d\u043e\u0432\u044b\u0439 scope<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>vm:\/\/<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>direct<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442. \u0410\u00a0<code>seda<\/code>\u00a0\u2014 \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043d\u0451\u043c \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u043c\u0441\u044f.<\/p>\n<hr\/>\n<h3>direct:\/\/\u00a0\u2014 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0430\u0434\u0435\u0432\u0448\u0438\u0439 URI<\/h3>\n<p><code>direct<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041d\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u0438 \u0431\u0443\u0444\u0435\u0440\u0430. \u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0432\u00a0<code>direct<\/code>-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430\u00a0<strong>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435<\/strong>:<\/p>\n<pre><code>\/\/ \u0432\u0435\u0441\u044c DirectProducer.Process \u0446\u0435\u043b\u0438\u043a\u043e\u043cvar processor = _endpoint.ConsumerProcessor    ?? throw new InvalidOperationException(\"No consumer registered for direct endpoint ...\");await processor.Process(exchange, ct);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Exchange\u00a0<strong>\u043d\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/strong>. \u0422\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0442\u043e\u043a, \u0442\u043e\u0442 \u0436\u0435 DI-scope \u2014 \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u043a \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0443. \u041e\u0442\u0441\u044e\u0434\u0430 \u0442\u0440\u0438 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><strong>\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443.<\/strong>\u00a0Throw \u0432\u00a0<code>direct<\/code>-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0435 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0432 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0435 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430, \u0433\u0434\u0435 \u0435\u0433\u043e \u043b\u043e\u0432\u0438\u0442\u00a0<code>OnException<\/code>\/<code>DoTry<\/code>. (\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u00a73 \u2014 \u043e\u043d\u043e \u0435\u0449\u0451 \u0438 \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u00a0<code>exchange.Exception<\/code>.)<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u0442\u043e \u0442\u0430 \u0436\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f.<\/strong>\u00a0\u0422\u043e\u0442 \u0436\u0435 scope \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0<code>direct<\/code>-\u0445\u043e\u043f \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u0430\u00a0<code>.Transaction()<\/code>\u00a0\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u0441\u044f \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c \u0432\u043e\u043a\u0440\u0443\u0433.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043f\u0435\u0440\u0432\u044b\u043c<\/strong>, \u0438\u043d\u0430\u0447\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0431\u0440\u043e\u0441\u0438\u0442.\u00a0<code>direct<\/code>\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0430\u0448\u0438\u00a0<em>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432<\/em>\u00a0\u043d\u0430 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u0431-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u2014 \u043d\u043e \u043d\u0435 \u0432\u0430\u0448\u0438\u00a0<em>\u043f\u043e\u0442\u043e\u043a\u0438<\/em>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u043d\u0430\u0442\u0443\u0440\u0430\u00a0<code>direct<\/code>: zero-cost \u0432\u043d\u0443\u0442\u0440\u0438\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c URI \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0423 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u043c\u0430\u0448\u0438\u043d\u0435\u0440\u0438\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043d\u0430 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043a\u0443\u0441\u043a\u0438.<\/p>\n<hr\/>\n<h3>seda:\/\/\u00a0\u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445<\/h3>\n<p><code>seda<\/code>\u00a0(Staged Event-Driven Architecture) \u2014 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u00a0<code>direct<\/code>\u00a0\u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u042d\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f in-memory \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u00a0<code>System.Threading.Channels<\/code>. \u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u00a0<strong>\u043a\u043b\u0430\u0434\u0451\u0442 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f<\/strong>; \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0432\u044b\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445.<\/p>\n<pre><code>\/\/ SedaProducer.Process \u2014 \u0446\u0435\u043b\u0438\u043a\u043e\u043cvar copy = exchange.Clone();                       \/\/ \u00a75: \u043d\u043e\u0432\u044b\u0439 scope. \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u0436\u0438\u0432\u0451\u0442 \u0437\u0434\u0435\u0441\u044c.await _endpoint.Queue.Writer.WriteAsync(copy, ct);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u044d\u0442\u0438 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0448\u0438\u0442\u044b \u0434\u0432\u0430 \u0444\u0430\u043a\u0442\u0430, \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u00a0<code>seda<\/code>\u00a0\u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442: \u043e\u043d\u00a0<strong>\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442<\/strong>\u00a0(\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0440\u043a\u0435\u0440 \u0438 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u044f\u0442 scope \u2014 \u044d\u0442\u043e\u00a0<code>Clone()<\/code>, \u0441\u0442\u0440\u043e\u043a\u0430 1 \u0442\u0430\u0431\u043b\u0438\u0446\u044b,\u00a0<em>\u043d\u043e\u0432\u044b\u0439<\/em>\u00a0scope) \u0438\u00a0<strong>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430<\/strong>\u00a0(\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u0438 \u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0435\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435).<\/p>\n<h4>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/h4>\n<p><code>seda<\/code>\u00a0\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0438, \u0432\u0441\u0435 \u0432 URI:\u00a0<code>seda:\/\/name?concurrentConsumers=4&amp;size=1000&amp;timeout=30000<\/code>.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">Default<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u0442\u044c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>concurrentConsumers<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0440\u043a\u0435\u0440-\u043f\u0435\u0442\u0435\u043b\u044c \u0432\u044b\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u043d\u044f\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043f\u0440\u0438\u0442\u043e\u043a\u0430 \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435 \u0432\u0430\u0436\u0435\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>size<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0<\/code>\u00a0(\u0431\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0430\u043a\u0441. \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.\u00a0<code>0<\/code>\u00a0= \u0440\u0430\u0441\u0442\u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u0435\u043b\u0430;\u00a0<code>&gt;0<\/code>\u00a0= \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0441\u00a0<code>Wait<\/code>-backpressure<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0441\u0435\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0433\u043e\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430 (\u0432 \u043f\u0440\u043e\u0434\u0435 \u2014 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>timeout<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>30000<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u2014\u00a0<strong>\u0441\u043c. \u0447\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u0435\u043c\u0430\u0440\u043a\u0443 \u043d\u0438\u0436\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>concurrentConsumers\u00a0\u2014 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0446\u0435\u043d\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043a\u0430<\/h4>\n<p>\u041e\u0434\u0438\u043d \u0432\u043e\u0440\u043a\u0435\u0440 \u2014 \u0434\u0435\u0444\u043e\u043b\u0442, \u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 FIFO. \u041f\u043e\u0434\u044a\u0451\u043c \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 N \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0435\u0442\u0435\u043b\u044c:<\/p>\n<pre><code>\/\/ SedaConsumer.RunAsync_workers = new Task[_options.ConcurrentConsumers];for (var i = 0; i &lt; _options.ConcurrentConsumers; i++)    _workers[i] = WorkerLoop(pollCt, processingCt);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code>\/\/ \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440await foreach (var exchange in _endpoint.Queue.Reader.ReadAllAsync(pollCt)){    await ProcessWithTracking(exchange, processingCt);    Interlocked.Increment(ref _processedCount);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0432\u0430 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e:<\/p>\n<ul>\n<li>\n<p><strong>\u0412\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c.<\/strong>\u00a0\u041f\u0440\u0438\u00a0<code>concurrentConsumers=1<\/code>\u00a0\u043a\u0430\u043d\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435\u00a0<code>SingleReader<\/code>\u00a0(\u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u00a0<code>System.Threading.Channels<\/code>), \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u041f\u0440\u0438 N&gt;1 N \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0442\u044f\u043d\u0443\u0442 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e, \u0438\u00a0<strong>\u0441\u0442\u0440\u043e\u0433\u0438\u0439 FIFO \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442<\/strong>\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 2 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f 1. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0439\u0442\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e per-endpoint \u0441\u043d\u044f\u0442\u0438\u0435 backpressure: \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0437 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0448\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0443\u0445\u043e\u0434\u0438\u0442.<\/p>\n<\/li>\n<\/ul>\n<h4>size\u00a0\u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0442\u0438\u0432 \u0431\u0435\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f<\/h4>\n<p>\u042d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0438 \u0436\u0430\u043b\u0435\u044e\u0442. \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u043e\u00a0<code>size<\/code>:<\/p>\n<pre><code>Queue = options.Size &gt; 0    ? Channel.CreateBounded&lt;IExchange&gt;(new BoundedChannelOptions(options.Size)      {          FullMode = BoundedChannelFullMode.Wait,    \/\/ \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0436\u0434\u0451\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u043b\u043e\u0442          SingleReader = options.ConcurrentConsumers == 1,          SingleWriter = false      })    : Channel.CreateUnbounded&lt;IExchange&gt;(\/* ... *\/); \/\/ \u0440\u0430\u0441\u0442\u0451\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><code><strong>size=0<\/strong><\/code><strong>\u00a0(\u0434\u0435\u0444\u043e\u043b\u0442, \u0431\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446):<\/strong>\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0441\u0442\u0451\u0442 \u0442\u0430\u043a \u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u044b \u043f\u0438\u0448\u0443\u0442. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440 \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442 \u2014 \u044d\u0442\u043e \u0443\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0448\u0430\u0433\u0430\u043c\u0438. \u041e\u043a \u0434\u043b\u044f \u0432\u0441\u043f\u043b\u0435\u0441\u043a\u043e\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0451\u043c\u043e\u043c; \u043e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f firehose.<\/p>\n<\/li>\n<li>\n<p><code><strong>size&gt;0<\/strong><\/code><strong>\u00a0(\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e):<\/strong>\u00a0<code>FullMode = Wait<\/code>\u00a0\u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u00a0<em>\u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u0436\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u043b\u043e\u0442<\/em>\u00a0\u2014 backpressure, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u043b\u043a\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0442\u0435\u0447\u0435\u043d\u0438\u044e, \u0430 \u043d\u0435 \u0432 \u0432\u0430\u0448\u0443 \u043a\u0443\u0447\u0443. \u042d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0435.<\/p>\n<\/li>\n<\/ul>\n<pre><code>\/\/ \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f SEDA: 4 \u0432\u043e\u0440\u043a\u0435\u0440\u0430, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 1000 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0436\u0434\u0451\u0442 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438From(\"seda:\/\/enrich?concurrentConsumers=4&amp;size=1000\")    .Process(async (ex, ct) =&gt; await Enrich(ex, ct))    .To(\"rabbitmq:\/\/enriched\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>timeout\u00a0\u2014 \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430<\/h4>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 \u043e\u043f\u0446\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u00a0<code>timeout<\/code>\u00a0(\u0434\u0435\u0444\u043e\u043b\u0442\u00a0<code>30000<\/code>\u00a0\u043c\u0441) \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0421\u043a\u0430\u0436\u0443 \u043f\u0440\u044f\u043c\u043e: \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u043a\u043b\u0430\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>WriteAsync(copy, ct)<\/code>\u00a0\u0438\u00a0<strong>\u043d\u0435<\/strong>\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u2014 \u043f\u043e\u043b\u043d\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430 \u0436\u0434\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0442 \u0438\u043b\u0438 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0<code>CancellationToken<\/code>, \u0430 \u043d\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442 30 \u0441\u0435\u043a\u0443\u043d\u0434. \u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u00a0<code>size<\/code>\u00a0\u0438 cancellation token; \u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435\u00a0<code>timeout<\/code>\u00a0\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c-\u043d\u043e-\u0435\u0449\u0451-\u043d\u0435-\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c \u0438 \u043d\u0435 \u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043d\u0430 \u043d\u0451\u043c \u0434\u0435\u0434\u043b\u0430\u0439\u043d-\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439. (\u041f\u043e\u043c\u0435\u0447\u0430\u044e \u044d\u0442\u043e \u0437\u0434\u0435\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043f\u043e doc-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044e \u2014 \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0434\u043e\u0435\u0437\u0436\u0430\u044e\u0442 \u0434\u043e \u0431\u0430\u0433\u0430.)<\/p>\n<h4>Graceful shutdown \u2014\u00a0seda\u00a0\u0434\u0440\u0435\u043d\u0438\u0440\u0443\u0435\u0442, \u0430 \u043d\u0435 \u0434\u0440\u043e\u043f\u0430\u0435\u0442<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f,\u00a0<code>seda<\/code>\u00a0\u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438:<\/p>\n<pre><code>\/\/ SedaConsumer.OnStopAccepting_endpoint.Queue.Writer.TryComplete();   \/\/ \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435; \u0434\u0430\u0451\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0434\u043e\u0447\u0438\u0442\u0430\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 writer&#8217;\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0442\u043b\u044e\u00a0<code>ReadAllAsync<\/code>\u00a0\u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0434\u043e\u0447\u0438\u0442\u0430\u0442\u044c\u00a0<strong>\u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f<\/strong>\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u0437\u0430\u0442\u0435\u043c \u0447\u0438\u0441\u0442\u043e \u0432\u044b\u0439\u0442\u0438 (<code>SedaConsumer<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<code>DrainableConsumer<\/code>). \u041d\u0430 graceful-\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 exchange&#8217;\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0430 \u043d\u0435 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f.<\/p>\n<h4>\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043f\u0440\u043e \u0434\u043e\u043b\u0433\u043e\u0432\u0435\u0447\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p><code>seda<\/code>\u00a0\u2014\u00a0<strong>in-memory \u0438 \u043d\u0435\u0434\u043e\u043b\u0433\u043e\u0432\u0435\u0447\u043d\u0430\u044f.<\/strong>\u00a0Graceful-\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u0440\u0435\u043d\u0438\u0440\u0443\u0435\u0442; \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 kill \u2014\u00a0<strong>\u043d\u0435\u0442<\/strong>: \u0432\u0441\u0451, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0432 \u043a\u0430\u043d\u0430\u043b\u0435, \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442.\u00a0<code>seda<\/code>\u00a0\u2014 \u044d\u0442\u043e at-most-once \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442, \u2014 \u044d\u0442\u043e \u0431\u0440\u043e\u043a\u0435\u0440 (<code>rabbitmq<\/code>,\u00a0<code>kafka<\/code>), \u0430 \u043d\u0435\u00a0<code>seda<\/code>.\u00a0<code>seda<\/code>\u00a0\u2014 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u044f\u0437\u043a\u0438\u00a0<em>\u0432\u043d\u0443\u0442\u0440\u0438<\/em>\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043d\u0435 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0432\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h4>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u00a75 \u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443\u00a0<code>seda<\/code>\u00a0\u0437\u043e\u0432\u0451\u0442\u00a0<code>Clone()<\/code>\u00a0\u2014 \u0441\u0442\u0440\u043e\u043a\u0430 1,\u00a0<strong>\u043d\u043e\u0432\u044b\u0439<\/strong>\u00a0DI-scope \u0432\u00a0<strong>\u0434\u0440\u0443\u0433\u043e\u043c<\/strong>\u00a0\u043f\u043e\u0442\u043e\u043a\u0435 \u2014\u00a0<strong>\u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u00a0<\/strong><code><strong>seda:\/\/<\/strong><\/code><strong>-\u0445\u043e\u043f\u0430, \u043d\u0435 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e.<\/strong><\/p>\n<pre><code>From(\"kafka:\/\/orders\")    .Transaction()        .To(Sql.Execute(\"INSERT \u2026\").Transacted())        .To(\"seda:\/\/post-process\")     \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u041d\u041e\u0412\u041e\u041c scope, \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435,    .EndTransaction();                 \/\/    \u0412\u041d\u0415 \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438\u00a0<code>post-process<\/code>\u00a0\u0431\u0440\u043e\u0441\u0438\u0442,\u00a0<code>INSERT<\/code>\u00a0\u0432\u044b\u0448\u0435 \u0443\u0436\u0435\u00a0<strong>\u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d<\/strong>\u00a0\u2014\u00a0<code>seda<\/code>-\u0445\u043e\u043f \u0432\u044b\u0448\u0435\u043b \u0438\u0437 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439: \u0435\u0441\u043b\u0438 \u0445\u043e\u043f \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0<code>direct<\/code>\u00a0(\u043d\u0435\u0442 \u043a\u043b\u043e\u043d\u0430, \u0442\u043e\u0442 \u0436\u0435 scope); \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u0434\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0435\u0445\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u2014\u00a0<code>seda<\/code>\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u0435\u043d, \u0438 \u0432\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443. DSL \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435; \u0432\u0441\u0451 \u0440\u0435\u0448\u0430\u0435\u0442 scope.<\/p>\n<p>\u041c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c:\u00a0<code><strong>direct<\/strong><\/code><strong>\u00a0= \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,\u00a0<\/strong><code><strong>seda<\/strong><\/code><strong>\u00a0= \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043a.<\/strong>\u00a0\u041e\u0434\u0438\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0430\u0448 \u043f\u043e\u0442\u043e\u043a \u0438 \u0432\u0430\u0448\u0443 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e; \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u0431\u0430 \u043d\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e.<\/p>\n<hr\/>\n<h3>direct-vm:\/\/\u00a0\u0438\u00a0vm:\/\/\u00a0\u2014 \u0442\u0435 \u0436\u0435 \u0434\u0432\u0430, \u043d\u043e \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438<\/h3>\n<p>\u0412 \u043c\u0443\u043b\u044c\u0442\u0438-\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0435 (\u0442\u0430\u043a redb.Tsak \u0433\u043e\u043d\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435) \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u2014 \u0441\u0432\u043e\u0439\u00a0<code>RouteContext<\/code>. \u041e\u0431\u044b\u0447\u043d\u044b\u0435\u00a0<code>direct<\/code>\u00a0\u0438\u00a0<code>seda<\/code>\u00a0\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c: \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 A \u043d\u0435 \u0432\u0438\u0434\u0438\u0442\u00a0<code>direct<\/code>-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 B. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u00a0<code>-vm<\/code>\u00a0\u0441\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u043e\u0432\u043d\u043e \u044d\u0442\u0443 \u0441\u0442\u0435\u043d\u0443, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044f \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u2014 \u0430 \u0434\u043b\u044f\u00a0<code>vm<\/code>\u00a0\u0435\u0449\u0451 \u0438 \u043a\u0430\u043d\u0430\u043b \u2014 \u0447\u0435\u0440\u0435\u0437 DI-\u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u00a0<code>SharedVmRegistry<\/code>:<\/p>\n<ul>\n<li>\n<p><code><strong>direct-vm:\/\/<\/strong><\/code>\u00a0\u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439,\u00a0<strong>\u043c\u0435\u0436\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439<\/strong>, \u0431\u0435\u0437 \u043a\u043b\u043e\u043d\u0430. \u041a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435\u00a0<code>billing<\/code>\u00a0\u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u00a0<code>direct-vm:\/\/charge<\/code>; \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0432\u00a0<code>orders<\/code>\u00a0\u0437\u043e\u0432\u0451\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0438\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<\/li>\n<li>\n<p><code><strong>vm:\/\/<\/strong><\/code>\u00a0\u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439, \u043c\u0435\u0436\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439, \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442-\u0438-\u043a\u043b\u0430\u0434\u0451\u0442-\u0432-\u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041c\u0435\u0436\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u0438\u0437\u043d\u0435\u0446\u00a0<code>seda<\/code>, \u0441\u00a0<strong>\u0442\u0435\u043c\u0438 \u0436\u0435<\/strong>\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438\u00a0<code>concurrentConsumers<\/code>\u00a0\u0438\u00a0<code>size<\/code>\u00a0(\u0438 \u0442\u0435\u043c \u0436\u0435\u00a0<code>Clone()<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u043e\u0439 \u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u043e\u0439 \u043f\u0440\u043e \u043e\u0431\u0449\u0438\u0439 Body).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u043e:\u00a0<code>direct-vm<\/code>\u00a0\u2014 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0436\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0434\u0435\u043b\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e;\u00a0<code>vm<\/code>\u00a0\u2014 \u0434\u043b\u044f \u043e\u0442\u0434\u0430\u0439-\u0438-\u0435\u0434\u044c-\u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. \u0422\u0430 \u0436\u0435 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430, \u0447\u0442\u043e \u0443 \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0438\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u0431\u043b\u0438\u0437\u043d\u0435\u0446\u043e\u0432, \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0434\u0438\u0443\u0441 \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0448\u0438\u0440\u0435.<\/p>\n<hr\/>\n<h3>\u041a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b<\/h3>\n<p>\u0412\u0441\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e\u2026<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u0430\u043d\u0430\u043b<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0441\u0443\u0431-\u043c\u0430\u0440\u0448\u0440\u0443\u0442, \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0442\u043e\u043a,\u00a0<strong>\u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>direct:\/\/<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u043e \u0436\u0435, \u043d\u043e \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440 \u0436\u0438\u0432\u0451\u0442 \u0432\u00a0<strong>\u0434\u0440\u0443\u0433\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>direct-vm:\/\/<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041e\u0442\u0434\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443<\/strong>\u00a0\u0444\u043e\u043d\u043e\u0432\u043e\u043c\u0443 \u0432\u043e\u0440\u043a\u0435\u0440\u0443 \u0438 \u043d\u0435 \u0436\u0434\u0430\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>seda:\/\/<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u043e \u0436\u0435, \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\u00a0<strong>\u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vm:\/\/<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u00a0<strong>\u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435 \u043a\u0430\u043d\u0430\u043b \u2014 \u0431\u0440\u043e\u043a\u0435\u0440 (<code>rabbitmq<\/code>,\u00a0<code>kafka<\/code>)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418 \u0434\u0432\u0430 \u0444\u0430\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0432\u0438\u0433\u0430\u044e\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:\u00a0<strong>\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043b\u0438 \u043e\u043d (\u043d\u043e\u0432\u044b\u0439 scope = \u043d\u043e\u0432\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f) \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430.<\/strong>\u00a0\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u0434\u0435\u0442\u0430\u043b\u0438.<\/p>\n<hr\/>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>\u042d\u0442\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0435\u0447\u0451\u0442 \u043f\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443 (<code>Exchange<\/code>\u00a0\u2014 In\/Out, Properties \u043f\u0440\u043e\u0442\u0438\u0432 Headers, in-band-\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 scope-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u0430\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u043d\u0435\u0441\u0443\u0442 (<code>direct<\/code>\/<code>direct-vm<\/code>\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435-\u0438-\u0432\u043d\u0443\u0442\u0440\u0438\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0435,\u00a0<code>seda<\/code>\/<code>vm<\/code>\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435-\u0438-\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435), \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442 \u0432\u0430\u0448\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c backpressure \u0438\u043b\u0438 \u0441\u044a\u0435\u0441\u0442 \u0432\u0430\u0448\u0443 \u043a\u0443\u0447\u0443.<\/p>\n<p><strong>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432 \u0441\u0435\u0440\u0438\u0438 \u2014 Splitter + Aggregator.<\/strong>\u00a0\u0420\u0430\u0437\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u043e \u043c\u043d\u043e\u0433\u043e, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u043e\u043c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u2014 \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435\u00a0<code>Clone()<\/code>\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0<code>CloneLinked()<\/code>\u00a0\u0438\u0437 \u00a75 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043e \u0442\u043e\u043c, \u0434\u0435\u043b\u0438\u0442 \u043b\u0438 \u0441\u043f\u043b\u0438\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f. \u041f\u043b\u044e\u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0430\u0433\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0430\u043c\u00a0<code>null<\/code>-\u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440. \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0441\u0442\u0430\u0442\u044c \u0432\u044b\u043f\u0443\u0441\u043a.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0441\u043f\u043e\u0440\u0438\u043b\u043e \u2014 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438\u00a0<code>seda<\/code>\u00a0\u0438\u043b\u0438 \u043e\u0431\u0449\u0438\u0439-<code>Body<\/code>-\u043a\u043b\u043e\u043d \u2014 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u042d\u0442\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u2014 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0440\u0430\u043d\u043d\u0438\u0439 OSS-\u0440\u0435\u043b\u0438\u0437 \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<hr\/>\n<h3>\u0421\u0441\u044b\u043b\u043a\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\">\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">redb.Route<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/redbase-app\/redb-route\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 GitHub<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">redb.Tsak (\u0440\u0430\u043d\u0442\u0430\u0439\u043c \/ \u043c\u0443\u043b\u044c\u0442\u0438-\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/redbase-app\/redb-tsak\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 GitHub<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">redb.Core (\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/redbase-app\/redb\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 GitHub<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/redbase-app\/redb-route\/discussions\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u0434\u0435\u043b Discussions \u043d\u0430 GitHub<\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0441\u0451 \u043f\u043e\u0434 Apache 2.0. \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u2014 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u00ab\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u0438 \u043a\u0430\u043d\u0430\u043b X \u0448\u0442\u0443\u043a\u0443 Y?\u00bb, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f.<\/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\/1042872\/\">https:\/\/habr.com\/ru\/articles\/1042872\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>exchange\u041f\u0440\u043e\u0448\u043b\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f\u00a0\u0431\u044b\u043b\u0430 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u2014 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 redb.Route, \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0439 Apache Camel \u043f\u043e\u0434 .NET, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u0435\u0432\u043e\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0447\u0438\u0442\u0430\u043b\u0438, \u043a\u043e\u0440\u043e\u0442\u043a\u043e: \u044d\u0442\u043e fluent C# DSL \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u2014\u00a022 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430\u00a0(~30 URI-\u0441\u0445\u0435\u043c, \u0435\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u00a0https\/wss\/es-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b),\u00a0~30 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 EIP\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437\u00a041 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440,\u00a08 in-process \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 expression-\u0434\u0432\u0438\u0436\u043e\u043a. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u044c. \u041d\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0447, \u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440.\u0421\u0435\u0440\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:\u0427\u0430\u0441\u0442\u044c 1 (\u044d\u0442\u0430)\u00a0\u2014 \u0447\u0435\u0442\u044b\u0440\u0435 in-process \u043a\u0430\u043d\u0430\u043b\u0430 +\u00a0Exchange. \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435.\u0427\u0430\u0441\u0442\u044c 2\u00a0\u2014\u00a0Splitter\u00a0+\u00a0Aggregator: \u043e\u0434\u0438\u043d exchange \u2192 \u043c\u043d\u043e\u0433\u043e \u2192 \u043e\u0434\u0438\u043d, \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u043e\u043c \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438.\u0427\u0430\u0441\u0442\u0438 3\u20135\u00a0\u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b EIP: \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c.\u0427\u0430\u0441\u0442\u044c 6\u00a0\u2014 expression-\u0434\u0432\u0438\u0436\u043e\u043a: \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043c\u0438\u043d\u0438-\u044f\u0437\u044b\u043a \u0441 Tokenizer \u2192 Parser \u2192 AST \u2192\u00a0IL, ~22 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, 17 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a.\u0427\u0430\u0441\u0442\u0438 7+\u00a0\u2014 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0443 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044e, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0430.\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430 \u2014 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0437 \u0447\u0430\u0441\u0442\u0438 3\u20135, \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0447\u0430\u0441\u0442\u0438 6 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0447\u0430\u0441\u0442\u0438 7+ \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0435\u0449\u0430\u0445:\u00a0\u043a\u0430\u043d\u0430\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0441\u0451\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u0438\u00a0Exchange, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0420\u0430\u0437\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0441 \u043d\u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014 \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0440\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f. \u041e\u0448\u0438\u0431\u0438\u0442\u0435\u0441\u044c \u2014 \u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0447\u0430\u0441 \u0438\u0441\u043a\u0430\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0442\u0438\u0445\u043e \u043d\u0435 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0430\u0441\u044c.\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041b\u044e\u0431\u043e\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u2014 \u044d\u0442\u043e\u00a0From \u2192 [\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b] \u2192 To. \u041c\u0435\u0436\u0434\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0447\u0442\u043e-\u0442\u043e \u00ab\u0442\u0435\u0447\u0451\u0442\u00bb, \u0438 \u0442\u0435\u0447\u0451\u0442 \u043e\u043d\u043e \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c. \u041a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0447\u0435\u0442\u044b\u0440\u0435:\u00a0direct,\u00a0direct-vm,\u00a0seda,\u00a0vm. \u0410 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e \u043d\u0438\u043c \u0442\u0435\u0447\u0451\u0442, \u2014 \u044d\u0442\u043e\u00a0Exchange. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441 \u0442\u0435\u043c,\u00a0\u0447\u0442\u043e\u00a0\u0442\u0435\u0447\u0451\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441 \u0442\u0435\u043c,\u00a0\u043f\u043e \u0447\u0435\u043c\u0443.\u0418 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430: \u044f \u0437\u0430\u043b\u0435\u0437 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u043d\u0430\u0448\u0451\u043b \u0442\u0430\u043c \u043f\u0430\u0440\u0443 \u043c\u0435\u0441\u0442, \u0433\u0434\u0435 XML-doc-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0442\u0441\u0442\u0430\u043b \u043e\u0442 \u043a\u043e\u0434\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f: redb.Route \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Camel \u2014 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u00a0Exchange, \u0438 doc-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u043e\u0439 \u0436\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u0439 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435. \u041f\u043e\u0437\u0436\u0435 Apache Camel \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 3 \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u043b (\u0437\u0430\u0434\u0435\u043f\u0440\u0435\u043a\u0435\u0439\u0442\u0438\u043b\u00a0getOut()\/setOut(), \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u043b \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432) \u2014 \u0438 \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0430 \u0437\u0430 \u044d\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0438\u0435\u043c. \u0422\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.Exchange \u2014 \u0441\u0435\u0440\u0434\u0446\u0435, \u0438 \u043e\u043d\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0435\u0412\u0441\u0451, \u0447\u0442\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443, \u2014 \u044d\u0442\u043e\u00a0IExchange. \u041d\u0435\u00a0byte[], \u043d\u0435 \u0432\u0430\u0448 DTO, \u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e. \u0412\u043e\u0442 \u0444\u043e\u0440\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0430\u0436\u043d\u0430:public interface IExchange : IAsyncDisposable{    IMessage  In  { get; set; }     \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430    IMessage? Out { get; set; }     \/\/ \u043e\u0442\u0432\u0435\u0442 \u2014 \u043b\u0435\u043d\u0438\u0432\u044b\u0439, null \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f    ExchangePattern Pattern { get; set; }   \/\/ InOnly (default), InOut \u0438\u043b\u0438 OutOnly    IDictionary&lt;string, object?&gt; Properties { get; }   \/\/ \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430    Exception? Exception { get; set; }                 \/\/ \u043e\u0448\u0438\u0431\u043a\u0430, in-band    bool ExceptionHandled { get; set; }    string ExchangeId { get; }                         \/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435    IExchange Clone();                                 \/\/ \u043a\u043e\u043f\u0438\u044f + \u041d\u041e\u0412\u042b\u0419 DI-scope    IServiceProvider? ServiceProvider { get; }         \/\/ DI-scope \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435}\u0418 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d \u043d\u0435\u0441\u0451\u0442:public interface IMessage{    object? Body { get; set; }                        \/\/ \u0432\u0430\u0448 payload \u2014 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 null    string? ContentType { get; set; }    IDictionary&lt;string, object?&gt; Headers { get; }     \/\/ \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0423\u0425\u041e\u0414\u042f\u0422 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440    T? GetHeader&lt;T&gt;(string key);    IMessage Clone();}\u041f\u044f\u0442\u044c \u0432\u0435\u0449\u0435\u0439 \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0438 \u0432\u0441\u0435\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432. \u0418 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u0442\u0438\u043f\u0430.1.\u00a0In\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0Out\u00a0\u0438\u00a0PatternIn\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0434\u0451\u0442 \u043f\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443.\u00a0Out\u00a0\u2014 \u043e\u0442\u0432\u0435\u0442, \u0438 \u043e\u043d\u00a0\u043b\u0435\u043d\u0438\u0432\u044b\u0439: \u0434\u043b\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u00a0InOnly\u00a0\u043e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f\u00a0null\u00a0\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041e\u043d \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0435\u0433\u043e \u044f\u0432\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b (request\/reply \u0438\u043b\u0438\u00a0.Respond()).\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432\u00a0\u0442\u0440\u0438, \u0430 \u043d\u0435 \u0434\u0432\u0430 \u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c Apache Camel 2.x, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043d\u043d\u0430\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c:public enum ExchangePattern{    InOnly  = 0,   \/\/ fire-and-forget. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 In; Out \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f null. (default)    InOut   = 1,   \/\/ request\/reply. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u043b\u0435\u0436\u0438\u0442 \u0432 In, \u043e\u0442\u0432\u0435\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 Out.    OutOnly = 2,   \/\/ \u044f\u0432\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 .Respond(); RPC-\u043e\u0442\u0432\u0435\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 Out.}\u0410 \u0432\u043e\u0442 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043f\u0440\u044f\u0447\u0435\u0442, \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f:\u00a0HasOut\u00a0\u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0432\u0430\u043c, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u043e\u0442\u0432\u0435\u0442.\u00a0\u0414\u0430\u0436\u0435 \u043d\u0430\u00a0InOut-\u043e\u0431\u043c\u0435\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u00a0Out\u00a0\u2014 \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u00a0In.Body, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u0435\u0436\u0438\u0442 \u0432\u00a0In. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u00a0HasOut\u00a0\u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u041e\u043d \u0447\u0438\u0442\u0430\u0435\u0442\u00a0Out ?? In, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437:\/\/ ProducerTemplate.RequestBody \u2014 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430exchange.Pattern = ExchangePattern.InOut;await producer.Process(exchange);return exchange.Out?.Body ?? exchange.In.Body;   \/\/ Out \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 In\u042d\u0442\u043e \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u0442\u043e, \u043a\u0430\u043a\u00a0ProducerTemplate\u00a0\u0432 Camel \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (getResultMessage: \u00ab\u0435\u0441\u0442\u044c Out \u2192 \u0431\u0435\u0440\u0451\u043c Out, \u0438\u043d\u0430\u0447\u0435 In\u00bb). \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043a \u0441\u0435\u0431\u0435 \u0432 \u043a\u043e\u0434 \u2014\u00a0exchange.Out ?? exchange.In\u00a0\u2014 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u0445\u043e \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432\u00a0In.\u00a0HasOut\u00a0\u2014 \u044d\u0442\u043e \u0444\u0430\u043a\u0442 \u043f\u0440\u043e\u00a0\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 \u043f\u0440\u043e \u0442\u043e,\u00a0\u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435; \u043d\u0435 \u0432\u0435\u0442\u0432\u0438\u0442\u0435\u0441\u044c \u043f\u043e \u043d\u0435\u043c\u0443 \u043d\u0430 \u043e\u0442\u0432\u0435\u0442.\u0418 \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0438\u0448\u0451\u043b \u0441 JVM: \u0436\u0438\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u00a0Out\u00a0\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u00a0OutOnly\u00a0\u2014 \u044d\u0442\u043e\u00a0\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 Camel 2.x. \u0412 Camel 3+\u00a0getOut()\/setOut()\u00a0\u0437\u0430\u0434\u0435\u043f\u0440\u0435\u043a\u0435\u0439\u0442\u0438\u043b\u0438 \u0438 \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u043b\u0438 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443\u00a0InOnly\/InOut\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435\u00a0Out-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043f\u043b\u043e\u0434\u0438\u043b\u043e \u0442\u043e\u043d\u043a\u0438\u0435 \u0431\u0430\u0433\u0438. redb.Route \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c 2.x \u2014 \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0437 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e Camel, \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0431\u0440\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430.2.\u00a0Properties\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u00a0Headers\u00a0\u2014 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0442\u0435\u043a\u0430\u044e\u0442 \u0431\u0430\u0433\u0438\u041e\u0431\u0430 \u2014\u00a0IDictionary&lt;string, object?&gt;. \u0418 \u043e\u043d\u0438\u00a0\u043d\u0435\u00a0\u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b:In.Headers\u00a0\u0443\u0435\u0437\u0436\u0430\u044e\u0442\u00a0\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0432 \u0431\u0440\u043e\u043a\u0435\u0440.\u00a0\u041f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0441\u044e\u0434\u0430\u00a0correlationId\u00a0\u2014 Kafka\/RabbitMQ \u0443\u043d\u0435\u0441\u0443\u0442 \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.exchange.Properties\u00a0\u2014 \u044d\u0442\u043e\u00a0\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430:\u00a0RouteId, \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0432\u0430\u0448\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041e\u043d\u0438\u00a0\u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u00a0(XML-doc \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0442\u0430\u043a \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442:\u00a0\u00abDoes NOT travel to brokers \u2014 use In.Headers for that\u00bb). \u0421\u044e\u0434\u0430 \u043a\u043b\u0430\u0434\u0443\u0442 \u0445\u044d\u043d\u0434\u043b\u00a0DbContext\u00a0\u0438\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0435\u0442\u0440\u0430\u0435\u0432.\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0432 \u0442\u043e\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u2014 \u0438 \u043e\u043d\u043e \u043b\u0438\u0431\u043e \u043d\u0435 \u0434\u043e\u0435\u0434\u0435\u0442 \u0434\u043e \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Properties), \u043b\u0438\u0431\u043e \u0443\u0442\u0435\u0447\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0440\u0443\u0436\u0443, \u0432 \u0431\u0440\u043e\u043a\u0435\u0440 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Headers). \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0439\u043c\u0430\u0435\u0442: \u043e\u0431\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e string-\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0438. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e, \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0443\u043c\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c.\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u043a\u0441\u0435\u0441\u0441\u043e\u0440\u044b, \u0430 \u043d\u0435 \u043a\u0430\u0441\u0442\u0443\u044f \u0440\u0443\u043a\u0430\u043c\u0438:var attempt = exchange.GetProperty&lt;int&gt;(&#171;retryCount&#187;);        \/\/ \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435var corr    = exchange.In.GetHeader&lt;string&gt;(&#171;correlationId&#187;); \/\/ \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440\u041a\u0430\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u0438\u0448\u0435\u0442 \u0441\u0430\u043c\u042d\u0442\u043e \u0442\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c, \u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u0430 \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435\u00a0\u043b\u0435\u0436\u0438\u0442\u00a0\u0432 Properties?\u00bb. Pipeline \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f exchange \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439. \u0415\u0434\u0438\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u00a0ExchangeProperties\u00a0\u043d\u0435\u0442 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u0436\u0438\u0432\u0451\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442, \u2014 \u043d\u043e \u0432\u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440, \u0434\u043e\u0431\u044b\u0442\u044b\u0439 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432.exchange.Properties\u00a0\u2014 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441:\u041a\u043b\u044e\u0447\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432 \u043a\u043e\u0434\u0435\u041a\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0421\u043c\u044b\u0441\u043bTRANSACT_ACTIONTransactedProcessor.TransactActionPropertyKey.Transacted()\u0441\u0442\u0435\u043a transacted-\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438TRANSACTION_SCOPEBeginTransactionProcessor.ScopePropertyKey\u00a0(internal).Transaction()\u0436\u0438\u0432\u043e\u0439\u00a0TransactionScope\u00a0\u0431\u043b\u043e\u043a\u0430CamelDuplicateMessageIdempotentConsumerProcessor.DuplicatePropertyKeyIdempotent Consumertrue, \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438ClaimCheck.StackClaimCheckHeaders.StackPropertyKey\u00a0(internal)Claim Check\u0441\u0442\u0435\u043a \u043a\u043b\u044e\u0447\u0435\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e payload&#8217;\u0430ValidationErrors\u00a0\/\u00a0ValidationResultValidateProcessor.*Property.Validate()\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e exchangeCamelSplitSize\u2014 (streaming splitter)streaming Splitter\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u043f\u043b\u0438\u0442\u0430__redb_scope:*\u2014 (\u043f\u0440\u0435\u0444\u0438\u043a\u0441)DI-\u043e\u0431\u0432\u044f\u0437\u043a\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 DI-scope&#8217;\u044b, \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f\u00a0ReleaseScopes()\u041f\u043b\u044e\u0441\u00a0RouteId\u00a0\u043f\u043e\u0434\u043d\u044f\u0442 \u0434\u043e\u00a0first-class \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u00a0\u043d\u0430 \u0441\u0430\u043c\u043e\u043c exchange (exchange.RouteId), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043b\u043e\u0433\u0433\u0435\u0440 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043a\u0430\u043a\u00a0[rId:\u2026].In.Headers\u00a0\u2014 \u0443\u0435\u0437\u0436\u0430\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:Camel-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u0438\u0440\u0430, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 Camel. Splitter, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0448\u0442\u0430\u043c\u043f\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0447\u0430\u0441\u0442\u044c:\/\/ SplitterProcessor \u2014 \u043a\u0430\u0436\u0434\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043f\u043b\u0438\u0442\u0430 \u043d\u0435\u0441\u0451\u0442 \u0441\u0432\u043e\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044bsplitMessage.Headers[&#171;CamelSplitIndex&#187;]    = index;          \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0441 \u043d\u0443\u043b\u044fsplitMessage.Headers[&#171;CamelSplitSize&#187;]     = total;          \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u0447\u043a\u0438splitMessage.Headers[&#171;CamelSplitComplete&#187;] = index == total &#8212; 1; \/\/ \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f?\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 namespaced-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u2014\u00a0KafkaHeaders\u00a0(redbKafka.Topic,\u00a0redbKafka.Partition,\u00a0redbKafka.Offset, \u2026),\u00a0SqlHeaders\u00a0(redbSql.rowCount,\u00a0redbSql.generatedKeys, \u2026),\u00a0SignalRHeaders\u00a0(redbSignalR.ConnectionId, \u2026),\u00a0TcpHeaders,\u00a0WsHeaders,\u00a0ElasticsearchHeaders. \u041a\u0430\u0436\u0434\u044b\u0439 \u2014 \u044d\u0442\u043e\u00a0static class\u00a0\u0438\u0437\u00a0public const string, \u0447\u0442\u043e\u0431\u044b \u0431\u0438\u043d\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u00a0KafkaHeaders.Offset, \u0430 \u043d\u0435 \u043d\u0430 stringly-typed\u00a0&#171;redbKafka.Offset&#187;, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c\u0441\u044f. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435: \u0432\u0441\u0451 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c\u00a0Camel*\u00a0\u0438\u043b\u0438\u00a0redb&lt;Transport&gt;.*\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (\u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440); \u0432\u0441\u0451 \u0432\u00a0Properties\u00a0\u2014 \u0432\u0430\u0448\u0435 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.3. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0435\u0434\u0435\u0442\u00a0in-band\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0431\u0440\u043e\u0441\u0430\u0435\u0442, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0435\u043a \u2014 \u043e\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u00a0exchange.Exception, \u0440\u044f\u0434\u043e\u043c \u0441 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0ExceptionHandled. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 dead-letter-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0443 \u0432\u0435\u0442\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0442\u043e\u043c\u0443,\u00a0\u043f\u043e\u0447\u0435\u043c\u0443\u00a0\u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0430\u043b\u043e (when e.Exception is TimeoutException \u2192 \u2026), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0442\u043e\u043c\u0443,\u00a0\u0447\u0442\u043e\u00a0\u0443\u043f\u0430\u043b\u043e. \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043b\u043e\u0442\u043d\u043e \u0441\u0442\u043e\u0438\u043c \u0432 \u0432\u044b\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.4.\u00a0ExchangeId\u00a0\u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u041a\u0430\u0436\u0434\u044b\u0439 exchange \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u00a0ExchangeId\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435\u00a0Guid. \u041d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c:\u00a0Clone()\u00a0\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442.\u00a0\u0421\u043f\u043b\u0438\u0442 \u043d\u0430 500 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438\u043b\u0438\u00a0seda-\u0445\u043e\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 exchange, \u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u0442 \u0436\u0435 id \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0433\u0438 \u0438 \u0442\u0440\u0435\u0439\u0441\u044b \u0441\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0434\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435. \u0418\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e &#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-482148","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482148","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=482148"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482148\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}