{"id":502160,"date":"2026-11-08T12:36:12","date_gmt":"2026-11-08T09:36:12","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=502160"},"modified":"2026-11-08T12:36:12","modified_gmt":"2026-11-08T09:36:12","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=502160","title":{"rendered":"\u0417\u0430\u00a0\u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0417\u0430\u00a0\u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u0438<\/h2>\n<p>\u0412\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0434\u0430 \u0432\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u0421\u00a0\u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Cursor, Claude Code, GitHub Copilot \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u0444\u0435\u043d\u043e\u043c\u0435\u043d \u00ab\u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430\u00bb (vibe coding): \u0442\u044b \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0448\u044c \u043c\u044b\u0441\u043b\u0438 \u0432\u00a0\u0447\u0430\u0442 \u043d\u0430\u00a0\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043b\u043e\u0432\u0438\u0448\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0437\u0430\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0440\u043e\u0443\u0442\u044b API\u00a0\u2014 \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043f\u0435\u0442\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u00a0\u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0430\u0445 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0445 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u0421\u043f\u043e\u0440\u0438\u0442\u044c \u0441\u00a0\u044d\u0442\u0438\u043c \u0433\u043b\u0443\u043f\u043e: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u0432\u00a0\u0440\u0430\u0437\u044b. \u041d\u043e\u00a0\u0443\u00a0\u044d\u0442\u043e\u0439 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0446\u0435\u043d\u0430: \u0438\u043b\u043b\u044e\u0437\u0438\u044f, \u0447\u0442\u043e\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u00a0\u2014 \u043b\u0438\u0448\u044c \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0435\u0432\u044b\u0439 \u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f (Software Engineering) \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0441\u0443\u0440\u043e\u0432\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e:<\/p>\n<ul>\n<li>\n<p>\u0441\u00a0\u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0441\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u0433\u043e\u043d\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f\u043c\u0438 \u0432\u00a0\u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0441\u00a0\u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0438, \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u043c\u0438 \u0441\u0431\u043e\u044f\u043c\u0438 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u00a0\u043f\u043e\u0432\u0442\u043e\u0440\u0430\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0441\u00a0\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0438 (IDOR\/BOLA), \u0443\u0442\u0435\u0447\u043a\u0430\u043c\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u043e\u0439 \u0447\u0438\u0441\u0442\u043e\u0442\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0441\u00a0\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c\u044e (Observability), \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u0430\u0432\u0448\u0438\u0439 \u0432\u00a0\u0434\u0432\u0430 \u0447\u0430\u0441\u0430 \u043d\u043e\u0447\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u043f\u043e <code>console.log<\/code>, \u0430\u00a0\u043f\u043e\u00a0\u0442\u0440\u0435\u0439\u0441\u0430\u043c \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u00a0\u0440\u0430\u043c\u043a\u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043c\u043e, \u0432\u0430\u0439\u0431\u043a\u043e\u0434 \u0431\u0435\u0437\u00a0\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u0430\u0440\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043e\u043c\u0438\u043a: \u0441\u0435\u0440\u0432\u0438\u0441 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u00a0\u0441\u043e\u0442\u043d\u0435\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0431\u0430\u043b\u0430\u043d\u0441\u044b \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u043c\u0438\u043d\u0443\u0441 \u0438\u0437\u2011\u0437\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438, \u0430\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434, \u043d\u043e\u00a0\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u00a0\u043d\u0435\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a.<\/p>\n<p>\u041d\u0438\u0436\u0435\u00a0\u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u043e\u043f\u0438\u0440\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u043d\u0430\u00a0\u043f\u0440\u0438\u0437\u043d\u0430\u043d\u043d\u0443\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0443 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 (\u041c\u0430\u0440\u0442\u0438\u043d \u041a\u043b\u0435\u043f\u043f\u043c\u0430\u043d, \u041c\u0430\u0439\u043a\u043b \u041d\u0430\u0439\u0433\u0430\u0440\u0434, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 Site Reliability Engineering Google, \u0420\u044d\u043d\u0434\u0430\u043b \u0411\u0440\u0430\u0439\u0430\u043d\u0442 \u0438 \u0414\u044d\u0432\u0438\u0434 \u041e\u2019\u0425\u0430\u043b\u043b\u0430\u0440\u043e\u043d). \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b \u043f\u044f\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u043b\u0430\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044f\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432 \u043e\u0442\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430.<\/p>\n<hr\/>\n<h3>1. \u0416\u0435\u043b\u0435\u0437\u043e, \u041e\u0421, \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434: \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u0434 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 \u0438 \u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0OOM<\/h3>\n<h4>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 Event Loop \u0438 \u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432<\/h4>\n<p>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0432\u00a0\u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u0445 \u0441\u00a0\u0446\u0438\u043a\u043b\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (Node.js, Python asyncio \/ FastAPI) \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b:<\/p>\n<pre><code class=\"javascript\">\/\/ \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0432\u0430\u0439\u0431\u043a\u043e\u0434: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u043e\u0433\u043e JSON \u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0442\u044f\u0436\u0435\u043b\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430app.post('\/import', async (req, res) =&gt; {  const data = fs.readFileSync(req.body.filePath); \/\/ \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u041e\u0421!  const parsed = JSON.parse(data);                 \/\/ \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 Event Loop \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u044b!  for (const item of parsed) {    fs.createReadStream(item.file);                \/\/ \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435!  }  res.json({ status: 'ok' });});<\/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>\u041d\u0430\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441\u00a0\u0444\u0430\u0439\u043b\u043e\u043c \u0432 10\u00a0\u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u043a\u043e\u0434 \u043b\u0435\u0442\u0430\u0435\u0442. \u0412\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 500\u00a0\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442: \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0432\u0435\u0448\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (Event Loop), \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u00a0health\u2011check \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430, \u0430\u00a0\u0442\u044b\u0441\u044f\u0447\u0438 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a\u00a0\u043e\u0448\u0438\u0431\u043a\u0435 <code>EMFILE: too many open files<\/code>.<\/p>\n<h4>1.1. \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044f\u0434\u0440\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b<\/h4>\n<p>\u041b\u044e\u0431\u0430\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u041e\u0421 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0430 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u0440\u0430:<\/p>\n<ul>\n<li>\n<p><strong>User Space (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f)<\/strong>: \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430, \u0433\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b (\u0432\u0430\u0448 Node.js, Python, PostgreSQL). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u00a0\u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u00a0\u0436\u0435\u043b\u0435\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Kernel Space (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044f\u0434\u0440\u0430)<\/strong>: \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 \u0438 \u0434\u0438\u0441\u043a\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041b\u044e\u0431\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0\u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c\u00a0\u2014 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u00a0\u0434\u0438\u0441\u043a\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u00a0\u0441\u043e\u043a\u0435\u0442, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043c\u044f\u0442\u0438\u00a0\u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <strong>\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 (syscall: <\/strong><code><strong>read<\/strong><\/code><strong>, <\/strong><code><strong>write<\/strong><\/code><strong>, <\/strong><code><strong>epoll_wait<\/strong><\/code><strong>)<\/strong>. \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\u00a0\u2014 \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0437\u00a0\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u00a0\u044f\u0434\u0440\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u0440\u0430\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u00a0\u0446\u0438\u043a\u043b\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043c\u0435\u043b\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u00a0\u0444\u0430\u0439\u043b \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0442\u0440\u0430\u0442\u0438\u0442 90% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435\u00a0\u043d\u0430\u00a0\u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0430\u00a0\u043d\u0430\u00a0\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<h4>1.2. \u041c\u043e\u0434\u0435\u043b\u0438 \u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430: \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 I\/O \u043f\u0440\u043e\u0442\u0438\u0432 epoll \u0438 io_uring<\/h4>\n<ul>\n<li>\n<p><strong>\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434 (Blocking I\/O)<\/strong>: \u043f\u043e\u0442\u043e\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>read()<\/code> \u0438\u0437\u00a0\u0441\u043e\u043a\u0435\u0442\u0430 \u0438 \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442. \u042f\u0434\u0440\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043a\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043f\u0430\u043a\u0435\u0442\u044b. \u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0441\u044f\u0442\u044c \u0442\u044b\u0441\u044f\u0447, \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 <code>\u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/code> (Thread\u2011per\u2011Connection) \u043a\u043e\u043d\u0435\u0446: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u043e\u0442 1\u00a0\u0434\u043e 8\u00a0\u041c\u0411 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430\u00a0\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u041e\u0421 \u0437\u0430\u0434\u044b\u0445\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434 \u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (Non\u2011blocking I\/O, epoll \/ kqueue)<\/strong>: \u043e\u0434\u0438\u043d \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0432\u00a0\u044f\u0434\u0440\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>epoll_ctl<\/code> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>epoll_wait<\/code>. \u042f\u0434\u0440\u043e \u0431\u0443\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043e\u043a\u0435\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0431\u0430\u0439\u0442\u044b (\u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e\u00a0\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438). \u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 Event Loop \u0432\u00a0Node.js, Nginx, Redis \u0438 Netty. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0432\u00a0Linux \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <code>epoll<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f\u00a0\u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u043f\u0430\u0439\u043f\u043e\u0432, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u044b \u0432\u0440\u043e\u0434\u0435 Node.js (libuv) \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0443\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u041e\u0421.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u044f\u0434\u0440\u0430: io_uring<\/strong>: \u043d\u043e\u0432\u0435\u0439\u0448\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Linux \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0430\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c. \u042f\u0434\u0440\u043e \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u0434\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u044b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (Submission Queue \u0438 Completion Queue). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0447\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 (\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445, \u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0445) \u0438 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u00a0\u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u044f\u0434\u0440\u0430 (<code>IORING_SETUP_SQPOLL<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Go<\/strong>: \u044f\u0437\u044b\u043a Go \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430. \u0415\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a <img class=\"formula inline\" width=\"0\" height=\"0\"\/> \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0430\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u041e\u0421, \u0430\u00a0\u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u043f\u0430\u0440\u043a\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u043e\u043b\u043b\u0435\u0440 (network poller \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 epoll\/kqueue), \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u043f\u043e\u0442\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p><em>\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e<\/em>: \u0432\u00a0\u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043b\u044e\u0431\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 (<img decoding=\"async\" class=\"formula inline\" source=\"O(N^2)\" alt=\"O(N^2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg\" width=\"53\" height=\"21\" data-width=\"6.606\" data-height=\"2.565\" data-vertical-align=\"-0.566\" style=\"width: 6.606ex; height: 2.565ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u0442\u044f\u0436\u0435\u043b\u043e\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u00a0\u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c ReDoS, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e JSON) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0441\u0435\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u0422\u044f\u0436\u0435\u043b\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u043f\u0443\u043b\u044b \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 (Worker Threads \/ \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u0438).<\/p>\n<\/li>\n<\/ul>\n<h4>1.3. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, Page Faults \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430<\/h4>\n<p>\u041f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u043b\u0430\u043d\u043a\u0430\u043c\u0438 RAM:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 MMU (Memory Management Unit) \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 <strong>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0440\u0430\u0437\u0431\u0438\u0442\u0443\u044e \u043d\u0430\u00a0\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e 4\u00a0\u041a\u0411)<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c (<code>malloc<\/code> \/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430), \u041e\u0421 \u043d\u0435\u00a0\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e: \u043e\u043d\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d. \u041b\u0438\u0448\u044c \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u00a0\u044d\u0442\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043b\u043e\u0432\u0438\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 <strong>Page Fault<\/strong>, \u0438 \u044f\u0434\u0440\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u00a0\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 (Garbage Collection)<\/strong>: <\/p>\n<ul>\n<li>\n<p>\u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440\u044b \u043d\u0430\u0438\u0432\u043d\u043e \u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442, \u0447\u0442\u043e\u00a0\u0432\u00a0\u044f\u0437\u044b\u043a\u0430\u0445 \u0441\u00a0GC (JS, Python, Go, Java) \u0443\u0442\u0435\u0447\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435\u00a0\u0431\u044b\u0432\u0430\u0435\u0442. \u042d\u0442\u043e \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435. GC \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u043e\u0442\u00a0\u043a\u043e\u0440\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438 (GC Roots).<\/p>\n<\/li>\n<li>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u0431\u0435\u0437\u00a0TTL \u0438 \u043b\u0438\u043c\u0438\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0437\u0430\u0431\u044b\u0442\u044b\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (<code>emitter.on<\/code>), \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432\u00a0\u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0445 \u0441\u043a\u043e\u0443\u043f\u0430\u0445\u00a0\u2014 \u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0436\u0438\u0432\u044b\u043c\u0438 \u0432\u0435\u0447\u043d\u043e. \u041f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (RSS\u00a0\u2014 Resident Set Size) \u0440\u0430\u0441\u0442\u0435\u0442, \u041e\u0421 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u00a0SWAP \u043d\u0430\u00a0\u0434\u0438\u0441\u043a (\u0434\u0438\u0447\u0430\u0439\u0448\u0438\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0430), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0437\u0436\u0430\u043b\u043e\u0441\u0442\u043d\u043e \u0443\u0431\u0438\u0432\u0430\u0435\u0442 <strong>Linux OOM Killer<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0443\u0437\u044b Stop\u2011the\u2011World: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u0443\u0447\u0430 (heap) \u0437\u0430\u0431\u0438\u0442\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u043c\u0435\u043b\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0433\u0440\u0430\u0444 \u0441\u0441\u044b\u043b\u043e\u043a, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0441\u043f\u0430\u0439\u043a\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (Latency Spikes) \u043d\u0430\u00a0\u0441\u043e\u0442\u043d\u0438 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>2. \u0414\u0430\u043d\u043d\u044b\u0435, \u0442\u0438\u043f\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438: \u043a\u0430\u043a\u00a0\u043d\u0435\u00a0\u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438<\/h3>\n<h4>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (Lost Update)<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u043e\u0442\u00a0\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0434\u043b\u044f\u00a0\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0438\u043b\u0438\u00a0\u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u043b\u0435\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"typescript\">\/\/ \u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0439\u0431\u043a\u043e\u0434: \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430async function withdrawMoney(userId: string, amount: number) {  const user = await db.user.findUnique({ where: { id: userId } });  if (user.balance &gt;= amount) {    \/\/ \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435!    const newBalance = user.balance - amount;    await db.user.update({      where: { id: userId },      data: { balance: newBalance }    });  }}<\/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>\u0415\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u00a0\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 100\u00a0\u0440\u0443\u0431\u043b\u0435\u0439 \u043f\u0440\u0438\u00a0\u0431\u0430\u043b\u0430\u043d\u0441\u0435 100\u00a0\u0440\u0443\u0431\u043b\u0435\u0439, \u043e\u0431\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u044e\u0442 \u0431\u0430\u043b\u0430\u043d\u0441 100, \u043e\u0431\u0430 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 <code>balance &gt;= amount<\/code>, \u0438 \u043e\u0431\u0430 \u0437\u0430\u043f\u0438\u0448\u0443\u0442 \u0431\u0430\u043b\u0430\u043d\u0441 0. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043f\u0438\u0441\u0430\u043b 200\u00a0\u0440\u0443\u0431\u043b\u0435\u0439 \u043f\u0440\u0438\u00a0\u043d\u0430\u043b\u0438\u0447\u0438\u0438 100. \u042d\u0442\u043e \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f <strong>Lost Update (\u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435)<\/strong>.<\/p>\n<h4>2.1. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u00a0\u043a\u043e\u0434\u0435: O(N) \u043f\u0440\u043e\u0442\u0438\u0432 O(1) \u0438 N+1\u00a0\u0432\u00a0ORM<\/h4>\n<ul>\n<li>\n<p><strong>\u0421\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"O(N^2)\" alt=\"O(N^2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg\" width=\"53\" height=\"21\" data-width=\"6.606\" data-height=\"2.565\" data-vertical-align=\"-0.566\" style=\"width: 6.606ex; height: 2.565ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/strong>: \u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440 \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u043d\u0435\u00a0\u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u00a0\u043a\u0430\u043f\u043e\u0442\u043e\u043c:<\/p>\n<pre><code class=\"javascript\">\/\/ \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f users.filter \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a orders.some -&gt; \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(N * M)const activeUsers = users.filter(user =&gt;   orders.some(order =&gt; order.userId === user.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 icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 10\u202f000\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 10\u202f000\u00a0\u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"10^8\" alt=\"10^8\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4f\/4fe\/4fe556ec9c8619ad69394e7f975f35bd.svg\" width=\"26\" height=\"16\" data-width=\"3.25\" data-height=\"2.05\" data-vertical-align=\"-0.05\" style=\"width: 3.25ex; height: 2.05ex; vertical-align: -0.05ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4f\/4fe\/4fe556ec9c8619ad69394e7f975f35bd.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/4f\/4fe\/4fe556ec9c8619ad69394e7f975f35bd.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043f\u043e\u0434\u0432\u0435\u0441\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434. <em>\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/em>: \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c <code>Set<\/code> \u0438\u043b\u0438 <code>Map<\/code> \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0437\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"O(M)\" alt=\"O(M)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bc\/bcd\/bcd5c16ceda8a689e223d741f045f3ef.svg\" width=\"47\" height=\"18\" data-width=\"5.864\" data-height=\"2.262\" data-vertical-align=\"-0.566\" style=\"width: 5.864ex; height: 2.262ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bc\/bcd\/bcd5c16ceda8a689e223d741f045f3ef.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/bc\/bcd\/bcd5c16ceda8a689e223d741f045f3ef.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0437\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"O(N \\times 1) = O(N)\" alt=\"O(N \\times 1) = O(N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7c\/7cc\/7cc0bf8d998e318f5e7804a6aed8eec7.svg\" width=\"143\" height=\"18\" data-width=\"17.905\" data-height=\"2.262\" data-vertical-align=\"-0.566\" style=\"width: 17.905ex; height: 2.262ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7c\/7cc\/7cc0bf8d998e318f5e7804a6aed8eec7.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7c\/7cc\/7cc0bf8d998e318f5e7804a6aed8eec7.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 N+1\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u00a0ORM<\/strong>: \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434: \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c 100\u00a0\u043f\u043e\u0441\u0442\u043e\u0432, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0432\u00a0\u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <a href=\"http:\/\/post.author.name\" rel=\"noopener nofollow\"><code>post.author.name<\/code><\/a>. ORM \u0434\u0435\u043b\u0430\u0435\u0442 1\u00a0\u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u00a0\u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u043e\u0441\u0442\u043e\u0432 \u0438 \u0437\u0430\u0442\u0435\u043c 100\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 SQL\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u00a0\u043a\u0430\u0436\u0434\u044b\u043c \u0430\u0432\u0442\u043e\u0440\u043e\u043c. \u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0445\u043b\u0435\u0431\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c. <em>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/em>: \u0436\u0430\u0434\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (Eager Loading \u0447\u0435\u0440\u0435\u0437 <code>JOIN<\/code> \/ <code>include<\/code>), \u043b\u0438\u0431\u043e \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0442\u0442\u0435\u0440\u043d DataLoader.<\/p>\n<\/li>\n<\/ul>\n<h4>2.2. \u0422\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445: IEEE 754, UTC \u0438 \u0441\u0445\u0435\u043c\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<\/h4>\n<ul>\n<li>\n<p><strong>\u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430 IEEE 754<\/strong>: \u0412\u00a0\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0447\u0438\u0441\u0435\u043b \u0441\u00a0\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (<code>float<\/code>, <code>double<\/code>, <code>number<\/code> \u0432\u00a0JS) \u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0434\u043e\u043b\u0438 \u0432\u0440\u043e\u0434\u0435 <code>0.1<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0440\u043e\u0431\u044f\u043c\u0438: <code>0.1 + 0.2 === 0.30000000000000004<\/code> \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043b\u0438\u00a0\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u044b \u0432\u043e\u00a0float \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e. \u0424\u0438\u043d\u0430\u043d\u0441\u044b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0432\u00a0\u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445 \u0432\u00a0\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0435\u0434\u0435\u043b\u0438\u043c\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 (\u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u0446\u0435\u043d\u0442\u044b, \u0441\u0430\u0442\u043e\u0448\u0438) \u0447\u0435\u0440\u0435\u0437 <code>BigInt<\/code>, \u043b\u0438\u0431\u043e \u0432\u00a0\u0441\u0442\u0440\u043e\u0433\u043e\u043c \u0442\u0438\u043f\u0435 \u0441\u00a0\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e (<code>DECIMAL \/ NUMERIC<\/code> \u0432\u00a0SQL).<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0438 \u0434\u0430\u0442\u044b<\/strong>: \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0432\u00a0\u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0435\u0437\u00a0\u0442\u0430\u0439\u043c\u0437\u043e\u043d\u044b. \u0412\u0441\u0435 \u0434\u0430\u0442\u044b \u0432\u043e\u00a0\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u00a0\u2014 \u0441\u0442\u0440\u043e\u0433\u043e <strong>UTC \u0432\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0435 ISO 8601\u00a0(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <\/strong><code><strong>2026-11-05T11:27:39Z<\/strong><\/code><strong>)<\/strong> \u043b\u0438\u0431\u043e Unix Epoch Timestamp \u0432\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445. \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u00a0UI.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0445\u0435\u043c\u044b \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (Schema Validation)<\/strong>: TypeScript \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0438\u043f\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0412\u00a0\u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 JSON \u043e\u0442\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e API\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0433\u0440\u044f\u0437\u044c. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0431\u0430\u0439\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u2011\u0441\u0445\u0435\u043c\u044b (Zod, Pydantic, TypeBox) \u0434\u043e\u00a0\u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0432\u00a0\u0434\u043e\u043c\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<h4>2.3. \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u00a0\u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: B\u2011Tree, Hash, GIN<\/h4>\n<p>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043f\u0440\u0438\u00a0\u043b\u044e\u0431\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441 <code>WHERE<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <strong>Sequential Scan (\u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b)<\/strong>: \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u00a0\u0434\u0438\u0441\u043a\u0430 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u0430 1000\u00a0\u0441\u0442\u0440\u043e\u043a \u044d\u0442\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u043d\u0430 10\u00a0\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u0445\u00a0\u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<ul>\n<li>\n<p><strong>B\u2011Tree (B\u2011\u0434\u0435\u0440\u0435\u0432\u043e)<\/strong>: \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0421\u0423\u0411\u0414 (PostgreSQL, MySQL). \u0421\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u00a0\u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u00a0\u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0434\u0438\u0441\u043a\u0430. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f\u00a0\u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"O(\\log N)\" alt=\"O(\\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/70\/706\/70664169d1bc6295401283e5520056e1.svg\" width=\"70\" height=\"18\" data-width=\"8.764\" data-height=\"2.262\" data-vertical-align=\"-0.566\" style=\"width: 8.764ex; height: 2.262ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/70\/706\/70664169d1bc6295401283e5520056e1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/70\/706\/70664169d1bc6295401283e5520056e1.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c (<code>WHERE age BETWEEN 20 AND 30<\/code>) \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (<code>ORDER BY<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>Hash\u2011\u0438\u043d\u0434\u0435\u043a\u0441<\/strong>: \u0445\u0440\u0430\u043d\u0438\u0442 32-\u0431\u0438\u0442\u043d\u044b\u0439 \u0445\u0435\u0448 \u043e\u0442\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u00a0\u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e (<code>=<\/code>), \u043d\u0435\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443, \u043d\u043e\u00a0\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 B\u2011Tree \u043f\u0440\u0438\u00a0\u043f\u043e\u0438\u0441\u043a\u0435 \u043f\u043e\u00a0\u0434\u043b\u0438\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c (\u0434\u043b\u0438\u043d\u043d\u044b\u043c URL, \u0442\u043e\u043a\u0435\u043d\u0430\u043c, \u0445\u0435\u0448\u0430\u043c SHA-256).<\/p>\n<\/li>\n<li>\n<p><strong>GIN (Generalized Inverted Index)<\/strong>: \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441. \u041a\u0430\u0440\u0442\u0430, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 (\u0441\u043b\u043e\u0432\u0443 \u0432\u00a0\u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435 \u0438\u043b\u0438\u00a0\u043a\u043b\u044e\u0447\u0443 \u0432\u00a0JSONB) \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a, \u0433\u0434\u0435 \u043e\u043d \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f. \u041d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0434\u043b\u044f\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 JSONB\u2011\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.<\/p>\n<\/li>\n<li>\n<p><em>\u0426\u0435\u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432<\/em>: \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00a0\u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0421\u0423\u0411\u0414 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>INSERT<\/code>, <code>UPDATE<\/code> \u0438 <code>DELETE<\/code>. \u041d\u0430\u0432\u0435\u0441\u0438\u0442\u044c 15\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443\u00a0\u2014 \u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<\/li>\n<\/ul>\n<h4>2.4. ACID, \u0443\u0440\u043e\u0432\u043d\u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438<\/h4>\n<ul>\n<li>\n<p><strong>ACID<\/strong>: <\/p>\n<ul>\n<li>\n<p><em>Atomicity (\u0410\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c)<\/em>: \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043b\u0438\u0431\u043e \u043d\u0435\u00a0\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><em>Consistency (\u0421\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c)<\/em>: \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0411\u0414 \u0438\u0437\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u00a0\u0434\u0440\u0443\u0433\u043e\u0435 \u0441\u00a0\u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 (foreign keys, check constraints).<\/p>\n<\/li>\n<li>\n<p><em>Isolation (\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f)<\/em>: \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u044b \u043b\u043e\u043c\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p><em>Durability (\u0414\u043e\u043b\u0433\u043e\u0432\u0435\u0447\u043d\u043e\u0441\u0442\u044c)<\/em>: \u0435\u0441\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u0430, \u0435\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435\u00a0\u043f\u0440\u043e\u043f\u0430\u0434\u0435\u0442 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u00a0\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u00a0\u0436\u0443\u0440\u043d\u0430\u043b \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 WAL\u00a0\u2014 Write\u2011Ahead Logging).<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0410\u043d\u043e\u043c\u0430\u043b\u0438\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/strong>: <\/p>\n<ul>\n<li>\n<p><em>Dirty Read (\u0413\u0440\u044f\u0437\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435)<\/em>: \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0410\u00a0\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u0411, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f (Rollback).<\/p>\n<\/li>\n<li>\n<p><em>Non\u2011repeatable Read (\u041d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u0435\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435)<\/em>: \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0410\u00a0\u0434\u0432\u0430\u0436\u0434\u044b \u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e\u00a0\u043c\u0435\u0436\u0434\u0443 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0411 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0435 \u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><em>Phantom Read (\u0424\u0430\u043d\u0442\u043e\u043c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435)<\/em>: \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0410\u00a0\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u0442\u0440\u043e\u043a, \u0430\u00a0\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0411 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043f\u043e\u0434\u00a0\u0443\u0441\u043b\u043e\u0432\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0423\u0440\u043e\u0432\u043d\u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 (SQL Standard)<\/strong>: <code>Read Uncommitted -&gt; Read Committed (\u0434\u0435\u0444\u043e\u043b\u0442 \u0432 PostgreSQL) -&gt; Repeatable Read -&gt; Serializable<\/code>. \u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438, \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0438 \u0432\u044b\u0448\u0435 \u0440\u0438\u0441\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 <code>Serialization Failure<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b Lost Update<\/strong>: <\/p>\n<ol>\n<li>\n<p><em>\u041f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 (Pessimistic Locking)<\/em>: <code>SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;<\/code> \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0421\u0423\u0411\u0414 \u0434\u043e\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u0414\u0440\u0443\u0433\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0436\u0434\u0443\u0442 \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<\/li>\n<li>\n<p><em>\u041e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 (Optimistic Locking)<\/em>: \u0412\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0438: <code>UPDATE accounts SET balance = balance - 100, version = version + 1 WHERE id = 1 AND version = 5;<\/code> \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u043b\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0435\u0440\u0432\u043e\u0439, \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <code>version = 5<\/code> \u043d\u0435\u00a0\u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u043d\u043e\u0432\u0438\u0442 0\u00a0\u0441\u0442\u0440\u043e\u043a, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><em>\u0410\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u00a0SQL<\/em>: <code>UPDATE accounts SET balance = balance - 100 WHERE id = 1 AND balance &gt;= 100;<\/code><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>3. \u0421\u0435\u0442\u0438 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b, \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u0441\u0431\u043e\u0438<\/h3>\n<h4>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0433\u043e\u043b\u044b\u0439 fetch \u0438 \u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f<\/h4>\n<p>\u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440 \u043f\u0438\u0448\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0441\u0435\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u0430:<\/p>\n<pre><code class=\"typescript\">\/\/ \u041e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u0430\u0439\u0431\u043a\u043e\u0434: \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0443\u043b\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439async function processPayment(orderId: string) {  \/\/ 1. \u041d\u0435\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430! \u0415\u0441\u043b\u0438 \u043f\u043b\u0430\u0442\u0435\u0436\u043d\u044b\u0439 \u0448\u043b\u044e\u0437 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442, \u043f\u0440\u043e\u043c\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u0432\u0435\u0447\u043d\u043e  const response = await fetch('https:\/\/payment-gateway\/charge', {    method: 'POST',    body: JSON.stringify({ orderId, amount: 500 })  });  \/\/ 2. \u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0442\u0440\u0430\u0439: \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u0441\u044f \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443, \u043d\u043e \u0448\u043b\u044e\u0437 \u0434\u0435\u043d\u044c\u0433\u0438 \u0441\u043d\u044f\u043b,  \/\/ \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u043d\u0438\u043c\u0435\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437!}<\/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<h4>3.1. \u0417\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u00a0\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 (Fallacies of Distributed Computing)<\/h4>\n<p>\u0415\u0449\u0435 \u0432 1990-\u0445 \u0433\u043e\u0434\u0430\u0445 \u041f\u0438\u0442\u0435\u0440 \u0414\u043e\u0439\u0447 \u0438 \u0414\u0436\u0435\u0439\u043c\u0441 \u0413\u043e\u0441\u043b\u0438\u043d\u0433 \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 8\u00a0\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0440\u044f\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u0421\u0435\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430 (\u0441\u043b\u0435\u043f\u043e\u0435 \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u043a\u00a0\u0442\u0440\u0430\u0444\u0438\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u0431\u0435\u0437\u00a0mTLS \u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 Zero Trust).<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0435\u0442\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u00a0\u0441\u0435\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 (\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0443\u00a0\u0432\u043d\u0435\u0448\u043d\u0438\u0445 API, \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0438 \u043c\u0430\u0433\u0438\u0441\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438).<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0442\u044c \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u00a0\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 <strong>\u0441\u0435\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0443\u043f\u0430\u0434\u0435\u0442, \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f, \u0430\u00a0\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432\u044b\u0440\u0430\u0441\u0442\u0443\u0442<\/strong>. \u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u00a0\u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0430\u00a0\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u043e\u0442\u043a\u0430\u0437\u044b (Partial Failures).<\/p>\n<h4>3.2. \u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043f\u043e\u00a0\u041c\u0430\u0439\u043a\u043b\u0443 \u041d\u0430\u0439\u0433\u0430\u0440\u0434\u0443 (Release It!)<\/h4>\n<ul>\n<li>\n<p><strong>\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b (Timeouts)<\/strong>: \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0431\u044f\u0437\u0430\u043d \u0438\u043c\u0435\u0442\u044c \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0442\u0430\u0439\u043c\u2011\u0430\u0443\u0442 (Connection Timeout \u0438 Read\/Socket Timeout). \u0411\u0435\u0437\u00a0\u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0432\u0438\u0441\u0448\u0438\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u044a\u0435\u0441\u0442 \u0432\u0441\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0443\u043b\u0430, \u0432\u044b\u0437\u0432\u0430\u0432 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 (Cascading Failure) \u0432\u0441\u0435\u0439 \u0432\u0430\u0448\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u00a0\u0434\u0436\u0438\u0442\u0442\u0435\u0440\u043e\u043c (Exponential Backoff + Jitter)<\/strong>: \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0443\u043f\u0430\u0432\u0448\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0440\u0430\u0437\u0443\u00a0\u0436\u0435\u00a0\u2014 \u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u0442\u0430\u043a\u0443 \u0442\u0438\u043f\u0430 \u00ab\u043e\u0442\u043a\u0430\u0437 \u0432\u00a0\u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438\u00bb (Self\u2011inflicted DDoS) \u043d\u0430\u00a0\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441. \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0441\u0442\u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e (<img decoding=\"async\" class=\"formula inline\" source=\"2^n\" alt=\"2^n\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d1\/d1d\/d1db0d9c696a8c056e7117dbbb4ef6db.svg\" width=\"18\" height=\"13\" data-width=\"2.279\" data-height=\"1.641\" style=\"width: 2.279ex; height: 1.641ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d1\/d1d\/d1db0d9c696a8c056e7117dbbb4ef6db.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d1\/d1d\/d1db0d9c696a8c056e7117dbbb4ef6db.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u0435\u043a\u0443\u043d\u0434) \u0441\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430 (Jitter): <code>sleep_time = min(max_delay, base * 2^attempt) + random_jitter<\/code> \u0414\u0436\u0438\u0442\u0442\u0435\u0440 \u0440\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0438\u043a\u043e\u0432\u044b\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u043e\u0442\u0435\u043d \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0441\u0442\u0430\u0434\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u00bb (Thundering Herd Problem).<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c (Circuit Breaker)<\/strong>: \u041f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u043e\u044f\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441. \u0418\u043c\u0435\u0435\u0442 \u0442\u0440\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: <\/p>\n<ul>\n<li>\n<p><em>Closed (\u0437\u0430\u043c\u043a\u043d\u0443\u0442)<\/em>: \u0432\u044b\u0437\u043e\u0432\u044b \u0438\u0434\u0443\u0442 \u0448\u0442\u0430\u0442\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><em>Open (\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442)<\/em>: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u0437\u043c\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 (Fast Fail), \u0434\u0430\u0436\u0435 \u043d\u0435\u00a0\u043f\u044b\u0442\u0430\u044f\u0441\u044c \u0441\u043b\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u00a0\u043c\u0435\u0440\u0442\u0432\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443.<\/p>\n<\/li>\n<li>\n<p><em>Half\u2011Open (\u043f\u043e\u043b\u0443\u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442)<\/em>: \u043f\u043e\u00a0\u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>3.3. \u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u043b\u044e\u0447\u0438 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 (Idempotency Keys)<\/h4>\n<p>\u0412\u00a0\u0441\u0435\u0442\u044f\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>At\u2011most\u2011once (\u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430): \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f, \u043d\u043e\u00a0\u0434\u0443\u0431\u043b\u0435\u0439 \u043d\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>At\u2011least\u2011once (\u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430): \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435\u00a0\u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f, \u043d\u043e\u00a0\u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u044b \u0434\u0443\u0431\u043b\u0438 \u0438\u0437\u2011\u0437\u0430 \u0440\u0435\u0442\u0440\u0430\u0435\u0432.<\/p>\n<\/li>\n<li>\n<p>Exactly\u2011once (\u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437): \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u0430 \u0432\u00a0\u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u00a0\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0431\u0435\u0437\u00a0\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u00a0\u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a\u00a0\u0442\u043e\u043c\u0443\u00a0\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443, \u0447\u0442\u043e\u00a0\u0438 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 (<img decoding=\"async\" class=\"formula inline\" source=\"f(f(x)) = f(x)\" alt=\"f(f(x)) = f(x)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/aa\/aa7\/aa7fb72fb379442b26f3c7af68aba805.svg\" width=\"117\" height=\"18\" data-width=\"14.619\" data-height=\"2.262\" data-vertical-align=\"-0.566\" style=\"width: 14.619ex; height: 2.262ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/aa\/aa7\/aa7fb72fb379442b26f3c7af68aba805.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a\/aa\/aa7\/aa7fb72fb379442b26f3c7af68aba805.svg 781w\" loading=\"lazy\" decode=\"async\"\/>).<\/p>\n<ul>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b HTTP <code>GET<\/code>, <code>PUT<\/code>, <code>DELETE<\/code> \u043f\u043e\u00a0\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438. \u041c\u0435\u0442\u043e\u0434 <code>POST<\/code> \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Idempotency\u2011Key<\/strong>: \u043a\u043b\u0438\u0435\u043d\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 UUID \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u0433\u043e \u0432\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <code>Idempotency-Key<\/code>. \u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043b\u044e\u0447 \u0432\u00a0\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0441\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u0440\u0438\u00a0\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u00a0\u0442\u0435\u043c\u00a0\u0436\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0438\u0437\u00a0\u043a\u044d\u0448\u0430\/\u0411\u0414, \u043d\u0435\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><em>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442\u00a0\u0433\u043e\u043d\u043a\u0438 \u0441\u0430\u043c\u0438\u0445 \u0440\u0435\u0442\u0440\u0430\u0435\u0432<\/em>: \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u00a0\u043a\u043b\u044e\u0447\u043e\u043c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0411\u0414 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c <code>IN_PROGRESS<\/code> \u0434\u043e\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u0443\u0431\u043b\u044c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u0441\u044f \u043f\u043e\u00a0\u043a\u043e\u0440\u043e\u0442\u043a\u043e\u043c\u0443 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u0438 \u0442\u0443\u0442\u00a0\u0436\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b \u0432\u044b\u0437\u043e\u0432), \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 <code>409 Conflict<\/code> (\u0438\u043b\u0438 \u0434\u043e\u0436\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443), \u043d\u0435\u00a0\u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439\u00a0\u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<h4>3.4. \u0422\u0435\u043e\u0440\u0435\u043c\u0430 CAP, PACELC \u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d Transactional Outbox<\/h4>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u043e\u0440\u0435\u043c\u0430 CAP (\u042d\u0440\u0438\u043a \u0411\u0440\u044e\u044d\u0440)<\/strong>: \u043f\u0440\u0438\u00a0\u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0438 (Partition Tolerance <img decoding=\"async\" class=\"formula inline\" source=\"P\" alt=\"P\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/44\/44c\/44c29edb103a2872f519ad0c9a0fdaaa.svg\" width=\"14\" height=\"12\" data-width=\"1.699\" data-height=\"1.545\" style=\"width: 1.699ex; height: 1.545ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/44\/44c\/44c29edb103a2872f519ad0c9a0fdaaa.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/44\/44c\/44c29edb103a2872f519ad0c9a0fdaaa.svg 781w\" loading=\"lazy\" decode=\"async\"\/>), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u00a0\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u044f\u0445 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e: <\/p>\n<ul>\n<li>\n<p>\u041b\u0438\u0431\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c (<strong>Consistency <img decoding=\"async\" class=\"formula inline\" source=\"C\" alt=\"C\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0d\/0d6\/0d61f8370cad1d412f80b84d143e1257.svg\" width=\"14\" height=\"13\" data-width=\"1.719\" data-height=\"1.645\" data-vertical-align=\"-0.05\" style=\"width: 1.719ex; height: 1.645ex; vertical-align: -0.05ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0d\/0d6\/0d61f8370cad1d412f80b84d143e1257.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0d\/0d6\/0d61f8370cad1d412f80b84d143e1257.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/strong>): \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u043e\u0442\u0434\u0430\u044e\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043b\u0438\u0431\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u0431\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c (<strong>Availability <img decoding=\"async\" class=\"formula inline\" source=\"A\" alt=\"A\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7f\/7fc\/7fc56270e7a70fa81a5935b72eacbe29.svg\" width=\"14\" height=\"13\" data-width=\"1.697\" data-height=\"1.62\" style=\"width: 1.697ex; height: 1.62ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7f\/7fc\/7fc56270e7a70fa81a5935b72eacbe29.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7f\/7fc\/7fc56270e7a70fa81a5935b72eacbe29.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/strong>): \u043b\u044e\u0431\u043e\u0439 \u0437\u0434\u043e\u0440\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u043d\u043e\u00a0\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0422\u0435\u043e\u0440\u0435\u043c\u0430 PACELC (\u0414\u0430\u043d\u0438\u044d\u043b\u044c \u0410\u0431\u0430\u0434\u0438)<\/strong>: \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0442\u0435\u043e\u0440\u0435\u043c\u0443 CAP \u043d\u0430\u00a0\u0448\u0442\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0435\u0442\u0438 (<strong>P<\/strong>artition), \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c\u044e (<strong>A<\/strong>vailability) \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e (<strong>C<\/strong>onsistency); \u043d\u043e\u00a0\u0438\u043d\u0430\u0447\u0435 (<strong>E<\/strong>lse), \u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e, \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u0437\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0430 (<strong>L<\/strong>atency) \u0438 \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e (<strong>C<\/strong>onsistency), \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (Dual\u2011Write Problem)<\/strong>:<\/p>\n<pre><code class=\"typescript\">\/\/ \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0411\u0414 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044cawait db.order.create(order);await kafka.send('order-created', order); \/\/ \u0415\u0441\u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0441\u0431\u043e\u0439 \u0441\u0435\u0442\u0438, \u0437\u0430\u043a\u0430\u0437 \u0432 \u0411\u0414 \u0435\u0441\u0442\u044c, \u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435\u0442!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u0442\u0442\u0435\u0440\u043d Transactional Outbox<\/strong>: \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u041e\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u0443\u00a0\u0436\u0435 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u00a0\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>outbox<\/code> \u0432\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 <strong>\u0435\u0434\u0438\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 ACID<\/strong> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u00a0\u0437\u0430\u043a\u0430\u0437\u043e\u043c. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (Debezium \u0447\u0435\u0440\u0435\u0437 \u0447\u0442\u0435\u043d\u0438\u0435 WAL\u2011\u043b\u043e\u0433\u043e\u0432 \u0438\u043b\u0438\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u043b\u043b\u0435\u0440) \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>outbox<\/code> \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u00a0Kafka\/RabbitMQ \u0441\u00a0\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439 at\u2011least\u2011once.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>4. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0432\u00a0\u044d\u043f\u043e\u0445\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 BOLA\/IDOR \u0438 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h4>\n<p>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043d\u0430\u00a0\u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0438\u0448\u0443\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043d\u043e\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a:<\/p>\n<pre><code class=\"typescript\">\/\/ \u041e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u0430\u0439\u0431\u043a\u043e\u0434: Broken Object Level Authorization (IDOR)app.get('\/api\/orders\/:id', authenticateJWT, async (req, res) =&gt; {  \/\/ \u041a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b, \u0447\u0442\u043e \u044e\u0437\u0435\u0440 \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0435\u043d, \u043d\u043e \u041d\u0415 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0437\u0430\u043a\u0430\u0437 \u044d\u0442\u043e\u043c\u0443 \u044e\u0437\u0435\u0440\u0443!  const order = await db.order.findUnique({ where: { id: req.params.id } });  res.json(order);});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041b\u044e\u0431\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0447\u0443\u0436\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0432\u00a0URL \u0438 \u0432\u044b\u043a\u0430\u0447\u0430\u0442\u044c \u0432\u0441\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432.<\/p>\n<h4>4.1. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0435\u0431\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (OWASP Top 10)<\/h4>\n<ul>\n<li>\n<p><strong>BOLA \/ IDOR (Broken Object Level Authorization)<\/strong>: \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u043e\u043c\u0435\u0440 1\u00a0\u0432\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 API. \u041b\u044e\u0431\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0443 \u043f\u043e\u00a0\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f: <code>SELECT * FROM orders WHERE id = :id AND user_id = :current_user_id<\/code><\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u0438 (SQL \/ Command Injection)<\/strong>: \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u0432\u00a0\u0442\u0435\u043b\u043e SQL\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043b\u0438\u00a0\u0432\u044b\u0437\u043e\u0432 shell\u2011\u043a\u043e\u043c\u0430\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 <code>exec(cmd + input)<\/code>\u00a0\u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0437\u043b\u043e\u043c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b (Prepared Statements)<\/strong>, \u0433\u0434\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0434\u0432\u0438\u0436\u043e\u043a \u0411\u0414 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u00a0\u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 SQL.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0442\u0435\u0447\u043a\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438 CORS<\/strong>: <\/p>\n<ul>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 API\u2011\u043a\u043b\u044e\u0447\u0435\u0439 \u0432\u00a0\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c SPA\u2011\u043a\u043e\u0434\u0435 (React\/Vue \u0431\u0430\u043d\u0434\u043b\u044b). \u0412\u0441\u0435, \u0447\u0442\u043e\u00a0\u043f\u043e\u043f\u0430\u043b\u043e \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 <code>DevTools -&gt; Sources<\/code>.<\/p>\n<\/li>\n<li>\n<p>CORS (Cross\u2011Origin Resource Sharing)\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u0449\u0438\u0442\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442\u00a0\u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432, \u0430\u00a0\u043d\u0435\u00a0\u0437\u0430\u0449\u0438\u0442\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u0442\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 curl \u0438\u043b\u0438\u00a0Postman.<\/p>\n<\/li>\n<li>\n<p><em>\u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u00a0LLM<\/em>: \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0441\u0438\u0442 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u00ab\u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 CORS\u00bb, \u0442\u0430 \u0447\u0430\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0435\u0440\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 Origin (\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <code>origin: true<\/code> \u0438\u043b\u0438 <code>origin: req.headers.origin<\/code> \u0432\u00a0\u043f\u0430\u043a\u0435\u0442\u0435 cors) \u0432\u00a0\u043f\u0430\u0440\u0435 \u0441 <code>Access-Control-Allow-Credentials: true<\/code>. \u0411\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u043f\u043e\u00a0\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Fetch \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e <code>Access-Control-Allow-Origin: *<\/code> \u0441\u00a0\u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u043e\u00a0\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u044d\u0445\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u043e\u0433\u043e origin \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0435 \u043a\u0443\u043a\u0438 \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 API \u0436\u0435\u0440\u0442\u0432\u044b \u0434\u043b\u044f\u00a0\u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>4.2. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438 \u0441\u0435\u0441\u0441\u0438\u0439<\/h4>\n<ul>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u0435\u0439: \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b SHA-256\u00a0\u0438\u043b\u0438\u00a0MD5\u00a0\u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u043e\u043b\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f\u00a0\u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c. \u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b SHA-256\u00a0\u0432\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041f\u0430\u0440\u043e\u043b\u0438 \u0445\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u0441\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438: <strong>Argon2id<\/strong> (\u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c Password Hashing Competition) \u043b\u0438\u0431\u043e <strong>bcrypt \/ scrypt<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 JWT: \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 <code>localStorage<\/code> \u043e\u043f\u0430\u0441\u043d\u043e\u00a0\u2014 \u043b\u044e\u0431\u0430\u044f XSS\u2011\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c (\u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u0443\u044f\u0437\u0432\u0438\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043a\u0440\u0430\u0441\u0442\u044c \u0442\u043e\u043a\u0435\u043d. \u0422\u043e\u043a\u0435\u043d\u044b \u0441\u0435\u0441\u0441\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u00a0cookies \u0441\u00a0\u0444\u043b\u0430\u0433\u0430\u043c\u0438 <code><strong>HttpOnly<\/strong><\/code><strong> (JS \u043d\u0435\u00a0\u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u00a0\u043a\u0443\u043a\u0435), <\/strong><code><strong>Secure<\/strong><\/code><strong> (\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u00a0HTTPS) \u0438 <\/strong><code><strong>SameSite=Strict\/Lax<\/strong><\/code><strong> (\u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442\u00a0CSRF)<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h4>4.3. \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u0440\u0438\u0441\u043a\u0438 \u0438 \u0430\u0442\u0430\u043a\u0438 Slopsquatting<\/h4>\n<ul>\n<li>\n<p><strong>LGPL (Lesser General Public License)<\/strong>: \u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e GPL, LGPL \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u00a0\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0431\u0435\u0437\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043e\u0434 \u0438\u043b\u0438\u00a0\u0432\u043d\u0435\u0441\u0435\u0442\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u00a0\u0441\u0430\u043c\u0443 LGPL\u2011\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0442\u0430\u043a\u0438 \u043d\u0430\u00a0\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a \u0447\u0435\u0440\u0435\u0437 AI: Slopsquatting<\/strong>: \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441\u043a\u043b\u043e\u043d\u043d\u044b \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 <code>fast-jwt-validator<\/code>). \u0417\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u044d\u0442\u0438 \u0438\u043c\u0435\u043d\u0430 \u0432\u00a0\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0435\u0441\u0442\u0440\u0430\u0445 (npm, PyPI) \u0438 \u0432\u0448\u0438\u0432\u0430\u044e\u0442 \u0442\u0443\u0434\u0430 \u0442\u0440\u043e\u044f\u043d\u044b. \u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440 \u0431\u0435\u0437\u0434\u0443\u043c\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>npm install fast-jwt-validator<\/code> \u0438\u0437\u00a0\u0447\u0430\u0442\u0430 \u0441\u00a0LLM \u0438 \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. <em>\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e<\/em>: \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0445\u044d\u0448\u0435\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 Lockfiles (<code>package-lock.json<\/code>, <code>poetry.lock<\/code>), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u043a\u0441\u0438\u2011\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0443\u0434\u0438\u0442 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (Snyk, Trivy, Dependabot).<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>5. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c (Observability)<\/h3>\n<h4>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u043a\u043e\u043c \u0433\u0440\u044f\u0437\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u0438\u043d\u0442\u0430\u043c\u0438<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0430\u043c\u0438 \u043f\u043e\u00a0\u0447\u0430\u0441\u0442\u044f\u043c, \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <strong>Big Ball of Mud (\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043c \u0433\u0440\u044f\u0437\u0438)<\/strong>:<\/p>\n<ul>\n<li>\n<p>SQL\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043d\u044b \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 UI\u2011\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438\u00a0\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043f\u044f\u0442\u044c \u043d\u0435\u00a0\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u00a0\u043d\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (\u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c\u00a0\u2014 Tight Coupling).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u00a0\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <code>console.log('HERE 1')<\/code>, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0433\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<\/li>\n<\/ul>\n<h4>5.1. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c\u044e: Cohesion, Coupling \u0438 \u0447\u0438\u0441\u0442\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<ul>\n<li>\n<p><strong>\u0417\u0430\u0446\u0435\u043f\u043b\u0435\u043d\u0438\u0435 (Cohesion)<\/strong>: \u0441\u0442\u0435\u043f\u0435\u043d\u044c, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0434\u0440\u0443\u0433 \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u043c. \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0448\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 (Single Responsibility).<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c (Coupling)<\/strong>: \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u0440\u0443\u0433 \u043e\u0442\u00a0\u0434\u0440\u0443\u0433\u0430. \u0426\u0435\u043b\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u0430\u00a0\u2014 <strong>Low Coupling (\u0441\u043b\u0430\u0431\u0430\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c)<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (Dependency Inversion, D \u0438\u0437\u00a0SOLID)<\/strong>: \u0412\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442\u00a0\u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432 (\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435\u0436\u043a\u0438, \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b). \u041e\u0431\u0430 \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 (\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432\/\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432). <em>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430<\/em>: \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>PaymentGateway<\/code>. \u0412\u00a0\u0442\u0435\u0441\u0442\u0430\u0445 \u0442\u0443\u0434\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>MockPaymentGateway<\/code>, \u0432\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435\u00a0\u2014 <code>StripePaymentGateway<\/code>. \u041a\u043e\u0434 \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0435\u00a0\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0438 \u043d\u0430\u00a0\u0441\u0442\u0440\u043e\u0447\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<h4>5.2. \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: C4\u00a0Model \u0421\u0430\u0439\u043c\u043e\u043d\u0430 \u0411\u0440\u0430\u0443\u043d\u0430<\/h4>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u0431\u043b\u043e\u043a\u2011\u0441\u0445\u0435\u043c 1990-\u0445 \u0433\u043e\u0434\u043e\u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c <strong>C4\u00a0(<\/strong><a href=\"http:\/\/c4model.com\" rel=\"noopener nofollow\"><strong>c4model.com<\/strong><\/a><strong>)<\/strong>\u00a0\u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u00a0\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441\u00a0Google Maps:<\/p>\n<ol>\n<li>\n<p><strong>Context (\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442)<\/strong>: \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u041a\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0441\u00a0\u043a\u0430\u043a\u0438\u043c\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043e\u043d\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Containers (\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b)<\/strong>: \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0435\u0434\u0438\u043d\u0438\u0446\u044b. Single Page App \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, API \u043d\u0430\u00a0Go, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL, \u043e\u0447\u0435\u0440\u0435\u0434\u044c Redis.<\/p>\n<\/li>\n<li>\n<p><strong>Components (\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b)<\/strong>: \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0438, \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>Code (\u041a\u043e\u0434)<\/strong>: \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u043b\u0438\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (\u043d\u0443\u0436\u043d\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0437\u043b\u043e\u0432).<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438\u00a0\u2014 <strong>ADR (Architecture Decision Records)<\/strong>: \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441.<\/p>\n<h4>5.3. \u0412\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u00a0\u044d\u043f\u043e\u0445\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430: \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 Property\u2011Based \u0442\u0435\u0441\u0442\u044b<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 500\u00a0\u0441\u0442\u0440\u043e\u043a \u0432\u00a0\u043c\u0438\u043d\u0443\u0442\u0443, \u0443\u0437\u043a\u0438\u043c \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0430 <strong>\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0435\u0433\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/strong>: <\/p>\n<ul>\n<li>\n<p><em>Unit\u2011\u0442\u0435\u0441\u0442\u044b<\/em>: \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0447\u0438\u0441\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0431\u0435\u0437\u00a0\u0441\u0435\u0442\u0438 \u0438 \u0411\u0414.<\/p>\n<\/li>\n<li>\n<p><em>Integration\u2011\u0442\u0435\u0441\u0442\u044b<\/em>: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c (\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 Docker\u2011\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 Testcontainers).<\/p>\n<\/li>\n<li>\n<p><em>End\u2011to\u2011End (E2E)<\/em>: \u0441\u043a\u0432\u043e\u0437\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u0443\u0442\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 (Property\u2011Based Testing\u00a0\u2014 QuickCheck, Fast\u2011Check, Hypothesis)<\/strong>: \u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440 \u043f\u0438\u0448\u0435\u0442 2\u20133\u00a0\u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 unit\u2011\u0442\u0435\u0441\u0442\u0430 \u043d\u0430\u00a0\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0430\u043c. Property\u2011based \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u00a0\u0434\u0435\u0441\u044f\u0442\u043a\u0430\u0445 \u0442\u044b\u0441\u044f\u0447 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u0443\u043b\u0435\u0432\u044b\u0435 \u0431\u0430\u0439\u0442\u044b, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 <code>MAX_INT<\/code>, \u0441\u0442\u0440\u043e\u043a\u0438 Unicode \u0441\u043e \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0430\u043c\u0438 \u0438 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u0430\u043c\u0438). \u042d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0438 LLM.<\/p>\n<\/li>\n<\/ul>\n<h4>5.4. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c (Observability) \u043f\u043e\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c Google SRE<\/h4>\n<p>\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u0442\u0440\u0435\u0445 \u0441\u0442\u043e\u043b\u043f\u0430\u0445 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>: \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a <code>print('User error')<\/code>. \u041b\u043e\u0433\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432\u00a0\u0441\u0442\u0440\u043e\u0433\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON \u0441\u00a0\u0435\u0434\u0438\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 (<code>timestamp<\/code>, <code>level<\/code>, <code>service_name<\/code>, <code>trace_id<\/code>, <code>user_id<\/code>, <code>error_stack<\/code>). \u0422\u0430\u043a\u0438\u0435 \u043b\u043e\u0433\u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u00a0ClickHouse\/Elasticsearch.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u043f\u0435\u0440\u0446\u0435\u043d\u0442\u0438\u043b\u0438<\/strong>:<\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<p>\u0418\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <em>\u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 (Average \/ Mean)<\/em>\u00a0\u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0415\u0441\u043b\u0438 \u0443 99\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 10\u00a0\u043c\u0441, \u0430\u00a0\u0443\u00a0\u043e\u0434\u043d\u043e\u0433\u043e\u00a0\u2014 10\u00a0\u0441\u0435\u043a\u0443\u043d\u0434, \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u00ab\u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u044b\u0435\u00bb 110\u00a0\u043c\u0441, \u0441\u043a\u0440\u044b\u0432 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0443 1% \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e <strong>\u043f\u0435\u0440\u0446\u0435\u043d\u0442\u0438\u043b\u044f\u043c (Percentiles)<\/strong>: <\/p>\n<ul>\n<li>\n<p><code>p50<\/code> (\u043c\u0435\u0434\u0438\u0430\u043d\u0430): \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code>p95 \/ p99<\/code>: \u0445\u0443\u0434\u0448\u0438\u0439 \u043e\u043f\u044b\u0442 5% \u0438 1% \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0445\u0432\u043e\u0441\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \/ Tail Latency). \u0418\u043c\u0435\u043d\u043d\u043e \u0432\u00a0p99\u00a0\u043f\u0440\u044f\u0447\u0443\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0411\u0414 \u0438 \u0441\u043f\u0430\u0439\u043a\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f <strong>RED<\/strong> \u0434\u043b\u044f\u00a0\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432: Rate (\u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 RPS), Errors (\u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0448\u0438\u0431\u043e\u043a), Duration (\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u00a0\u043f\u0435\u0440\u0446\u0435\u043d\u0442\u0438\u043b\u044f\u043c).<\/p>\n<\/li>\n<\/ul>\n<ol start=\"3\">\n<li>\n<p><strong>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 (Distributed Tracing \/ OpenTelemetry)<\/strong>: \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP\u2011\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043a\u0432\u043e\u0437\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>TraceID<\/code> (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 W3C TraceContext). \u042d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Jaeger \u0438\u043b\u0438\u00a0Grafana Tempo \u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0432\u0435\u043b \u0432\u00a0API\u2011\u0448\u043b\u044e\u0437\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0434\u0430\u043b \u043e\u0442\u0432\u0435\u0442\u0430 \u0431\u0430\u0437\u044b \u0438 \u043d\u0430\u00a0\u043a\u0430\u043a\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0441\u043f\u043e\u0442\u043a\u043d\u0443\u043b\u0441\u044f.<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h3>\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430: \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433 \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041e\u0431\u043b\u0430\u0441\u0442\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433 (\u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u00a0\u043d\u0430\u0438\u0442\u0438\u044e)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 I\/O<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 Event Loop \u0442\u044f\u0436\u0435\u043b\u044b\u043c\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u043f\u043b\u043e\u0434\u0438\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 I\/O (<code>epoll<\/code>), \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 RSS \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0443 \u043c\u0443\u0441\u043e\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0438\u0448\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u043d\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"O(N^2)\" alt=\"O(N^2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg\" width=\"53\" height=\"21\" data-width=\"6.606\" data-height=\"2.565\" data-vertical-align=\"-0.566\" style=\"width: 6.606ex; height: 2.565ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8\/8e\/8e9\/8e9c5fee65a4f32abccd0e83ff203e39.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 N+1\u00a0\u0432\u00a0ORM<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Hash Map (<img decoding=\"async\" class=\"formula inline\" source=\"O(1)\" alt=\"O(1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5e\/5e0\/5e079a28737d5dd019a3b8f6133ee55e.svg\" width=\"37\" height=\"18\" data-width=\"4.618\" data-height=\"2.262\" data-vertical-align=\"-0.566\" style=\"width: 4.618ex; height: 2.262ex; vertical-align: -0.566ex\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5e\/5e0\/5e079a28737d5dd019a3b8f6133ee55e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5e\/5e0\/5e079a28737d5dd019a3b8f6133ee55e.svg 781w\" loading=\"lazy\" decode=\"async\"\/>), \u0431\u0430\u0442\u0447\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u00a0\u0411\u0414 \u0447\u0435\u0440\u0435\u0437 JOIN \/ DataLoader<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0422\u0438\u043f\u044b \u0438 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u0432\u00a0\u0447\u0438\u0441\u043b\u0430\u0445 \u0441\u00a0\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (float\/number), \u043f\u0443\u0442\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0435\u0434\u0435\u0442 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0441\u0442\u0440\u043e\u0433\u043e \u0432 <code>DECIMAL<\/code> \/ <code>BigInt<\/code>, \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0440\u0435\u043c\u044f \u0432\u00a0UTC ISO 8601, \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430 \u0447\u0435\u0440\u0435\u0437 Zod\/Pydantic<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0411\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u043e\u0432\u0438\u0442 Lost Update \u043f\u0440\u0438\u00a0\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445, \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0446\u0435\u043d\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 (B\u2011Tree\/GIN), \u0443\u0440\u043e\u0432\u043d\u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 ACID, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0433\u043e\u043d\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 FOR UPDATE \u0438\u043b\u0438\u00a0\u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u043e\u043b\u044b\u0439 <code>fetch()<\/code> \u0431\u0435\u0437\u00a0\u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u0432, \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u0435\u0442\u0440\u0430\u044f\u043c\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0430\u0432\u0438\u0442 \u0442\u0430\u0439\u043c\u2011\u0430\u0443\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Circuit Breaker, Exponential Backoff + Jitter \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>Idempotency-Key<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0438\u0448\u0435\u0442 \u0432\u00a0\u0411\u0414 \u0438 \u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0440\u044f\u0434 (Dual Write)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043e\u0440\u0435\u043c\u0443 CAP, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u0443\u044e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0442\u0442\u0435\u0440\u043d Transactional Outbox<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 IDOR\/BOLA, \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 SQL \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u0441\u0442\u0430\u0432\u0438\u0442 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0443\u0435\u0442 SQL, \u0445\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Argon2id, \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0445\u044d\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u00a0lockfile<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442 \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0443, \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u00a0\u0411\u0414 \u0438 UI \u0432\u00a0\u043e\u0434\u0438\u043d \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0438 \u0447\u0435\u0440\u0435\u0437 Dependency Inversion, \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 C4, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b SOLID \u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u00a0ADR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0434 \u0440\u0443\u043a\u0430\u043c\u0438 \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0438\u043b\u0438\u00a0\u043f\u0438\u0448\u0435\u0442 2\u00a0\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 unit\u2011\u0442\u0435\u0441\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0440\u043e\u0438\u0442 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0442\u0435\u0441\u0442\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Testcontainers \u0434\u043b\u044f\u00a0\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0447\u0435\u0440\u0435\u0437 Property\u2011Based Testing<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u0449\u0435\u0442 \u0431\u0430\u0433\u0438 \u043f\u043e <code>console.log<\/code>, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0441\u0440\u0435\u0434\u043d\u044e\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0438\u0448\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 JSON\u2011\u043b\u043e\u0433\u0438, \u0441\u0442\u0440\u043e\u0438\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 OpenTelemetry, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e\u00a0\u043f\u0435\u0440\u0446\u0435\u043d\u0442\u0438\u043b\u044f\u043c p95\/p99<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr\/>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u0418\u0418 \u043a\u0430\u043a\u00a0\u044d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442, \u0430\u00a0\u043d\u0435\u00a0\u0437\u0430\u043c\u0435\u043d\u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0443<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433 \u043d\u0435\u00a0\u043e\u0442\u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0443\u044e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044e\u00a0\u2014 \u043e\u043d\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043b\u0430\u043d\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0443\u0442\u0438\u043d\u043d\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430 \u0434\u0435\u0448\u0435\u0432\u0435\u0435\u0442 \u0434\u043e\u00a0\u043d\u0443\u043b\u044f, \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446, \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0440\u0435\u0432\u044c\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u0434\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438 \u043f\u0440\u0438\u00a0\u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u044b\u0445 \u0441\u0431\u043e\u044f\u0445.<\/p>\n<p>\u0412\u00a0\u0440\u0443\u043a\u0430\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0431\u0435\u0437\u00a0\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u0430 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u0435\u0442\u0430. \u0412\u00a0\u0440\u0443\u043a\u0430\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u043e\u043d\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043c\u043e\u0449\u043d\u0435\u0439\u0448\u0438\u0439 \u044d\u043a\u0437\u043e\u0441\u043a\u0435\u043b\u0435\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u00a0\u0434\u043d\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435, \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435 production\u2011ready \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/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\/1105056\/\">https:\/\/habr.com\/ru\/articles\/1105056\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0430\u00a0\u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u0438\u0412\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0434\u0430 \u0432\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u0421\u00a0\u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Cursor, Claude Code, GitHub Copilot \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u0444\u0435\u043d\u043e\u043c\u0435\u043d \u00ab\u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430\u00bb (vibe coding): \u0442\u044b \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0448\u044c \u043c\u044b\u0441\u043b\u0438 \u0432\u00a0\u0447\u0430\u0442 \u043d\u0430\u00a0\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043b\u043e\u0432\u0438\u0448\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0437\u0430\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0440\u043e\u0443\u0442\u044b API\u00a0\u2014 \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\u0414\u043b\u044f\u00a0\u043f\u0435\u0442\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u00a0\u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0430\u0445 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0445 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u0421\u043f\u043e\u0440\u0438\u0442\u044c \u0441\u00a0\u044d\u0442\u0438\u043c \u0433\u043b\u0443\u043f\u043e: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u0432\u00a0\u0440\u0430\u0437\u044b. \u041d\u043e\u00a0\u0443\u00a0\u044d\u0442\u043e\u0439 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0446\u0435\u043d\u0430: \u0438\u043b\u043b\u044e\u0437\u0438\u044f, \u0447\u0442\u043e\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f.\u0412\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u00a0\u2014 \u043b\u0438\u0448\u044c \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0435\u0432\u044b\u0439 \u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f (Software Engineering) \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0441\u0443\u0440\u043e\u0432\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e:\u0441\u00a0\u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b;\u0441\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u0433\u043e\u043d\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f\u043c\u0438 \u0432\u00a0\u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;\u0441\u00a0\u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0438, \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u043c\u0438 \u0441\u0431\u043e\u044f\u043c\u0438 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u00a0\u043f\u043e\u0432\u0442\u043e\u0440\u0430\u0445;\u0441\u00a0\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u2011\u043b\u043e\u0433\u0438\u043a\u0438 (IDOR\/BOLA), \u0443\u0442\u0435\u0447\u043a\u0430\u043c\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u043e\u0439 \u0447\u0438\u0441\u0442\u043e\u0442\u043e\u0439;\u0441\u00a0\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c\u044e (Observability), \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u0430\u0432\u0448\u0438\u0439 \u0432\u00a0\u0434\u0432\u0430 \u0447\u0430\u0441\u0430 \u043d\u043e\u0447\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u043f\u043e console.log, \u0430\u00a0\u043f\u043e\u00a0\u0442\u0440\u0435\u0439\u0441\u0430\u043c \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c.\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u00a0\u0440\u0430\u043c\u043a\u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043c\u043e, \u0432\u0430\u0439\u0431\u043a\u043e\u0434 \u0431\u0435\u0437\u00a0\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u0430\u0440\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043e\u043c\u0438\u043a: \u0441\u0435\u0440\u0432\u0438\u0441 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u00a0\u0441\u043e\u0442\u043d\u0435\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0431\u0430\u043b\u0430\u043d\u0441\u044b \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u043c\u0438\u043d\u0443\u0441 \u0438\u0437\u2011\u0437\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438, \u0430\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434, \u043d\u043e\u00a0\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u00a0\u043d\u0435\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a.\u041d\u0438\u0436\u0435\u00a0\u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u043e\u043f\u0438\u0440\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u043d\u0430\u00a0\u043f\u0440\u0438\u0437\u043d\u0430\u043d\u043d\u0443\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0443 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 (\u041c\u0430\u0440\u0442\u0438\u043d \u041a\u043b\u0435\u043f\u043f\u043c\u0430\u043d, \u041c\u0430\u0439\u043a\u043b \u041d\u0430\u0439\u0433\u0430\u0440\u0434, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 Site Reliability Engineering Google, \u0420\u044d\u043d\u0434\u0430\u043b \u0411\u0440\u0430\u0439\u0430\u043d\u0442 \u0438 \u0414\u044d\u0432\u0438\u0434 \u041e\u2019\u0425\u0430\u043b\u043b\u0430\u0440\u043e\u043d). \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b \u043f\u044f\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u043b\u0430\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044f\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432 \u043e\u0442\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430.1. \u0416\u0435\u043b\u0435\u0437\u043e, \u041e\u0421, \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434: \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u0434 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 \u0438 \u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0OOM\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 Event Loop \u0438 \u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0432\u00a0\u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u0445 \u0441\u00a0\u0446\u0438\u043a\u043b\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (Node.js, Python asyncio \/ FastAPI) \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b:\/\/ \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0432\u0430\u0439\u0431\u043a\u043e\u0434: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u043e\u0433\u043e JSON \u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0442\u044f\u0436\u0435\u043b\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430app.post(&#8216;\/import&#8217;, async (req, res) =&gt; {  const data = fs.readFileSync(req.body.filePath); \/\/ \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u041e\u0421!  const parsed = JSON.parse(data);                 \/\/ \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 Event Loop \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u044b!  for (const item of parsed) {    fs.createReadStream(item.file);                \/\/ \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435!  }  res.json({ status: &#8216;ok&#8217; });});\u041d\u0430\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441\u00a0\u0444\u0430\u0439\u043b\u043e\u043c \u0432 10\u00a0\u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u043a\u043e\u0434 \u043b\u0435\u0442\u0430\u0435\u0442. \u0412\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 500\u00a0\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442: \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0432\u0435\u0448\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (Event Loop), \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u00a0health\u2011check \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430, \u0430\u00a0\u0442\u044b\u0441\u044f\u0447\u0438 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a\u00a0\u043e\u0448\u0438\u0431\u043a\u0435 EMFILE: too many open files.1.1. \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044f\u0434\u0440\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b\u041b\u044e\u0431\u0430\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u041e\u0421 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0430 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u0440\u0430:User Space (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f): \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430, \u0433\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b (\u0432\u0430\u0448 Node.js, Python, PostgreSQL). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u00a0\u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u00a0\u0436\u0435\u043b\u0435\u0437\u0443.Kernel Space (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044f\u0434\u0440\u0430): \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 \u0438 \u0434\u0438\u0441\u043a\u0430\u043c\u0438.\u041b\u044e\u0431\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0\u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c\u00a0\u2014 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u00a0\u0434\u0438\u0441\u043a\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u00a0\u0441\u043e\u043a\u0435\u0442, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043c\u044f\u0442\u0438\u00a0\u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 (syscall: read, write, epoll_wait). \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\u00a0\u2014 \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0437\u00a0\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u00a0\u044f\u0434\u0440\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u0440\u0430\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u00a0\u0446\u0438\u043a\u043b\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043c\u0435\u043b\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u00a0\u0444\u0430\u0439\u043b \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0442\u0440\u0430\u0442\u0438\u0442 90% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435\u00a0\u043d\u0430\u00a0\u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0430\u00a0\u043d\u0430\u00a0\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.1.2. \u041c\u043e\u0434\u0435\u043b\u0438 \u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430: \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 I\/O \u043f\u0440\u043e\u0442\u0438\u0432 epoll \u0438 io_uring\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434 (Blocking I\/O): \u043f\u043e\u0442\u043e\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 read() \u0438\u0437\u00a0\u0441\u043e\u043a\u0435\u0442\u0430 \u0438 \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442. \u042f\u0434\u0440\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043a\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043f\u0430\u043a\u0435\u0442\u044b. \u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0441\u044f\u0442\u044c \u0442\u044b\u0441\u044f\u0447, \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 (Thread\u2011per\u2011Connection) \u043a\u043e\u043d\u0435\u0446: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u043e\u0442 1\u00a0\u0434\u043e 8\u00a0\u041c\u0411 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430\u00a0\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u041e\u0421 \u0437\u0430\u0434\u044b\u0445\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.\u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434 \u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (Non\u2011blocking I\/O, epoll \/ kqueue): \u043e\u0434\u0438\u043d \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0432\u00a0\u044f\u0434\u0440\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 epoll_ctl \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 epoll_wait. \u042f\u0434\u0440\u043e \u0431\u0443\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043e\u043a\u0435\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0431\u0430\u0439\u0442\u044b (\u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e\u00a0\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438). \u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 Event Loop \u0432\u00a0Node.js, Nginx, Redis \u0438 Netty. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0432\u00a0Linux \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 epoll \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f\u00a0\u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u043f\u0430\u0439\u043f\u043e\u0432, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u044b \u0432\u0440\u043e\u0434\u0435 Node.js (libuv) \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0443\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u041e\u0421.\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u044f\u0434\u0440\u0430: io_uring: \u043d\u043e\u0432\u0435\u0439\u0448\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Linux \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0430\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c. \u042f\u0434\u0440\u043e \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u0434\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u044b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u00a0\u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (Submission Queue \u0438 Completion Queue). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0447\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 (\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445, \u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0445) \u0438 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u00a0\u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u044f\u0434\u0440\u0430 (IORING_SETUP_SQPOLL).\u0421\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Go: \u044f\u0437\u044b\u043a Go \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430. \u0415\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a  \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0430\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u041e\u0421, \u0430\u00a0\u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u043f\u0430\u0440\u043a\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u043e\u043b\u043b\u0435\u0440 (network poller \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 epoll\/kqueue), \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u043f\u043e\u0442\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u0432\u00a0\u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043b\u044e\u0431\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 ( \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u0442\u044f\u0436\u0435\u043b\u043e\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u00a0\u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c ReDoS, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e JSON) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0441\u0435\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u0422\u044f\u0436\u0435\u043b\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u043f\u0443\u043b\u044b \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 (Worker Threads \/ \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u0438).1.3. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, Page Faults \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430\u041f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u043b\u0430\u043d\u043a\u0430\u043c\u0438 RAM:\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438 MMU (Memory Management Unit) \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0440\u0430\u0437\u0431\u0438\u0442\u0443\u044e \u043d\u0430\u00a0\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e 4\u00a0\u041a\u0411).\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c (malloc \/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430), \u041e\u0421 \u043d\u0435\u00a0\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e: \u043e\u043d\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d. \u041b\u0438\u0448\u044c \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u00a0\u044d\u0442\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043b\u043e\u0432\u0438\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 Page Fault, \u0438 \u044f\u0434\u0440\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u00a0\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u043e\u043c.\u0423\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 (Garbage Collection): \u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440\u044b \u043d\u0430\u0438\u0432\u043d\u043e \u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442, \u0447\u0442\u043e\u00a0\u0432\u00a0\u044f\u0437\u044b\u043a\u0430\u0445 \u0441\u00a0GC (JS, Python, Go, Java) \u0443\u0442\u0435\u0447\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435\u00a0\u0431\u044b\u0432\u0430\u0435\u0442. \u042d\u0442\u043e \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435. GC \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u043e\u0442\u00a0\u043a\u043e\u0440\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438 (GC Roots).\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u0431\u0435\u0437\u00a0TTL \u0438 \u043b\u0438\u043c\u0438\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0437\u0430\u0431\u044b\u0442\u044b\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (emitter.on), \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432\u00a0\u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0445 \u0441\u043a\u043e\u0443\u043f\u0430\u0445\u00a0\u2014 \u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0436\u0438\u0432\u044b\u043c\u0438 \u0432\u0435\u0447\u043d\u043e. \u041f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (RSS\u00a0\u2014 Resident Set Size) \u0440\u0430\u0441\u0442\u0435\u0442, \u041e\u0421 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u00a0SWAP \u043d\u0430\u00a0\u0434\u0438\u0441\u043a (\u0434\u0438\u0447\u0430\u0439\u0448\u0438\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0430), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0437\u0436\u0430\u043b\u043e\u0441\u0442\u043d\u043e \u0443\u0431\u0438\u0432\u0430\u0435\u0442 Linux OOM Killer.\u041f\u0430\u0443\u0437\u044b Stop\u2011the\u2011World: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u0443\u0447\u0430 (heap) \u0437\u0430\u0431\u0438\u0442\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u043c\u0435\u043b\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0433\u0440\u0430\u0444 \u0441\u0441\u044b\u043b\u043e\u043a, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0441\u043f\u0430\u0439\u043a\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (Latency Spikes) \u043d\u0430\u00a0\u0441\u043e\u0442\u043d\u0438 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.2. \u0414\u0430\u043d\u043d\u044b\u0435, \u0442\u0438\u043f\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438: \u043a\u0430\u043a\u00a0\u043d\u0435\u00a0\u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043d\u0433\u0430: \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (Lost Update)\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u043e\u0442\u00a0\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0434\u043b\u044f\u00a0\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0438\u043b\u0438\u00a0\u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u043b\u0435\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\/\/ \u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0439\u0431\u043a\u043e\u0434: \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430async function withdrawMoney(userId: string, amount: number) {  const user = await db.user.findUnique({ where: { id: userId } });  if (user.balance &gt;= amount) {    \/\/ \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435!    const newBalance = user.balance &#8212; amount;    await db.user.update({      where: { id: userId },      data: { balance: newBalance }    });  }}\u0415\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u00a0\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 100\u00a0\u0440\u0443\u0431\u043b\u0435\u0439 \u043f\u0440\u0438\u00a0\u0431\u0430\u043b\u0430\u043d\u0441\u0435 100\u00a0\u0440\u0443\u0431\u043b\u0435\u0439, \u043e\u0431\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u044e\u0442 \u0431\u0430\u043b\u0430\u043d\u0441 100, \u043e\u0431\u0430 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 balance &gt;= amount, \u0438 \u043e\u0431\u0430 \u0437\u0430\u043f\u0438\u0448\u0443\u0442 \u0431\u0430\u043b\u0430\u043d\u0441 0. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043f\u0438\u0441\u0430\u043b 200\u00a0\u0440\u0443\u0431\u043b\u0435\u0439 \u043f\u0440\u0438\u00a0\u043d\u0430\u043b\u0438\u0447\u0438\u0438 100. \u042d\u0442\u043e \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f Lost Update (\u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435).2.1. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u00a0\u043a\u043e\u0434\u0435: O(N) \u043f\u0440\u043e\u0442\u0438\u0432 O(1) \u0438 N+1\u00a0\u0432\u00a0ORM\u0421\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c : \u0412\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440 \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u043d\u0435\u00a0\u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u00a0\u043a\u0430\u043f\u043e\u0442\u043e\u043c:\/\/ \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f users.filter \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a orders.some -&gt; \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(N * M)const activeUsers = users.filter(user =&gt;   orders.some(order =&gt; order.userId === user.id));\u041f\u0440\u0438 10\u202f000\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 10\u202f000\u00a0\u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442  \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043f\u043e\u0434\u0432\u0435\u0441\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u0418\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c Set \u0438\u043b\u0438 Map \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0437\u0430  \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0437\u0430 .\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 N+1\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u00a0ORM: \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434: \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c 100\u00a0\u043f\u043e\u0441\u0442\u043e\u0432, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0432\u00a0\u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a post.author.name. ORM \u0434\u0435\u043b\u0430\u0435\u0442 1\u00a0\u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u00a0\u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u043e\u0441\u0442\u043e\u0432 \u0438 \u0437\u0430\u0442\u0435\u043c 100\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 SQL\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u00a0\u043a\u0430\u0436\u0434\u044b\u043c \u0430\u0432\u0442\u043e\u0440\u043e\u043c. \u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0445\u043b\u0435\u0431\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0436\u0430\u0434\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (Eager Loading \u0447\u0435\u0440\u0435\u0437 JOIN \/ include), \u043b\u0438\u0431\u043e \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0442\u0442\u0435\u0440\u043d DataLoader.2.2. \u0422\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445: IEEE 754, UTC \u0438 \u0441\u0445\u0435\u043c\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438\u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430 IEEE 754: \u0412\u00a0\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0447\u0438\u0441\u0435\u043b \u0441\u00a0\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 (float, double, number \u0432\u00a0JS) \u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0434\u043e\u043b\u0438 \u0432\u0440\u043e\u0434\u0435 0.1 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0440\u043e\u0431\u044f\u043c\u0438: 0.1 + 0.2 === 0.30000000000000004 \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043b\u0438\u00a0\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u044b \u0432\u043e\u00a0float \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438&#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-502160","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/502160","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=502160"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/502160\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=502160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=502160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=502160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}