{"id":354842,"date":"2024-05-20T22:56:35","date_gmt":"2024-05-20T22:56:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=354842"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=354842","title":{"rendered":"<span>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 kafka-rest \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 API<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u2013 \u0437\u0430\u0434\u0430\u0447\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u00ab\u0410\u00bb \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u00ab\u0411\u00bb. \u0410 \u2013 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f legacy-\u0442\u0440\u0435\u0445\u0437\u0432\u0435\u043d\u043a\u0430 \u0438\u0437 00\u0445 \u0441 IIS-MSSQL, \u00ab\u0411\u00bb &#8212; \u043d\u043e\u0432\u0430\u044f-\u043d\u0443\u043b\u0435\u0432\u0430\u044f-\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0448\u0438\u043d\u043e\u0439 \u043d\u0430 apache kafka \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c ETL \u043d\u0430 Apache NiFi, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u0432 k8s. \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u2013 \u0438\u0437 \u00ab\u0410\u00bb \u0432 \u00ab\u0411\u00bb, \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e , \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u2013 \u00ab\u0420\u0430\u0431\u043e\u0442\u0435\u043d\u043a\u0430 \u043d\u0430 5 \u043c\u0438\u043d\u0443\u0442\u00bb: \u0438\u0434\u0435\u043c \u0432 NiFi \u0434\u0435\u043b\u0430\u0435\u043c QueryDatabaseTable->PublishKafkaRecord \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u043f\u0430\u0442\u044c \u2013 \u043d\u043e \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u00ab\u041d\u044e\u0430\u043d\u0441\u044b\u00bb(\u0422\u041c) \u0432 \u0432\u0438\u0434\u0435 \u0418\u0411, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u044f\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u2013 \u0445\u0430\u0440\u0430\u043c, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 (<em>\u0434\u0438\u043a\u0438\u0435 \u043b\u044e\u0434\u0438!<\/em>) \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u0447\u0443\u0436\u0443\u044e \u0411\u0414 (<em>\u041f\u043e\u0434\u0435\u0440\u0436\u0438 \u043c\u043e\u0451 \u043f\u0438\u0432\u043e! \u042f \u0441\u0442\u043e \u0440\u0430\u0437 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u043b!<\/em>) \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u00ab\u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\u00bb, \u00ab\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438\u00bb \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0433\u043b\u0443\u043f\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0448\u0438\u043d\u0430 \u2013 (low|no)-code \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0418\u0421 \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c (<em>\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 *dbc<\/em>), \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e REST\\SOAP, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u0438 \u043a\u0443\u0447\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0449\u0435\u0439. \u041e\u043e\u043e\u043e\u043a, \u0448\u0438\u043d\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0411\u044d\u0414\u044d (<em>\u0418\u043b\u0438 \u043d\u0435 \u0411\u044d\u0414\u044d \u2013 \u0442\u0430\u043c \u0443\u0436\u0435 \u0432\u0438\u0434\u043d\u043e \u0431\u0443\u0434\u0435\u0442<\/em>), \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u2026 \u0410 \u043a\u0443\u0434\u0430, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c? <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2013 \u00ab\u0432 kafka\u2019\u0443!\u00bb \u0445\u043e\u0440\u043e\u0448 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u0441\u0435\u043c \u2013 \u043a\u0440\u043e\u043c\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b kafka\u2019\u0438 \u0448\u0438\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u0418\u0411 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, ingress-nginx \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 (<em>\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u2013 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, ssl-passthrough \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c-\u0442\u043e \u00ab\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u00bb<\/em>) \u0432 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e kafka\u2019\u0438, \u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441 \u0418\u0411 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 LB \u2013 \u0443\u0434\u0430\u0447\u0438, \u043f\u0430\u0446\u0430\u043d\u044b. \u041f\u043b\u044e\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\\\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 kafka\u2019\u0435 \u2013 \u0442\u043e\u0442 \u0435\u0449\u0435 \u0433\u0435\u043c\u043e\u0440\u0440\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u043c\u0438 \u0433\u043e\u0432\u043e\u0440\u044f. \u041e\u0442\u043c\u0435\u0442\u0430\u0435\u043c.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u00ab\u0411\u044d!\u00bb &#8212; \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c fastapi \u2013 \u043f\u044f\u0442\u044c\u044e \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043e\u0431\u043e\u0439\u0434\u0435\u0448\u044c\u0441\u044f, \u0430 \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u0437\u0435\u0442 \u0437\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0443\u0432-\u043b\u0435-\u043a\u0430-\u0442\u0435\u043b\u044c-\u043d\u044b\u043c. \u041d\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u2013 \u043d\u043e in-scale \u043d\u0435 \u0434\u0435\u0448\u0435\u0432\u043e.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u00ab\u0426\u044d\u00bb &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 NiFi. HandleHTTPRequest-PublishKafka-HandleHTTPResponse, \u043c\u043e\u0436\u043d\u043e \u0438 \u0437\u0430 \u0442\u0440\u0438 \u043c\u0438\u043d\u0443\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f. \u041f\u0440\u0430\u0432\u0434\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c, \u0430 \u0442\u043e\u0442 \u0436\u0435 basic \u0443\u0436\u0435 \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u043b\u043e\u0435, \u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 OIDC \u0438 \u0432\u043e\u0432\u0441\u0435 \u0443\u043f\u043e\u0442\u0435\u0435\u0448\u044c. \u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u2013 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0437 NiFi \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u0431\u0435, HA \u043d\u0435\u0442 (<em>NiFi-cluster \u043e\u043d \u043f\u0440\u043e LB, \u0430 \u043d\u0435 HA\\FT<\/em>), \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0431\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u041d\u043e \u2013 \u0434\u0443\u0448\u0430 \u043f\u0440\u043e\u0441\u0438\u0442, \u043f\u0440\u043e\u0441\u0438\u0442 \u0447\u0435\u0433\u043e-\u0442\u043e\u2026<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 kafka-rest. \u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435 \u0434\u0430? \u0420\u0435\u0441\u0442-\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u0448\u0438\u043d\u044b \u0435\u0441\u0442\u044c, \u043e\u043d \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0432\u0441\u0435 \u043f\u043b\u044e\u0448\u043a\u0438 \u00ab\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0410\u00bb \u0431\u0435\u0437 \u043c\u0438\u043d\u0443\u0441\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (<em>\u041d\u0435, \u043d\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u0432\u043e\u0438\u0445 \u043c\u0438\u043d\u0443\u0441\u043e\u0432 \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u2013 \u043b\u043e\u043f\u0430\u0442\u043e\u0439 \u0435\u0448\u044c, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 stateful consuming \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0447\u0435\u0440\u0435\u0437 sticky-sessions, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f\u2026 \u00ab\u041e\u0431 \u044d\u0442\u043e\u043c \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u044e \u0437\u0430\u0432\u0442\u0440\u0430!\u00bb(\u0441)<\/em>). \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430 \u043f\u043e\u043b\u0447\u0430\u0441\u0430 \u00ab\u0438\u0437 \u043f\u0430\u043b\u043a\u0430-\u0438-\u0432\u0435\u0440\u0435\u0432\u043a\u0430\u00bb, \u0432\u0441\u0435 \u043a\u0430\u043a \u043c\u044b \u043b\u044e\u0431\u0438\u043c. \u00a0<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 4 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 (KAFKA_REST_BOOTSTRAP_SERVERS \u0438 KAFKA_REST_SCHEMA_REGISTRY_URL \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445) \u0441\u0435\u0440\u0432\u0438\u0441-\u0438\u043d\u0433\u0440\u0435\u0441\u0441\u2026 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u2013 \u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0434\u0442\u0438 \u0437\u0430 \u043a\u043e\u0444\u0435.\u00a0 \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e (<a href=\"https:\/\/docs.confluent.io\/platform\/current\/kafka-rest\/production-deployment\/rest-proxy\/security.html\" rel=\"noopener noreferrer nofollow\">REST Proxy Security | Confluent Documentation<\/a>) \u2013 \u0430 \u043e\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 basic \u0443\u043c\u0435\u0435\u0442, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u2013 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 kafka\u2019\u0438, \u0447\u0442\u043e \u2013 \u0441\u043c. \u0432\u044b\u0448\u0435. \u041b\u0430\u0434-\u043d\u0435\u043d\u044c-\u043a\u043e, \u0441\u043a\u043e\u0442\u0447 \u0432\u0440\u043e\u0434\u0435 \u0435\u0449\u0435 \u043d\u0435 \u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f \u2013 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0443 oauth2-proxy \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u043b\u0438\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u0430 \u2013 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 POST:<\/p>\n<pre><code>apiVersion: networking.k8s.io\/v1  kind: Ingress  metadata: \u00a0  name: custom-kafka-rest \u00a0  namespace: &lt;namespace> \u00a0  annotations: \u00a0\u00a0\u00a0  nginx.ingress.kubernetes.io\/rewrite-target: \/topics\/custom-int-test \u00a0\u00a0\u00a0  nginx.ingress.kubernetes.io\/configuration-snippet: | \u00a0\u00a0\u00a0\u00a0\u00a0  if ($request_method != POST) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  return 403; \u00a0\u00a0\u00a0\u00a0\u00a0  }  spec: \u00a0  ingressClassName: nginx rules: - host: &lt;host>  http: \u00a0\u00a0\u00a0 paths: \u00a0\u00a0\u00a0\u00a0\u00a0 - path: \/krest\/topics\/custom-int-test \u00a0\u00a0\u00a0\u00a0 \u00a0 pathType: Exact \u00a0\u00a0\u00a0\u00a0 \u00a0 backend: \u00a0 \u00a0     service: \u00a0 \u00a0    name: custom-kafka-oauth2 \u00a0 \u00a0    port:  \u00a0    name: http<\/code><\/pre>\n<p>\u0421 \u0437\u0430\u043f\u0440\u0435\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u0441\u043e-\u043a\u0440\u0438\u0432\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e oauth2-proxy \u2013 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u2013 \u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0442 \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432 keycloak \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0442\u0438\u043f confidential, service account + \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0451 \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u2013 \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041e\u043a. \u0418\u0434\u0435\u043c \u0441 \u044d\u0442\u0438\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0432 oauth2-proxy \u2013 \u043d\u0435 \u043e\u043a, keycloak-oidc \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 audience, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 mapper. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u2013 \u0432\u0440\u043e\u0434\u0435 \u043d\u043e\u0440\u043c. <\/p>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0430\u0439\u0434\u043a\u0430\u0440 \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u0441 kafka-rest:<\/p>\n<pre><code>- --skip-jwt-bearer-tokens=true # \u0417\u0432\u0443\u0447\u0438\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u00ab\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c\u00bb - --insecure-oidc-allow-unverified-email=false - --api-route=\/topics\/custom-int-test # \u0432\u043c\u0435\u0441\u0442\u043e redirect\u2019\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043e\u0442\u0434\u0430\u0435\u043c 401 - --show-debug-on-error - --redirect-url=https:\/\/&lt;host>\/krest\/oauth\/callback # \u043d\u0430\u0444\u0438\u0433 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u043d\u043e \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435 - --scope=openid - --provider=keycloak-oidc # \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u0440\u043e\u043b\u044f\u043c - --oidc-issuer-url=https:\/\/&lt;host>\/auth\/realms\/&lt;realm> - --http-address=0.0.0.0:4180 - --allowed-role=custom-kafka-rest:Krest #\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e \u0434\u043b\u044f KC, \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 - --proxy-prefix=\/krest\/oauth - --upstream=http:\/\/127.0.0.1:8082\/ - --email-domain=&lt;\u0434\u043e\u043c\u0435\u043d> - --ssl-insecure-skip-verify - --set-basic-auth=false - --client-id=custom-kafka-rest # \u041d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 - --client-secret='not used'\u00a0\u00a0\u00a0 # \u041d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 - --cookie-secret='not used\u00a0\u00a0\u00a0 \u00a0# \u041d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435-\u043d\u0435\u043d\u0443\u0436\u043d\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u00ab\u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439\u00bb, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 &#8212; nginx.ingress.kubernetes.io\/auth-signin \u0438 nginx.ingress.kubernetes.io\/auth-url \u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u0430 \u043a\u043b\u0430\u0441\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2013 \u00ab\u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438\u00bb \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u0441\u044b\u043b\u0430\u044f \u0432\u0441\u0435\u0445 \u043d\u0430&#8230; 401 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f. <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u2013 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u00ab\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e\u00bb \u043d\u0430 \u043e\u0434\u043d\u043e\u043c oauth2-proxy \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0438\u0445 \u043f\u0443\u0442\u044f\u043c\u0438 \u2013 \u043c\u043e\u0436\u043d\u043e, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u0440\u043e\u043b\u0435\u0439 \u2013 \u0442\u043e\u0436\u0435, \u0430 \u0432\u043e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u0442\u043e\u043f\u0438\u043a \u0410 \u043c\u043e\u0433 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0440\u043e\u043b\u0438 \u0425, \u0430 \u0432 \u0442\u043e\u043f\u0438\u043a \u0411 \u2013 \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0440\u043e\u043b\u0438 \u0423 \u0438 \u043d\u0438\u043a\u0430\u043a \u0438\u043d\u0430\u0447\u0435 \u2013 \u0432\u0438\u0434\u0438\u043c\u043e, \u043d\u0435\u0442. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0434\u043a\u0430\u0440 \u2013 \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u00ab\u043d\u0438\u0437\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0435 \u0447\u0438\u0441\u0442\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u00bb. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u043e\u043a\u0430 \u2013 \u00ab\u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c, \u0432\u0430\u043b\u044c\u0441\u0438\u0440\u0443\u0435\u043c!\u00bb &#8212; \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043c\u044b, \u0441 \u0433\u0440\u0435\u0445\u043e\u043c \u043f\u043e\u043f\u043e\u043b\u0430\u043c, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u2013 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0440\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <s>\u043f\u0430\u0440\u043a\u0443\u0440<\/s> schema-registry. \u0412 \u0430\u0432\u0440\u043e-\u0444\u0438\u0433\u0430\u0432\u0440\u043e \u0438 \u043f\u0440\u043e\u0447\u0443\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u0443\u044e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0430 \u0448\u0438\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u0430 \u0432\u043e\u0442 \u0432 json \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435. \u0421\u0435\u0440\u0432\u0438\u0441\u044b, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u00ab\u0437\u0430 kafka\u2019\u043e\u0439\u00bb \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code>{ \u00a0\u00a0\u00a0 \"pointName\": \"125\", \u00a0\u00a0\u00a0 \"events\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Value\": 0.000000000000000e000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"timestamp\": 1694537700000000000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quality\": 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"annotatiton\": None, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Value\": 0.000000000000000e000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"timestamp\": 1694537700000000000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quality\": 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\"annotatiton\": None, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0 ]<\/code><\/pre>\n<p>\u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2013 \u0442\u0438\u043f\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 (<em>\u0410 conditional-\u0441\u0445\u0435\u043c\u044b \u043d\u0443\u0443\u0443\u0443\u2026 \u044d\u044d\u044d\u2026 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c, \u043f\u0440\u0430\u0432\u0434\u0430?<\/em>) \u2013 \u043d\u043e \u0443 \u043d\u0430\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0447\u0442\u043e \u0432 \u0411\u0414 \u0435\u0441\u0442\u044c, \u0442\u043e \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u2013 \u0430 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0440\u0438\u0431\u0438\u0442 \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438.\u00a0 \u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u0434 \u044d\u0442\u043e \u0434\u0435\u043b\u043e jsonschema\u2019\u0443:<\/p>\n<pre><code>{ \u00a0 \"title\": \"JSONv3\", \u00a0 \"description\": \"\u0421\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 TSDS\", \u00a0 \"type\": \"object\", \u00a0 \"properties\": { \u00a0\u00a0\u00a0 \"pointName\": { \u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"string\" \u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0 \"events\": { \u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"array\", \u00a0\u00a0\u00a0\u00a0\u00a0 \"items\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"properties\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"annotation\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"null\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"value\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"number\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"timestamp\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"number\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quality\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"number\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 } \u00a0 } }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043f\u0438\u0445\u043d\u0435\u043c \u0435\u0451 \u0432 schemaregistry. <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 API kafka-rest \u2013 \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0432\u0435, \u0432\u0442\u043e\u0440\u0430\u044f \u0438 \u0442\u0440\u0435\u0442\u044c\u044f (<em>\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e &#8212; \u043b\u0443\u0414\u0448\u0430\u044f<\/em>). \u0423\u0432\u044b, \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0442\u043e\u0440\u0430\u044f, \u0442.\u043a. \u0442\u0440\u0435\u0442\u044c\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442. V2 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c) \u0444\u043e\u0440\u043c\u0430\u0442\u0435: {&#171;records&#187;:[{&#171;value&#187;:{&lt;&#171;\u0427\u0442\u043e&#187;:&#187;\u0432\u0430\u043c \u0443\u0433\u043e\u0434\u043d\u043e&#187;>}}]}. \u041d\u0443, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0436\u0435\u043b\u0430\u0435\u043c\u0443\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0443\u044e REST-proxy \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c:<\/p>\n<p><code>curl -X POST -H \"Content-Type: application\/vnd.kafka.jsonschema.v2+json\" --data '{\"value_schema_id\": &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u0445\u0435\u043c\u044b>, \"records\":[{\"value\":{&lt;\u0434\u0430\u043d\u043d\u044b\u0435>}}]}' \"https:\/\/&lt;host>\/krest\/topics\/custom-int-test\/\" \u2013k<\/code><\/p>\n<p><code>#\u0442\u0430\u043a\u0438 \u0434\u0430: <\/code><\/p>\n<p><code>&lt;Response [200]> {\"offsets\":[{\"partition\":0,\"offset\":27,\"error_code\":null,\"error\":null},{\"partition\":0,\"offset\":28,\"error_code\":null,\"error\":null}],\"key_schema_id\":null,\"value_schema_id\":&lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u0445\u0435\u043c\u044b>}<\/code><\/p>\n<p><code>#\u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c, \u0441\u0430\u043c\u0443\u044e \u043a\u0430\u043f\u0435\u043b\u044c\u043a\u0443, \u043c\u0430\u043b\u043e\u0441\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043f\u043e\u043b\u043e\u043c\u0430\u0435\u043c \u2013 \u0442\u0430\u043a\u0438 \u043d\u0435\u0442:<\/code><\/p>\n<p><code>&lt;Response [422]> {\"error_code\":42203,\"message\":\"Conversion of JSON to Object failed: Failed to convert JSON using JSON Schema: #\/events\/0\/quality: expected type: Number, found: String\"}<\/code><\/p>\n<p>\u0423\u0441\u043f\u0435\u0445? \u0425\u043c\u2026 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c. \u0410 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0445\u0435\u043c\u0435 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 _\u0431\u0435\u0437_ \u0441\u0445\u0435\u043c\u044b? \u0410 \u043d\u0438\u0447\u0435\u0433\u043e. \u0421\u043e\u0432\u0441\u0435\u043c. \u041d\u0435\u0442 \u0441\u0445\u0435\u043c\u044b \u2013 \u043d\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u2013 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. <\/p>\n<p>\u0411\u0438\u0434\u0430. \u0411\u0438\u0434\u0430-\u0431\u0438\u0434\u0430 \u0434\u0430\u0436\u0435. \u041d\u0435\u0442, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043a\u043e\u043d\u0444\u043b\u044e\u044d\u043d\u0442\u043e\u0432\u0441\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c broker-side \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0441\u0445\u0435\u043c \u2013 \u043d\u043e \u043e\u043d \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442. \u0425\u043c. \u0410 \u043a\u0430\u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442? \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 Content-Type:<\/p>\n<p>application\/vnd.kafka[.embedded_format].[api_version]+[serialization_format]<\/p>\n<p>application\/vnd.kafka.jsonschema.v2+json \u2013 \u0442.\u0435. \u0435\u0441\u0442\u044c \u00abjsonschema\u00bb \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 embedded format \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 json \u2013 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041d\u0443? \u041f\u043e\u043d\u044f\u043b\u0438, \u0434\u0430? \u0418\u0435\u0445, \u0441\u0433\u043e\u0440\u0435\u043b \u0441\u0430\u0440\u0430\u0439 \u2013 \u0433\u043e\u0440\u0438 \u0438 \u0445\u0430\u0442\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0435\u0442\u0438, \u043d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0442\u0430\u043a! (\u0412\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u2013 \u0441\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e?)<\/summary>\n<div class=\"spoiler__content\">\n<p><code>nginx.ingress.kubernetes.io\/configuration-snippet: | \u00a0 if ($request_method != POST) { \u00a0\u00a0\u00a0 return 403; \u00a0 } \u00a0 if ($content_type != \"application\/vnd.kafka.jsonschema.v2+json\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 405; \u00a0 }<\/code><\/p>\n<p>\u0444\u0438\u0433\u0430\u043a! <\/p>\n<p><code>curl -X POST -H \"Content-Type: application\/vnd.kafka.json.v2+json\" --data '{\"records\":[{\"value\":{&lt;\u0434\u0430\u043d\u043d\u044b\u0435>}}]}' \"https:\/\/&lt;host>\/krest\/topics\/custom-int-test\/\" \u2013k<\/code><\/p>\n<p><code>&lt;Response [405]> &lt;html><\/code><\/p>\n<p><code>&lt;head>&lt;title>405 Not Allowed&lt;\/title>&lt;\/head><\/code><\/p>\n<p><code>&lt;body><\/code><\/p>\n<p><code>&lt;center>&lt;h1>405 Not Allowed&lt;\/h1>&lt;\/center><\/code><\/p>\n<p><code>&lt;hr>&lt;center>nginx&lt;\/center><\/code><\/p>\n<p><code>&lt;\/body><\/code><\/p>\n<p><code>&lt;\/html><\/code><\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u043f\u044b\u0442\u043b\u0438\u0432\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u0430 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441\u0445\u0435\u043c\u0430 \u0435\u0441\u0442\u044c \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u2013 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0445\u0435\u043c\u0430 \u044d\u0442\u0430, \u0433\u043c, \u0434\u0440\u0443\u0433\u0430\u044f? \u041d\u0430 \u044d\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u00ab\u0422\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430 \u043c\u0435\u043d\u044f \u0438\u043b\u0438 \u0437\u0430 \u043c\u0435\u0434\u0432\u0435\u0434\u044f?!\u00bb &#8212; \u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435: \u00ab\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0438\u0442\u0430\u044e\u0449\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u043e\u043f\u0438\u043a\u0430 \u0425\u0425\u0425\u00bb.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438 <\/p>\n<pre><code>create table dbo.DataHour (  Date        date not null,   Hour        int  not null,   ObjectId    int  not null,   LayerId     int  not null   constraint FK_DataHour_Layer   references dbo.Layer,  ParameterId int  not null  constraint FK_DataHour_Parameter  references dbo.Parameter,  Value       float,   ValueEnum   int,   SaveDate    smalldatetime,   constraint PK_DataHour   primary key (Date, Hour, ObjectId, LayerId, ParameterId)   with (fillfactor = 80)   )<\/code><\/pre>\n<p>\u042d\u0442\u0443 \u0441\u0430\u043c\u0443\u044e \u0436\u044b\u0441\u043e\u043d\u0438\u043d\u0443 \u0441\u043b\u0430\u0431\u0430\u0442\u044c. \u0421 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 (low|no)-code \u043d\u0430 \u0448\u0438\u043d\u0435 \u2013 \u0442\u043e \u0435\u0449\u0435 \u0447\u0443\u0434\u0443\u0448\u043a\u043e \u2013 \u043f\u0440\u043e\u0449\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 json\u2019\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0443<\/p>\n<details class=\"spoiler\">\n<summary>\u0418 \u0442\u0430\u043a &#8212; \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u043d\u0430\u0434\u043e!<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>create procedure getdata(@fr timestamp)  as  begin \u00a0\u00a0\u00a0      declare          @points   table           \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0            \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pointName int not null \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0            \u00a0\u00a0\u00a0\u00a0\u00a0 )     declare \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0        @result  table \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0       ( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0       pointName varchar(10),      events\u00a0\u00a0\u00a0 varchar(max) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   ) \u00a0\u00a0\u00a0   declare   @pointName  int \u00a0\u00a0\u00a0   insert into  @points  select distinct ObjectId  from dbo.DataHour \u00a0\u00a0\u00a0   where SaveDate > @fr  select @pointName = min(pointName)   \u00a0\u00a0\u00a0 from  \u00a0@points   \u00a0\u00a0\u00a0 \u00a0\u00a0 while @pointName is not null   \u00a0\u00a0\u00a0 \u00a0\u00a0  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 begin \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    \u00a0\u00a0\u00a0 \u00a0\u00a0  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 insert into  \u00a0@pointName\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    \u00a0\u00a0\u00a0 \u00a0\u00a0  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 values (caste @pointName as varchar(10)),   (select   value\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   as Value,  DATEDIFF_BIG(NANOSECOND, '1970-01-01 00:00:00.0000000', SaveDate) as timestamp, \u00a00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0as quality, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 null\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0as annotatiton \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0from dbo.DataHour \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0where ObjectId = @pointName\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0and SaveDate > @fr \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0for json auto, include_null_values)) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0select @pointName = min(pointName) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0from @points\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0where pointName > \u00a0@pointName\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0end select JSON_MODIFY((select pointName as [value.pointName],  \u00a0\u00a0JSON_QUERY(events) as [value.events]  \u00a0\u00a0from  @result   \u00a0\u00a0for json path, ROOT('records')), 'append $.value_schema_id', &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u0445\u0435\u043c\u044b>)  \u00a0\u00a0end<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0426\u0435\u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0441\u043e \u0432\u0441\u0435\u043c research\u2019\u0435\u043c \u0438 \u043f\u0440\u0438\u0441\u0435\u0434\u0443\u0448\u043a\u0430\u043c\u0438 \u2013 4 \u0447\u0430\u0441\u0430, \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\\\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0439\u0434\u0435\u0442. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043b\u0438 \u044f \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e? \u0412 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u2013 \u0441\u043a\u043e\u0440\u0435\u0435 \u00ab\u043d\u0435\u0442\u00bb, \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0432\u0441\u0435 \u0436\u0435 \u043c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e \u2013 \u043d\u043e \u0434\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0434\u043e \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e. <\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/760934\/\"> https:\/\/habr.com\/ru\/articles\/760934\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0442\u0438\u043f\u043e\u0432\u0430\u044f \u2013 \u0437\u0430\u0434\u0430\u0447\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u00ab\u0410\u00bb \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u00ab\u0411\u00bb. \u0410 \u2013 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f legacy-\u0442\u0440\u0435\u0445\u0437\u0432\u0435\u043d\u043a\u0430 \u0438\u0437 00\u0445 \u0441 IIS-MSSQL, \u00ab\u0411\u00bb &#8212; \u043d\u043e\u0432\u0430\u044f-\u043d\u0443\u043b\u0435\u0432\u0430\u044f-\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0448\u0438\u043d\u043e\u0439 \u043d\u0430 apache kafka \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c ETL \u043d\u0430 Apache NiFi, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u0432 k8s. \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u2013 \u0438\u0437 \u00ab\u0410\u00bb \u0432 \u00ab\u0411\u00bb, \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e , \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u2013 \u00ab\u0420\u0430\u0431\u043e\u0442\u0435\u043d\u043a\u0430 \u043d\u0430 5 \u043c\u0438\u043d\u0443\u0442\u00bb: \u0438\u0434\u0435\u043c \u0432 NiFi \u0434\u0435\u043b\u0430\u0435\u043c QueryDatabaseTable->PublishKafkaRecord \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u043f\u0430\u0442\u044c \u2013 \u043d\u043e \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u00ab\u041d\u044e\u0430\u043d\u0441\u044b\u00bb(\u0422\u041c) \u0432 \u0432\u0438\u0434\u0435 \u0418\u0411, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u044f\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u2013 \u0445\u0430\u0440\u0430\u043c, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 (<em>\u0434\u0438\u043a\u0438\u0435 \u043b\u044e\u0434\u0438!<\/em>) \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u0447\u0443\u0436\u0443\u044e \u0411\u0414 (<em>\u041f\u043e\u0434\u0435\u0440\u0436\u0438 \u043c\u043e\u0451 \u043f\u0438\u0432\u043e! \u042f \u0441\u0442\u043e \u0440\u0430\u0437 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u043b!<\/em>) \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u00ab\u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\u00bb, \u00ab\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438\u00bb \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0433\u043b\u0443\u043f\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0448\u0438\u043d\u0430 \u2013 (low|no)-code \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0418\u0421 \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c (<em>\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 *dbc<\/em>), \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e REST\\SOAP, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u0438 \u043a\u0443\u0447\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0449\u0435\u0439. \u041e\u043e\u043e\u043e\u043a, \u0448\u0438\u043d\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0411\u044d\u0414\u044d (<em>\u0418\u043b\u0438 \u043d\u0435 \u0411\u044d\u0414\u044d \u2013 \u0442\u0430\u043c \u0443\u0436\u0435 \u0432\u0438\u0434\u043d\u043e \u0431\u0443\u0434\u0435\u0442<\/em>), \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u2026 \u0410 \u043a\u0443\u0434\u0430, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c? <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2013 \u00ab\u0432 kafka\u2019\u0443!\u00bb \u0445\u043e\u0440\u043e\u0448 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u0441\u0435\u043c \u2013 \u043a\u0440\u043e\u043c\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b kafka\u2019\u0438 \u0448\u0438\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u0418\u0411 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, ingress-nginx \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 (<em>\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u2013 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, ssl-passthrough \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c-\u0442\u043e \u00ab\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u00bb<\/em>) \u0432 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e kafka\u2019\u0438, \u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441 \u0418\u0411 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 LB \u2013 \u0443\u0434\u0430\u0447\u0438, \u043f\u0430\u0446\u0430\u043d\u044b. \u041f\u043b\u044e\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\\\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 kafka\u2019\u0435 \u2013 \u0442\u043e\u0442 \u0435\u0449\u0435 \u0433\u0435\u043c\u043e\u0440\u0440\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u043c\u0438 \u0433\u043e\u0432\u043e\u0440\u044f. \u041e\u0442\u043c\u0435\u0442\u0430\u0435\u043c.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u00ab\u0411\u044d!\u00bb &#8212; \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c fastapi \u2013 \u043f\u044f\u0442\u044c\u044e \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043e\u0431\u043e\u0439\u0434\u0435\u0448\u044c\u0441\u044f, \u0430 \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u0437\u0435\u0442 \u0437\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0443\u0432-\u043b\u0435-\u043a\u0430-\u0442\u0435\u043b\u044c-\u043d\u044b\u043c. \u041d\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u2013 \u043d\u043e in-scale \u043d\u0435 \u0434\u0435\u0448\u0435\u0432\u043e.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u00ab\u0426\u044d\u00bb &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 NiFi. HandleHTTPRequest-PublishKafka-HandleHTTPResponse, \u043c\u043e\u0436\u043d\u043e \u0438 \u0437\u0430 \u0442\u0440\u0438 \u043c\u0438\u043d\u0443\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f. \u041f\u0440\u0430\u0432\u0434\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c, \u0430 \u0442\u043e\u0442 \u0436\u0435 basic \u0443\u0436\u0435 \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u043b\u043e\u0435, \u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 OIDC \u0438 \u0432\u043e\u0432\u0441\u0435 \u0443\u043f\u043e\u0442\u0435\u0435\u0448\u044c. \u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u2013 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0437 NiFi \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u0431\u0435, HA \u043d\u0435\u0442 (<em>NiFi-cluster \u043e\u043d \u043f\u0440\u043e LB, \u0430 \u043d\u0435 HA\\FT<\/em>), \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0431\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u041d\u043e \u2013 \u0434\u0443\u0448\u0430 \u043f\u0440\u043e\u0441\u0438\u0442, \u043f\u0440\u043e\u0441\u0438\u0442 \u0447\u0435\u0433\u043e-\u0442\u043e\u2026<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 kafka-rest. \u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435 \u0434\u0430? \u0420\u0435\u0441\u0442-\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u0448\u0438\u043d\u044b \u0435\u0441\u0442\u044c, \u043e\u043d \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0432\u0441\u0435 \u043f\u043b\u044e\u0448\u043a\u0438 \u00ab\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0410\u00bb \u0431\u0435\u0437 \u043c\u0438\u043d\u0443\u0441\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (<em>\u041d\u0435, \u043d\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u0432\u043e\u0438\u0445 \u043c\u0438\u043d\u0443\u0441\u043e\u0432 \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u2013 \u043b\u043e\u043f\u0430\u0442\u043e\u0439 \u0435\u0448\u044c, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 stateful consuming \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0447\u0435\u0440\u0435\u0437 sticky-sessions, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f\u2026 \u00ab\u041e\u0431 \u044d\u0442\u043e\u043c \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u044e \u0437\u0430\u0432\u0442\u0440\u0430!\u00bb(\u0441)<\/em>). \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430 \u043f\u043e\u043b\u0447\u0430\u0441\u0430 \u00ab\u0438\u0437 \u043f\u0430\u043b\u043a\u0430-\u0438-\u0432\u0435\u0440\u0435\u0432\u043a\u0430\u00bb, \u0432\u0441\u0435 \u043a\u0430\u043a \u043c\u044b \u043b\u044e\u0431\u0438\u043c. \u00a0<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 4 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 (KAFKA_REST_BOOTSTRAP_SERVERS \u0438 KAFKA_REST_SCHEMA_REGISTRY_URL \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445) \u0441\u0435\u0440\u0432\u0438\u0441-\u0438\u043d\u0433\u0440\u0435\u0441\u0441\u2026 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u2013 \u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0434\u0442\u0438 \u0437\u0430 \u043a\u043e\u0444\u0435.\u00a0 \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e (<a href=\"https:\/\/docs.confluent.io\/platform\/current\/kafka-rest\/production-deployment\/rest-proxy\/security.html\" rel=\"noopener noreferrer nofollow\">REST Proxy Security | Confluent Documentation<\/a>) \u2013 \u0430 \u043e\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 basic \u0443\u043c\u0435\u0435\u0442, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u2013 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 kafka\u2019\u0438, \u0447\u0442\u043e \u2013 \u0441\u043c. \u0432\u044b\u0448\u0435. \u041b\u0430\u0434-\u043d\u0435\u043d\u044c-\u043a\u043e, \u0441\u043a\u043e\u0442\u0447 \u0432\u0440\u043e\u0434\u0435 \u0435\u0449\u0435 \u043d\u0435 \u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f \u2013 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0443 oauth2-proxy \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u043b\u0438\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u0430 \u2013 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 POST:<\/p>\n<pre><code>apiVersion: networking.k8s.io\/v1  kind: Ingress  metadata: \u00a0  name: custom-kafka-rest \u00a0  namespace: &lt;namespace> \u00a0  annotations: \u00a0\u00a0\u00a0  nginx.ingress.kubernetes.io\/rewrite-target: \/topics\/custom-int-test \u00a0\u00a0\u00a0  nginx.ingress.kubernetes.io\/configuration-snippet: | \u00a0\u00a0\u00a0\u00a0\u00a0  if ($request_method != POST) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  return 403; \u00a0\u00a0\u00a0\u00a0\u00a0  }  spec: \u00a0  ingressClassName: nginx rules: - host: &lt;host>  http: \u00a0\u00a0\u00a0 paths: \u00a0\u00a0\u00a0\u00a0\u00a0 - path: \/krest\/topics\/custom-int-test \u00a0\u00a0\u00a0\u00a0 \u00a0 pathType: Exact \u00a0\u00a0\u00a0\u00a0 \u00a0 backend: \u00a0 \u00a0     service: \u00a0 \u00a0    name: custom-kafka-oauth2 \u00a0 \u00a0    port:  \u00a0    name: http<\/code><\/pre>\n<p>\u0421 \u0437\u0430\u043f\u0440\u0435\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u0441\u043e-\u043a\u0440\u0438\u0432\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e oauth2-proxy \u2013 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u2013 \u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0442 \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432 keycloak \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0442\u0438\u043f confidential, service account + \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0451 \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u2013 \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041e\u043a. \u0418\u0434\u0435\u043c \u0441 \u044d\u0442\u0438\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0432 oauth2-proxy \u2013 \u043d\u0435 \u043e\u043a, keycloak-oidc \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 audience, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 mapper. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u2013 \u0432\u0440\u043e\u0434\u0435 \u043d\u043e\u0440\u043c. <\/p>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0430\u0439\u0434\u043a\u0430\u0440 \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u0441 kafka-rest:<\/p>\n<pre><code>- --skip-jwt-bearer-tokens=true # \u0417\u0432\u0443\u0447\u0438\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u00ab\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c\u00bb - --insecure-oidc-allow-unverified-email=false - --api-route=\/topics\/custom-int-test # \u0432\u043c\u0435\u0441\u0442\u043e redirect\u2019\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043e\u0442\u0434\u0430\u0435\u043c 401 - --show-debug-on-error - --redirect-url=https:\/\/&lt;host>\/krest\/oauth\/callback # \u043d\u0430\u0444\u0438\u0433 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u043d\u043e \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435 - --scope=openid - --provider=keycloak-oidc # \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u0440\u043e\u043b\u044f\u043c - --oidc-issuer-url=https:\/\/&lt;host>\/auth\/realms\/&lt;realm> - --http-address=0.0.0.0:4180 - --allowed-role=custom-kafka-rest:Krest #\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e \u0434\u043b\u044f KC, \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 - --proxy-prefix=\/krest\/oauth - --upstream=http:\/\/127.0.0.1:8082\/ - --email-domain=&lt;\u0434\u043e\u043c\u0435\u043d> - --ssl-insecure-skip-verify - --set-basic-auth=false - --client-id=custom-kafka-rest # \u041d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 - --client-secret='not used'\u00a0\u00a0\u00a0 # \u041d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 - --cookie-secret='not used\u00a0\u00a0\u00a0 \u00a0# \u041d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435-\u043d\u0435\u043d\u0443\u0436\u043d\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u00ab\u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439\u00bb, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 &#8212; nginx.ingress.kubernetes.io\/auth-signin \u0438 nginx.ingress.kubernetes.io\/auth-url \u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u0430 \u043a\u043b\u0430\u0441\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2013 \u00ab\u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438\u00bb \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u0441\u044b\u043b\u0430\u044f \u0432\u0441\u0435\u0445 \u043d\u0430&#8230; 401 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f. <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u2013 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u00ab\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e\u00bb \u043d\u0430 \u043e\u0434\u043d\u043e\u043c oauth2-proxy \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0438\u0445 \u043f\u0443\u0442\u044f\u043c\u0438 \u2013 \u043c\u043e\u0436\u043d\u043e, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u0440\u043e\u043b\u0435\u0439 \u2013 \u0442\u043e\u0436\u0435, \u0430 \u0432\u043e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u0442\u043e\u043f\u0438\u043a \u0410 \u043c\u043e\u0433 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0440\u043e\u043b\u0438 \u0425, \u0430 \u0432 \u0442\u043e\u043f\u0438\u043a \u0411 \u2013 \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0440\u043e\u043b\u0438 \u0423 \u0438 \u043d\u0438\u043a\u0430\u043a \u0438\u043d\u0430\u0447\u0435 \u2013 \u0432\u0438\u0434\u0438\u043c\u043e, \u043d\u0435\u0442. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0434\u043a\u0430\u0440 \u2013 \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u00ab\u043d\u0438\u0437\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0435 \u0447\u0438\u0441\u0442\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u00bb. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u043e\u043a\u0430 \u2013 \u00ab\u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c, \u0432\u0430\u043b\u044c\u0441\u0438\u0440\u0443\u0435\u043c!\u00bb &#8212; \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043c\u044b, \u0441 \u0433\u0440\u0435\u0445\u043e\u043c \u043f\u043e\u043f\u043e\u043b\u0430\u043c, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u2013 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0440\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <s>\u043f\u0430\u0440\u043a\u0443\u0440<\/s> schema-registry. \u0412 \u0430\u0432\u0440\u043e-\u0444\u0438\u0433\u0430\u0432\u0440\u043e \u0438 \u043f\u0440\u043e\u0447\u0443\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u0443\u044e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0430 \u0448\u0438\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u0430 \u0432\u043e\u0442 \u0432 json \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435. \u0421\u0435\u0440\u0432\u0438\u0441\u044b, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u00ab\u0437\u0430 kafka\u2019\u043e\u0439\u00bb \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code>{ \u00a0\u00a0\u00a0 \"pointName\": \"125\", \u00a0\u00a0\u00a0 \"events\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Value\": 0.000000000000000e000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"timestamp\": 1694537700000000000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quality\": 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"annotatiton\": None, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Value\": 0.000000000000000e000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"timestamp\": 1694537700000000000, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quality\": 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\"annotatiton\": None, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0 ]<\/code><\/pre>\n<p>\u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2013 \u0442\u0438\u043f\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 (<em>\u0410 conditional-\u0441\u0445\u0435\u043c\u044b \u043d\u0443\u0443\u0443\u0443\u2026 \u044d\u044d\u044d\u2026 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c, \u043f\u0440\u0430\u0432\u0434\u0430?<\/em>) \u2013 \u043d\u043e \u0443 \u043d\u0430\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0447\u0442\u043e \u0432 \u0411\u0414 \u0435\u0441\u0442\u044c, \u0442\u043e \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u2013 \u0430 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0440\u0438\u0431\u0438\u0442 \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438.\u00a0 \u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u0434 \u044d\u0442\u043e \u0434\u0435\u043b\u043e jsonschema\u2019\u0443:<\/p>\n<pre><code>{ \u00a0 \"title\": \"JSONv3\", \u00a0 \"description\": \"\u0421\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 TSDS\", \u00a0 \"type\": \"object\", \u00a0 \"properties\": { \u00a0\u00a0\u00a0 \"pointName\": { \u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"string\" \u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0 \"events\": { \u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"array\", \u00a0\u00a0\u00a0\u00a0\u00a0 \"items\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"properties\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"annotation\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"null\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"value\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"number\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"timestamp\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"number\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quality\": { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"number\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 } \u00a0 } }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043f\u0438\u0445\u043d\u0435\u043c \u0435\u0451 \u0432 schemaregistry. <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 API kafka-rest \u2013 \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0432\u0435, \u0432\u0442\u043e\u0440\u0430\u044f \u0438 \u0442\u0440\u0435\u0442\u044c\u044f (<em>\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e &#8212; \u043b\u0443\u0414\u0448\u0430\u044f<\/em>). \u0423\u0432\u044b, \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0442\u043e\u0440\u0430\u044f, \u0442.\u043a. \u0442\u0440\u0435\u0442\u044c\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442. V2 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c) \u0444\u043e\u0440\u043c\u0430\u0442\u0435: {&#171;records&#187;:[{&#171;value&#187;:{&lt;&#171;\u0427\u0442\u043e&#187;:&#187;\u0432\u0430\u043c \u0443\u0433\u043e\u0434\u043d\u043e&#187;>}}]}. \u041d\u0443, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0436\u0435\u043b\u0430\u0435\u043c\u0443\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0443\u044e REST-proxy \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c:<\/p>\n<p><code>curl -X POST -H \"Content-Type: application\/vnd.kafka.jsonschema.v2+json\" --data '{\"value_schema_id\": &lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u0445\u0435\u043c\u044b>, \"records\":[{\"value\":{&lt;\u0434\u0430\u043d\u043d\u044b\u0435>}}]}' \"https:\/\/&lt;host>\/krest\/topics\/custom-int-test\/\" \u2013k<\/code><\/p>\n<p><code>#\u0442\u0430\u043a\u0438 \u0434\u0430: <\/code><\/p>\n<p><code>&lt;Response [200]> {\"offsets\":[{\"partition\":0,\"offset\":27,\"error_code\":null,\"error\":null},{\"partition\":0,\"offset\":28,\"error_code\":null,\"error\":null}],\"key_schema_id\":null,\"value_schema_id\":&lt;\u043d\u043e\u043c\u0435\u0440 \u0441\u0445\u0435\u043c\u044b>}<\/code><\/p>\n<p><code>#\u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c, \u0441\u0430\u043c\u0443\u044e \u043a\u0430\u043f\u0435\u043b\u044c\u043a\u0443, \u043c\u0430\u043b\u043e\u0441\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043f\u043e\u043b\u043e\u043c\u0430\u0435\u043c \u2013 \u0442\u0430\u043a\u0438 \u043d\u0435\u0442:<\/code><\/p>\n<p><code>&lt;Response [422]> {\"error_code\":42203,\"message\":\"Conversion of JSON to Object failed: Failed to convert JSON using JSON Schema: #\/events\/0\/quality: expected type: Number, found: String\"}<\/code><\/p>\n<p>\u0423\u0441\u043f\u0435\u0445? \u0425\u043c\u2026 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c. \u0410 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0445\u0435\u043c\u0435 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 _\u0431\u0435\u0437_ \u0441\u0445\u0435\u043c\u044b? \u0410 \u043d\u0438\u0447\u0435\u0433\u043e. \u0421\u043e\u0432\u0441\u0435\u043c. \u041d\u0435\u0442 \u0441\u0445\u0435\u043c\u044b \u2013 \u043d\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u2013 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. <\/p>\n<p>\u0411\u0438\u0434\u0430. \u0411\u0438\u0434\u0430-\u0431\u0438\u0434\u0430 \u0434\u0430\u0436\u0435. \u041d\u0435\u0442, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043a\u043e\u043d\u0444\u043b\u044e\u044d\u043d\u0442\u043e\u0432\u0441\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c broker-side \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0441\u0445\u0435\u043c \u2013 \u043d\u043e \u043e\u043d \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442. \u0425\u043c. \u0410 \u043a\u0430\u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442? \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 Content-Type:<\/p>\n<p>application\/vnd.kafka[.embedded_format].[api_version]+[serialization_format]<\/p>\n<p>application\/vnd.kafka.jsonschema.v2+json \u2013 \u0442.\u0435. \u0435\u0441\u0442\u044c \u00abjsonschema\u00bb \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 embedded format \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 json \u2013 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041d\u0443? \u041f\u043e\u043d\u044f\u043b\u0438, \u0434\u0430? \u0418\u0435\u0445, \u0441\u0433\u043e\u0440\u0435\u043b \u0441\u0430\u0440\u0430\u0439 \u2013 \u0433\u043e\u0440\u0438 \u0438 \u0445\u0430\u0442\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0435\u0442\u0438, \u043d\u0435<\/summary>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-354842","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354842","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=354842"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354842\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}