{"id":499489,"date":"2026-10-20T20:31:07","date_gmt":"2026-10-20T17:31:07","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=499489"},"modified":"2026-10-20T20:31:07","modified_gmt":"2026-10-20T17:31:07","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=499489","title":{"rendered":"\u041a\u0430\u043a \u043c\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 Redis \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c POST-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a OpenAI\/DeepSeek \u0438 \u0432\u044b\u0436\u0430\u043b\u0438 4900 RPS \u043d\u0430 Java 21"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 2026 \u0433\u043e\u0434\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f LLM-\u043c\u043e\u0434\u0435\u043b\u0435\u0439 (OpenAI, DeepSeek) \u0438 \u0442\u044f\u0436\u0435\u043b\u043e\u0439 \u0433\u0435\u043e-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (Google Maps, <a href=\"https:\/\/yandex.ru\/maps\/\" rel=\"noopener nofollow\">\u042f\u043d\u0434\u0435\u043a\u0441.\u041a\u0430\u0440\u0442\u044b<\/a>, DaData) \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c Enterprise-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435. \u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0441\u0447\u0435\u0442\u0430 \u0437\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u043b\u0438\u043c\u0438\u0442\u044b API \u0440\u0430\u0441\u0442\u0443\u0442 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0447\u0430\u0442-\u0431\u043e\u0442 \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u00ab\u043f\u0440\u043e\u0435\u0434\u0430\u0442\u044c\u00bb \u0448\u0435\u0441\u0442\u0438\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0432 \u043c\u0435\u0441\u044f\u0446, \u043c\u044b \u0441\u0435\u043b\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438.<\/p>\n<p>\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u0430\u0441\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0449\u044c: \u0434\u043e 40% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u0442\u043e\u0439 \u0432\u043e\u0434\u044b \u0434\u0443\u0431\u043b\u0438. \u041b\u044e\u0434\u0438 \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0445\u043e\u0436\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043c\u0442\u044b, \u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u043c\u043e\u0434\u0443\u043b\u0438 \u0442\u043e\u043d\u043d\u0430\u043c\u0438 \u0433\u043e\u043d\u044f\u044e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0433\u0435\u043e-\u043a\u043e\u0434\u0435\u0440\u0430\u043c. \u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u043c\u0441\u044f \u043a\u044d\u0448\u0435\u043c. \u041d\u043e \u0442\u0443\u0442 \u043c\u044b \u0443\u043f\u0451\u0440\u043b\u0438\u0441\u044c \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0442\u0443\u043f\u0438\u043a.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 Nginx \u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0438<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0431\u0435\u0440\u0443\u0442 Nginx, Varnish \u0438\u043b\u0438 HAProxy. \u041d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u0435\u0431\u0430, \u0433\u0434\u0435 \u043f\u0440\u0430\u0432\u0438\u0442 \u0431\u0430\u043b <code>GET<\/code>-\u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 URL.<\/p>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0418\u0418-\u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0433\u0435\u043e-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 <code>POST<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u043b\u0430 (<code>payload<\/code>) \u043b\u0435\u0436\u0438\u0442 \u0442\u044f\u0436\u0435\u043b\u044b\u0439 JSON. \u0418 \u044d\u0442\u043e\u0442 JSON \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442:<\/p>\n<ol>\n<li>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 SDK \u043b\u044e\u0431\u044f\u0442 \u0434\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0443\u0441\u043e\u0440: \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 <code>request_id<\/code>, UUID \u0441\u0435\u0441\u0441\u0438\u0439, <code>nonce<\/code> \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 (<code>created_at<\/code>, <code>timestamp<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043b\u044e\u0447\u0435\u0439 \u0432 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 HashMap).<\/p>\n<\/li>\n<li>\n<p>\u0411\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438\u043b\u0438 \u0440\u0430\u0437\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043c\u0430\u044e\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u043c\u0442\u043e\u043c, \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 <code>request_id<\/code> \u2014 \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u041a\u044d\u0448 \u043b\u0435\u0442\u0438\u0442 \u0432 \u043c\u0443\u0441\u043e\u0440\u043a\u0443. \u041f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 Lua-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0434 <a href=\"https:\/\/nginx.org\/en\/\" rel=\"noopener nofollow\">Nginx<\/a> \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0441\u0442\u0440\u0438\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 JSON \u043d\u0430 \u043b\u0435\u0442\u0443 \u2014 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0434\u0443\u0445\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439, \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 On-Premise \u0448\u043b\u044e\u0437 \u043d\u0430 Java.<\/p>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0448\u043b\u044e\u0437\u0430: Loom, WebFlux \u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0448\u043b\u044e\u0437 \u043d\u0435 \u0441\u0442\u0430\u043b \u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u044b\u043c \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e\u043c \u0438 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (<em>latency<\/em>), \u0441\u0442\u0435\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c. \u041c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 <strong>Java 21 (Project Loom \/ \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438)<\/strong>, <a href=\"https:\/\/docs.spring.io\/spring-framework\/reference\/web\/webflux.html\" rel=\"noopener nofollow\">Spring WebFlux<\/a> \u0438 <a href=\"https:\/\/netty.io\/\" rel=\"noopener nofollow\">Netty<\/a>. \u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 RPS \u043d\u0430 \u043e\u0434\u043d\u043e\u043c-\u0434\u0432\u0443\u0445 \u044f\u0434\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434.<\/p>\n<p>\u0421\u0435\u0440\u0434\u0446\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u044e\u0437\u0430 \u0441\u0442\u0430\u043b <code>CacheProxyHandler<\/code>. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 <code>POST<\/code>-\u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0447\u0438\u0449\u0430\u0435\u043c JSON \u043e\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0433\u0438\u0431\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443, \u0441\u0447\u0438\u0442\u0430\u0435\u043c <code>SHA-256<\/code> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0433\u043e \u0432 <a href=\"https:\/\/redis.io\/\" rel=\"noopener nofollow\">Redis<\/a>.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c <code>application.yaml<\/code>:<\/p>\n<p>yaml<\/p>\n<pre><code>proxy:  routes:    openai:      base-url: \"https:\/\/openai.com\"      ttl-minutes: 120      exclude-fields: [\"request_id\", \"user_session_id\", \"created_at\"]    deepseek:      base-url: \"https:\/\/deepseek.com\"      ttl-minutes: 180      exclude-fields: [\"generation_id\", \"client_timestamp\", \"trace_id\"]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u2014 \u043f\u0435\u0440\u0432\u0430\u044f (\u043a\u0430\u043a \u043d\u0430\u043c \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>ReactiveRedisTemplate&lt;String, String&gt;<\/code> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u044d\u0448\u0435\u043c:<\/p>\n<p>java<\/p>\n<pre><code>\/\/ \u041f\u0435\u0440\u0432\u0430\u044f \u043d\u0430\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430return request.bodyToMono(String.class)    .defaultIfEmpty(\"\")    .flatMap(bodyString -&gt; {        String normalizedBody = normalizeJson(providerKey, bodyString);        String cacheKey = \"proxy:cache:\" + generateSha256(normalizedBody);        return redisTemplate.opsForValue().get(cacheKey)                .flatMap(cachedBody -&gt; buildResponse(cachedBody, HttpStatus.OK, \"HIT\"))                .switchIfEmpty(                        Mono.defer(() -&gt; fetchFromOriginalApi(routeConfig.baseUrl(), bodyString)                                .flatMap(freshBody -&gt; redisTemplate.opsForValue().set(cacheKey, freshBody, Duration.ofMinutes(2))                                        .thenReturn(freshBody))                                .flatMap(freshBody -&gt; buildResponse(freshBody, HttpStatus.OK, \"MISS\"))                        )                );    });<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p> \u0412\u043d\u0443\u0442\u0440\u0438 <code>normalizeJson<\/code> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 Jackson: \u043f\u0430\u0440\u0441\u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 <code>JsonNode<\/code>, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u043b\u0438 \u043f\u043e\u043b\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 <code>exclude-fields<\/code> \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 JSON \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043a\u043b\u044e\u0447\u0435\u0439.  <\/p>\n<p>\u0413\u0440\u0430\u0431\u043b\u0438 \u21161: \u041a\u0430\u043a \u043c\u044b \u0437\u0430\u0431\u0438\u043b\u0438 \u043a\u0443\u0447\u0443 (Heap) \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u043c\u0443\u0441\u043e\u0440\u043e\u043c<\/p>\n<p>\u041c\u044b \u0440\u0430\u0441\u043a\u0430\u0442\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 k6 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 3000+ RPS. \u0427\u0435\u0440\u0435\u0437 \u043c\u0438\u043d\u0443\u0442\u0443 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u043f\u043e\u043b\u0437\u043b\u0438 \u0432\u0432\u0435\u0440\u0445, \u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 <code>p(99)<\/code> \u043d\u0430\u0447\u0430\u043b\u043e \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043e\u0442 5 \u0434\u043e 120 \u043c\u0441. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043b\u043e\u0432\u0438\u043b\u043e \u043c\u0438\u043a\u0440\u043e-\u043f\u0430\u0443\u0437\u044b <em>Stop-The-World<\/em>.<\/p>\n<p>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435: <code>StringRedisSerializer<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u0430 <strong>\u043a\u0430\u0436\u0434\u044b\u0439<\/strong> \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0434\u0435\u043b\u044f\u043b \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u043a\u0443\u0447\u0435 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0447\u0430\u0440\u043e\u0432 (<code>char[]<\/code>) \u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <a href=\"https:\/\/redis.io\/\" rel=\"noopener nofollow\">Redis<\/a> \u0432 Java-\u0441\u0442\u0440\u043e\u043a\u0438 (UTF-8). \u041f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 Garbage Collector \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u043b \u0432\u044b\u0447\u0438\u0449\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043c\u0443\u0441\u043e\u0440.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0440\u0435\u043b\u044c\u0441\u044b<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u044e\u044e \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 JSON \u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u0431\u0430\u0437\u043e\u0439. \u041f\u0443\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0438\u0437 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 Netty \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 <a href=\"https:\/\/redis.io\/\" rel=\"noopener nofollow\">Redis<\/a> \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>\u041c\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Redis, \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 raw-\u043f\u0430\u0441\u0441 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<p>java<\/p>\n<pre><code>@Configurationpublic class WebClientConfig {    @Bean    public ReactiveRedisTemplate&lt;String, byte[]&gt; reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {        RedisSerializationContext&lt;String, byte[]&gt; context = RedisSerializationContext                .&lt;String, byte[]&gt;newSerializationContext(RedisSerializer.string()) \/\/ \u041a\u043b\u044e\u0447 \u2014 String                .value(RedisSerializer.byteArray()) \/\/ \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0441\u044b\u0440\u043e\u0439 byte[] (Zero-Copy \u044d\u0444\u0444\u0435\u043a\u0442)                .build();        return new ReactiveRedisTemplate&lt;&gt;(factory, context);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u0435 <code>CacheProxyHandler<\/code> \u043b\u043e\u0433\u0438\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0431\u0430\u0439\u0442:<\/p>\n<p>java<\/p>\n<pre><code>return redisTemplate.opsForValue().get(cacheKey)        .flatMap(cachedBytes -&gt; {            \/\/ \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0438\u0437 Redis \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430            String cachedBody = new String(cachedBytes, StandardCharsets.UTF_8);            return buildResponse(cachedBody, HttpStatus.OK, \"HIT\");        })        .switchIfEmpty(                Mono.defer(() -&gt; fetchFromOriginalApi(routeConfig.baseUrl(), cleanTargetPath, bodyString, request)                        .flatMap(freshBody -&gt; {                            byte[] bytes = freshBody.getBytes(StandardCharsets.UTF_8);                            return redisTemplate.opsForValue().set(cacheKey, bytes, Duration.ofMinutes(routeConfig.ttlMinutes()))                                    .thenReturn(freshBody);                        })                        .flatMap(freshBody -&gt; buildResponse(freshBody, HttpStatus.OK, \"MISS\"))                )        );<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 GC \u0443\u043f\u0430\u043b\u0430 \u0432 4 \u0440\u0430\u0437\u0430, \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c, \u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u043d\u0430 <code>Cache HIT<\/code> \u043e\u043f\u0443\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u0434\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u0441\u0435\u0442\u0438.<\/p>\n<p>\u0413\u0440\u0430\u0431\u043b\u0438 \u21162: \u042d\u0444\u0444\u0435\u043a\u0442 Cache Line Bouncing \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0448 \u043f\u0440\u043e\u043a\u0441\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 Enterprise On-Premise \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0448\u0435\u0434\u0443\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e RSA-2048 \u043f\u043e\u0434\u043f\u0438\u0441\u044c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0438\u0441\u0430\u043b\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e:<\/p>\n<p>java<\/p>\n<pre><code>private volatile boolean isLicenseValid = false;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>isLicenseActive()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e HTTP-\u0444\u0438\u043b\u044c\u0442\u0440\u0430 <code>BillingWebFilter<\/code> \u043d\u0430 <strong>\u043a\u0430\u0436\u0434\u044b\u0439<\/strong> \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u043b\u044e\u0437, \u0435\u0441\u043b\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u0430 \u0438\u043b\u0438 \u0438\u0441\u0442\u0435\u043a\u043b\u0430.<\/p>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438, \u043f\u043e\u0442\u043e\u043a\u0438 \u0435\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u044e\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b? \u041d\u043e \u043f\u043e\u0434 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 <a href=\"https:\/\/www.loom.com\/community\/collections\/project-management\" rel=\"noopener nofollow\">Project Loom<\/a> \u0440\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u044f\u0434\u0440\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>volatile<\/code> \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 L1\/L2 \u043a\u044d\u0448 \u044f\u0434\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0448\u0438\u043d\u0443 (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b MESI).<\/p>\n<p>\u042f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0442\u044b \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 <strong>Cache Line Bouncing<\/strong>.<\/p>\n<p><strong>\u041a\u0430\u043a \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u0438:<\/strong> \u041c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 <code>volatile boolean<\/code> \u043d\u0430 <code>AtomicBoolean<\/code> \u0438 \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code><strong>getPlain()<\/strong><\/code>:<\/p>\n<p>java<\/p>\n<pre><code>private final AtomicBoolean isLicenseValid = new AtomicBoolean(false);public boolean isLicenseActive() {    return isLicenseValid.getPlain(); \/\/ \u0427\u0442\u0435\u043d\u0438\u0435 \u0411\u0415\u0417 volatile-\u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>getPlain()<\/code> \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 (Memory Barrier), \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044f\u0434\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0444\u043b\u0430\u0433 \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u0435\u0442\u0430. \u0414\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u044f\u0434\u0440\u043e \u0443\u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u043d\u0430 \u043f\u0430\u0440\u0443 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0437\u0436\u0435 \u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e \u0448\u0435\u0434\u0443\u043b\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442, \u0437\u0430\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0448\u0438\u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430.<\/p>\n<p>\u041d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u0412\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043d\u0430 Grafana k6<\/p>\n<p>\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0435\u0441\u0441-\u0442\u0435\u0441\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <strong>k6<\/strong>. \u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c: 200 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (VUs).<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: 2 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0448\u0442\u0443\u0440\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430: 90% Cache HIT (\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0441\u0445\u043e\u0436\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b) \u0438 10% Cache MISS (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0442\u044b).<\/p>\n<\/li>\n<li>\n<p>\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435: \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c API OpenAI \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0440\u044f\u0434\u043e\u043c \u0432 Docker-\u0441\u0435\u0442\u0438 \u0431\u044b\u043b \u043f\u043e\u0434\u043d\u044f\u0442 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 Nginx \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 Mock-\u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043b\u043e\u0433 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 k6 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u0430:<\/p>\n<p>text<\/p>\n<pre><code>  \u2588 TOTAL RESULTS     checks_total.......: 1176522 9801.80\/s    checks_succeeded...: 100.00% 1176522 out of 1176522    checks_failed......: 0.00%   0 out of 1176522    \u2713 status is 200    \u2713 has X-Cache-Status header    HTTP    http_req_duration..............: avg=40.33ms min=8.4ms  med=36.4ms  max=1.51s p(90)=59.41ms p(95)=69.96ms    http_req_failed................: 0.00%  0 out of 588261    http_reqs......................: 588261 4900.90\/s    NETWORK    data_received..................: 88 MB  736 kB\/s    data_sent......................: 178 MB 1.5 MB\/s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0442\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c:<\/strong> \u0428\u043b\u044e\u0437 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0447\u0438\u0441\u0442\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 <strong>~4900 RPS<\/strong> (\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443). \u0412\u0441\u0435\u0433\u043e \u0437\u0430 \u0434\u0432\u0435 \u043c\u0438\u043d\u0443\u0442\u044b \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u043e\u043b\u0435\u0435 <strong>588 000 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/strong> \u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0440\u043e\u0432\u043d\u043e <strong>0.00%<\/strong>. \u041d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 \u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Latency:<\/strong> \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e <strong>8.4 \u043c\u0441<\/strong>. \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f (<code>med<\/code>) \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u043e\u0442\u043c\u0435\u0442\u043a\u0435 36.4 \u043c\u0441. \u0421\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u0441\u0442 \u0433\u043e\u043d\u044f\u043b\u0441\u044f \u043d\u0430 \u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u0441\u043a\u043e\u0439 Windows 11, \u0433\u0434\u0435 Docker Desktop \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 WSL 2, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c Linux-\u043a\u043e\u043d\u0442\u0443\u0440\u0435 (Bare Metal) \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0435\u0442\u044c \u0432\u044b\u0434\u0430\u0435\u0442 <code>p(99) &lt; 4\u043c\u0441<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u044b\u0432\u043e\u0434\u044b<\/p>\n<ol>\n<li>\n<p><strong>\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u043d\u0430 Java 21 (Loom\/WebFlux\/Netty)<\/strong> \u2014 \u044d\u0442\u043e \u0443\u043b\u044c\u0442\u0438\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0448\u043b\u044e\u0437\u043e\u0432. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0442\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0431\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u041e\u0421 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 String-\u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e JSON \u0432 Redis \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 High-Load.<\/strong> \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b <code>byte[]<\/code> \u0438\u043b\u0438 <code>ByteBuffer<\/code> \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0440\u0435\u0447\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0432 OOM \u0438 \u0447\u0430\u0441\u0442\u044b\u0445 \u043f\u0430\u0443\u0437 Garbage Collector.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.<\/strong> \u041e\u0431\u044b\u0447\u043d\u044b\u0439 <code>volatile<\/code>-\u0444\u043b\u0430\u0433, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445, \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0438\u043d\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441\u0438\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0439 On-Premise Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 Prometheus-\u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 RSA-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0435\u0439. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0442\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u044b \u043d\u0430 \u0418\u0418-\u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u043b\u0438 \u0433\u0435\u043e-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430 \u0441\u043b\u0443\u0436\u0431\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0442\u0440\u0435\u043a\u0435\u0440\u044b \u2014 \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0442 \u044d\u0442\u0443 \u0431\u043e\u043b\u044c \u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442 \u043f\u0438\u043b\u043e\u0442\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0448\u043b\u044e\u0437 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0441\u0442\u0435\u0439\u0434\u0436\u0438\u043d\u0433\u0435 \u0438 \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u2014 \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0432 Telegram <a href=\"https:\/\/www.instagram.com\/razzzryv\/\" rel=\"noopener nofollow\">@ds_razzhivin<\/a>, \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0442\u0440\u0438\u0430\u043b-\u043a\u043b\u044e\u0447\u043e\u043c.<\/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\/1096954\/\">https:\/\/habr.com\/ru\/articles\/1096954\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 2026 \u0433\u043e\u0434\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f LLM-\u043c\u043e\u0434\u0435\u043b\u0435\u0439 (OpenAI, DeepSeek) \u0438 \u0442\u044f\u0436\u0435\u043b\u043e\u0439 \u0433\u0435\u043e-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (Google Maps, \u042f\u043d\u0434\u0435\u043a\u0441.\u041a\u0430\u0440\u0442\u044b, DaData) \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c Enterprise-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435. \u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0441\u0447\u0435\u0442\u0430 \u0437\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u043b\u0438\u043c\u0438\u0442\u044b API \u0440\u0430\u0441\u0442\u0443\u0442 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e. \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0447\u0430\u0442-\u0431\u043e\u0442 \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u00ab\u043f\u0440\u043e\u0435\u0434\u0430\u0442\u044c\u00bb \u0448\u0435\u0441\u0442\u0438\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0432 \u043c\u0435\u0441\u044f\u0446, \u043c\u044b \u0441\u0435\u043b\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438.\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u0430\u0441\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0449\u044c: \u0434\u043e 40% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u0442\u043e\u0439 \u0432\u043e\u0434\u044b \u0434\u0443\u0431\u043b\u0438. \u041b\u044e\u0434\u0438 \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0445\u043e\u0436\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043c\u0442\u044b, \u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u043c\u043e\u0434\u0443\u043b\u0438 \u0442\u043e\u043d\u043d\u0430\u043c\u0438 \u0433\u043e\u043d\u044f\u044e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0433\u0435\u043e-\u043a\u043e\u0434\u0435\u0440\u0430\u043c. \u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u043c\u0441\u044f \u043a\u044d\u0448\u0435\u043c. \u041d\u043e \u0442\u0443\u0442 \u043c\u044b \u0443\u043f\u0451\u0440\u043b\u0438\u0441\u044c \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0442\u0443\u043f\u0438\u043a.\u041f\u043e\u0447\u0435\u043c\u0443 Nginx \u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0438\u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0431\u0435\u0440\u0443\u0442 Nginx, Varnish \u0438\u043b\u0438 HAProxy. \u041d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u0435\u0431\u0430, \u0433\u0434\u0435 \u043f\u0440\u0430\u0432\u0438\u0442 \u0431\u0430\u043b GET-\u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 URL.\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0418\u0418-\u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0433\u0435\u043e-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 POST. \u0412\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u043b\u0430 (payload) \u043b\u0435\u0436\u0438\u0442 \u0442\u044f\u0436\u0435\u043b\u044b\u0439 JSON. \u0418 \u044d\u0442\u043e\u0442 JSON \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442:\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 SDK \u043b\u044e\u0431\u044f\u0442 \u0434\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0443\u0441\u043e\u0440: \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 request_id, UUID \u0441\u0435\u0441\u0441\u0438\u0439, nonce \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 (created_at, timestamp).\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043b\u044e\u0447\u0435\u0439 \u0432 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 HashMap).\u0411\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438\u043b\u0438 \u0440\u0430\u0437\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043c\u0430\u044e\u0442 \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a.\u0414\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u043c\u0442\u043e\u043c, \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 request_id \u2014 \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u041a\u044d\u0448 \u043b\u0435\u0442\u0438\u0442 \u0432 \u043c\u0443\u0441\u043e\u0440\u043a\u0443. \u041f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 Lua-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0434 Nginx \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0441\u0442\u0440\u0438\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 JSON \u043d\u0430 \u043b\u0435\u0442\u0443 \u2014 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0434\u0443\u0445\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439, \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 On-Premise \u0448\u043b\u044e\u0437 \u043d\u0430 Java.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0448\u043b\u044e\u0437\u0430: Loom, WebFlux \u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438\u0427\u0442\u043e\u0431\u044b \u0448\u043b\u044e\u0437 \u043d\u0435 \u0441\u0442\u0430\u043b \u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u044b\u043c \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e\u043c \u0438 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (latency), \u0441\u0442\u0435\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c. \u041c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Java 21 (Project Loom \/ \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438), Spring WebFlux \u0438 Netty. \u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 RPS \u043d\u0430 \u043e\u0434\u043d\u043e\u043c-\u0434\u0432\u0443\u0445 \u044f\u0434\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434.\u0421\u0435\u0440\u0434\u0446\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u044e\u0437\u0430 \u0441\u0442\u0430\u043b CacheProxyHandler. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 POST-\u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0447\u0438\u0449\u0430\u0435\u043c JSON \u043e\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0433\u0438\u0431\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443, \u0441\u0447\u0438\u0442\u0430\u0435\u043c SHA-256 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0433\u043e \u0432 Redis.\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c application.yaml:yamlproxy:  routes:    openai:      base-url: &#171;https:\/\/openai.com&#187;      ttl-minutes: 120      exclude-fields: [&#171;request_id&#187;, &#171;user_session_id&#187;, &#171;created_at&#187;]    deepseek:      base-url: &#171;https:\/\/deepseek.com&#187;      ttl-minutes: 180      exclude-fields: [&#171;generation_id&#187;, &#171;client_timestamp&#187;, &#171;trace_id&#187;]\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u2014 \u043f\u0435\u0440\u0432\u0430\u044f (\u043a\u0430\u043a \u043d\u0430\u043c \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 ReactiveRedisTemplate&lt;String, String&gt; \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u044d\u0448\u0435\u043c:java\/\/ \u041f\u0435\u0440\u0432\u0430\u044f \u043d\u0430\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430return request.bodyToMono(String.class)    .defaultIfEmpty(&#171;&#187;)    .flatMap(bodyString -&gt; {        String normalizedBody = normalizeJson(providerKey, bodyString);        String cacheKey = &#171;proxy:cache:&#187; + generateSha256(normalizedBody);        return redisTemplate.opsForValue().get(cacheKey)                .flatMap(cachedBody -&gt; buildResponse(cachedBody, HttpStatus.OK, &#171;HIT&#187;))                .switchIfEmpty(                        Mono.defer(() -&gt; fetchFromOriginalApi(routeConfig.baseUrl(), bodyString)                                .flatMap(freshBody -&gt; redisTemplate.opsForValue().set(cacheKey, freshBody, Duration.ofMinutes(2))                                        .thenReturn(freshBody))                                .flatMap(freshBody -&gt; buildResponse(freshBody, HttpStatus.OK, &#171;MISS&#187;))                        )                );    }); \u0412\u043d\u0443\u0442\u0440\u0438 normalizeJson \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 Jackson: \u043f\u0430\u0440\u0441\u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 JsonNode, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u043b\u0438 \u043f\u043e\u043b\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 exclude-fields \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 JSON \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043a\u043b\u044e\u0447\u0435\u0439.  \u0413\u0440\u0430\u0431\u043b\u0438 \u21161: \u041a\u0430\u043a \u043c\u044b \u0437\u0430\u0431\u0438\u043b\u0438 \u043a\u0443\u0447\u0443 (Heap) \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u043c\u0443\u0441\u043e\u0440\u043e\u043c\u041c\u044b \u0440\u0430\u0441\u043a\u0430\u0442\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 k6 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 3000+ RPS. \u0427\u0435\u0440\u0435\u0437 \u043c\u0438\u043d\u0443\u0442\u0443 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u043f\u043e\u043b\u0437\u043b\u0438 \u0432\u0432\u0435\u0440\u0445, \u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 p(99) \u043d\u0430\u0447\u0430\u043b\u043e \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043e\u0442 5 \u0434\u043e 120 \u043c\u0441. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043b\u043e\u0432\u0438\u043b\u043e \u043c\u0438\u043a\u0440\u043e-\u043f\u0430\u0443\u0437\u044b Stop-The-World.\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435: StringRedisSerializer, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0434\u0435\u043b\u044f\u043b \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u043a\u0443\u0447\u0435 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0447\u0430\u0440\u043e\u0432 (char[]) \u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 Redis \u0432 Java-\u0441\u0442\u0440\u043e\u043a\u0438 (UTF-8). \u041f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 Garbage Collector \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u043b \u0432\u044b\u0447\u0438\u0449\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043c\u0443\u0441\u043e\u0440.\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0440\u0435\u043b\u044c\u0441\u044b\u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u044e\u044e \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 JSON \u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u0431\u0430\u0437\u043e\u0439. \u041f\u0443\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0438\u0437 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 Netty \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 Redis \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.\u041c\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Redis, \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 raw-\u043f\u0430\u0441\u0441 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:java@Configurationpublic class WebClientConfig {    @Bean    public ReactiveRedisTemplate&lt;String, byte[]&gt; reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {        RedisSerializationContext&lt;String, byte[]&gt; context = RedisSerializationContext                .&lt;String, byte[]&gt;newSerializationContext(RedisSerializer.string()) \/\/ \u041a\u043b\u044e\u0447 \u2014 String                .value(RedisSerializer.byteArray()) \/\/ \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0441\u044b\u0440\u043e\u0439 byte[] (Zero-Copy \u044d\u0444\u0444\u0435\u043a\u0442)                .build();        return new ReactiveRedisTemplate&lt;&gt;(factory, context);    }}\u0412 \u0441\u0430\u043c\u043e\u043c \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u0435 CacheProxyHandler \u043b\u043e\u0433\u0438\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0431\u0430\u0439\u0442:javareturn redisTemplate.opsForValue().get(cacheKey)        .flatMap(cachedBytes -&gt; {            \/\/ \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0438\u0437 Redis \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430            String cachedBody = new String(cachedBytes, StandardCharsets.UTF_8);            return buildResponse(cachedBody, HttpStatus.OK, &#171;HIT&#187;);        })        .switchIfEmpty(                Mono.defer(() -&gt; fetchFromOriginalApi(routeConfig.baseUrl(), cleanTargetPath, bodyString, request)                        .flatMap(freshBody -&gt; {                            byte[] bytes = freshBody.getBytes(StandardCharsets.UTF_8);                            return redisTemplate.opsForValue().set(cacheKey, bytes, Duration.ofMinutes(routeConfig.ttlMinutes()))                                    .thenReturn(freshBody);                        })                        .flatMap(freshBody -&gt; buildResponse(freshBody, HttpStatus.OK, &#171;MISS&#187;))                )        );\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 GC \u0443\u043f\u0430\u043b\u0430 \u0432 4 \u0440\u0430\u0437\u0430, \u043a\u0443\u0447\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c, \u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u043d\u0430 Cache HIT \u043e\u043f\u0443\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u0434\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u0441\u0435\u0442\u0438.\u0413\u0440\u0430\u0431\u043b\u0438 \u21162: \u042d\u0444\u0444\u0435\u043a\u0442 Cache Line Bouncing \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0448 \u043f\u0440\u043e\u043a\u0441\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 Enterprise On-Premise \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0448\u0435\u0434\u0443\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e RSA-2048 \u043f\u043e\u0434\u043f\u0438\u0441\u044c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0438\u0441\u0430\u043b\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e:javaprivate volatile boolean isLicenseValid = false;\u041c\u0435\u0442\u043e\u0434 isLicenseActive() \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e HTTP-\u0444\u0438\u043b\u044c\u0442\u0440\u0430 BillingWebFilter \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u043b\u044e\u0437, \u0435\u0441\u043b\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u0430 \u0438\u043b\u0438 \u0438\u0441\u0442\u0435\u043a\u043b\u0430.\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438, \u043f\u043e\u0442\u043e\u043a\u0438 \u0435\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u044e\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b? \u041d\u043e \u043f\u043e\u0434 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 Project Loom \u0440\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u044f\u0434\u0440\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e volatile \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 L1\/L2 \u043a\u044d\u0448 \u044f\u0434\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0448\u0438\u043d\u0443 (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b MESI).\u042f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0442\u044b \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u044d\u0442\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 Cache Line Bouncing.\u041a\u0430\u043a \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u0438: \u041c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 volatile boolean \u043d\u0430 AtomicBoolean \u0438 \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 getPlain():javaprivate final AtomicBoolean isLicenseValid = new AtomicBoolean(false);public boolean isLicenseActive() {    return isLicenseValid.getPlain(); \/\/ \u0427\u0442\u0435\u043d\u0438\u0435 \u0411\u0415\u0417 volatile-\u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438}\u041c\u0435\u0442\u043e\u0434 getPlain() \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 (Memory Barrier), \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044f\u0434\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0444\u043b\u0430\u0433 \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u0435\u0442\u0430. \u0414\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u044f\u0434\u0440\u043e \u0443\u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u043d\u0430 \u043f\u0430\u0440\u0443 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0437\u0436\u0435 \u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e \u0448\u0435\u0434\u0443\u043b\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442, \u0437\u0430\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0448\u0438\u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430.\u041d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u0412\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043d\u0430 Grafana k6\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0435\u0441\u0441-\u0442\u0435\u0441\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 k6. \u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c: 200 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (VUs).\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: 2 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0448\u0442\u0443\u0440\u043c\u0430.\u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430: 90% Cache HIT (\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0441\u0445\u043e\u0436\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b) \u0438 10% Cache MISS (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0442\u044b).\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435: \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c API OpenAI \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0440\u044f\u0434\u043e\u043c \u0432 Docker-\u0441\u0435\u0442\u0438 \u0431\u044b\u043b \u043f\u043e\u0434\u043d\u044f\u0442 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 Nginx \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 Mock-\u0441\u0435\u0440\u0432\u0435\u0440\u0430.\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043b\u043e\u0433 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 k6 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u0430:text  \u2588 TOTAL RESULTS     checks_total&#8230;&#8230;.: 1176522 9801.80\/s    checks_succeeded&#8230;: 100.00% 1176522 out of 1176522    checks_failed&#8230;&#8230;: 0.00%   0 out of 1176522    \u2713 status is 200    \u2713 has X-Cache-Status header    HTTP    http_req_duration&#8230;&#8230;&#8230;&#8230;..: avg=40.33ms min=8.4ms  med=36.4ms  max=1.51s p(90)=59.41ms p(95)=69.96ms    http_req_failed&#8230;&#8230;&#8230;&#8230;&#8230;.: 0.00%  0 out of 588261    http_reqs&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.: 588261 4900.90\/s    NETWORK    data_received&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;: 88 MB  736 kB\/s    data_sent&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.: 178 MB 1.5 MB\/s\u0420\u0430\u0437\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0442\u043e\u0432:\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c: \u0428\u043b\u044e\u0437 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0447\u0438\u0441\u0442\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 ~4900 RPS (\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443). \u0412\u0441\u0435\u0433\u043e \u0437\u0430 \u0434\u0432\u0435 \u043c\u0438\u043d\u0443\u0442\u044b \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u043e\u043b\u0435\u0435 588 000&#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-499489","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/499489","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=499489"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/499489\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=499489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=499489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=499489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}