{"id":1699,"date":"2026-11-12T22:30:13","date_gmt":"2026-11-12T14:30:13","guid":{"rendered":"https:\/\/blog.humh.cn\/?p=1699"},"modified":"2026-11-12T22:37:09","modified_gmt":"2026-11-12T14:37:09","slug":"%e6%95%b0%e6%8d%ae%e5%ae%9e%e6%97%b6%e6%b5%81%e5%a4%84%e7%90%86%e5%b9%b3%e5%8f%b0%ef%bc%88kafka-streams%ef%bc%89%e9%a1%b9%e7%9b%ae%e4%bb%8b%e7%bb%8d","status":"publish","type":"post","link":"https:\/\/blog.humh.cn\/?p=1699","title":{"rendered":"\u6570\u636e\u5b9e\u65f6\u6d41\u5904\u7406\u5e73\u53f0\uff08Kafka Streams\uff09\u9879\u76ee\u4ecb\u7ecd"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote\"><p><strong>\u5b9e\u65f6\u6570\u4ed3\/\u5b9e\u65f6\u6570\u636e\u6d41\u5904\u7406\u5e73\u53f0\uff08Kafka + Kafka Streams + K8s\uff09<\/strong>\uff1a\u4ece 0 \u5230 1 \u642d\u5efa App \u5b9e\u65f6\u6570\u4ed3\uff0c\u4ee5\u300c\u5355\u955c\u50cf + Spring Profile\u300d\u6a21\u5f0f\u5728 K8s \u4e0a\u88c2\u53d8 40+ \u4e2a\u72ec\u7acb\u6d41\u5904\u7406\u5e94\u7528\uff0c\u6d88\u8d39\u57cb\u70b9\u4e0e Canal CDC \u4e24\u7c7b Kafka \u6570\u636e\u6e90\uff0c\u4ea7\u51fa 10 \u5206\u949f\u7c92\u5ea6\u5b9e\u65f6\u7ecf\u8425\u770b\u677f\uff08InfluxDB\uff09\u3001\u79d2\u7ea7\u7528\u6237\u753b\u50cf\uff08ES \u5bbd\u8868\uff09\u3001\u5b9e\u65f6\u98ce\u63a7\u53cd\u5f15\u6d41\uff08Redis \u9891\u63a7 + \u5185\u5bb9\/\u56fe\u7247\u8bc6\u522b + \u81ea\u52a8\u5c01\u7981\uff09\u3001\u70ed\u95e8\u5185\u5bb9 TopN \u699c\u5355\u3001\u5e7f\u544a\u5f52\u56e0\u56de\u6d41\u4e0e\u76d1\u7ba1\u5408\u89c4\u4e0a\u62a5\uff1b\u89e3\u51b3\u7a97\u53e3\u6700\u7ec8\u503c\u7ed3\u7b97\u3001at-least-once \u5e42\u7b49\u3001\u5927\u57fa\u6570 UV \u53bb\u91cd\u3001\u9ed1\u4ea7\u5b57\u7b26\u6df7\u6dc6\u5bf9\u6297\u7b49\u6838\u5fc3\u95ee\u9898\uff0c\u7a33\u5b9a\u670d\u52a1\u767e\u4e07\u7ea7\u7528\u6237 5 \u5e74\u3002<\/p><\/blockquote>\n\n\n\n<h2>1. \u9879\u76ee\u6982\u8ff0<\/h2>\n\n\n\n<p><strong>\u9879\u76ee\u540d\u79f0<\/strong>\uff1aApp \u6570\u4ed3\u5b9e\u65f6\u8ba1\u7b97\u5e73\u53f0<\/p>\n\n\n\n<p><strong>\u9879\u76ee\u80cc\u666f<\/strong>\uff1aApp \u662f\u4e00\u6b3e\u9762\u5411\u4e2d\u8001\u5e74\u7fa4\u4f53\u7684\u77ed\u89c6\u9891\u56fe\u6587\u521b\u4f5c\u4e0e\u793e\u4ea4\u793e\u533a\u7684\u4ea7\u54c1\uff08\u89c6\u9891\/\u76f4\u64ad\/IM \u79c1\u4fe1\/\u5145\u503c\u6253\u8d4f\uff09\uff0c\u4e1a\u52a1\u4e0a\u5bf9\u6570\u636e\u7684\u5b9e\u65f6\u6027\u6709\u56db\u7c7b\u6838\u5fc3\u8bc9\u6c42\uff1a<\/p>\n\n\n\n<ol><li><strong>\u5b9e\u65f6\u7ecf\u8425\u770b\u677f<\/strong>\u2014\u2014\u6d3b\u8dc3\u7528\u6237\/\u8bbe\u5907\u3001\u6ce8\u518c\u3001\u76f4\u64ad\u3001\u63a8\u9001\u3001\u652f\u4ed8\u3001\u8d44\u4ea7\u7b49\u6838\u5fc3\u6307\u6807\u4ee5 10 \u5206\u949f\u7c92\u5ea6\u4ea7\u51fa\uff0c\u4f9b\u8fd0\u8425\u4e0e\u7ba1\u7406\u5c42\u5b9e\u65f6\u51b3\u7b56\uff1b<\/li><li><strong>\u5b9e\u65f6\u7528\u6237\u753b\u50cf<\/strong>\u2014\u2014\u628a\u884c\u4e3a\u65e5\u5fd7\u4e0e\u6570\u636e\u5e93\u53d8\u66f4\u79d2\u7ea7\u6c47\u805a\u6210\u7528\u6237\u5bbd\u8868\u753b\u50cf\uff0c\u652f\u6491\u63a8\u8350\u3001\u98ce\u63a7\u4e0e\u8fd0\u8425\u67e5\u8be2\uff1b<\/li><li><strong>\u5b9e\u65f6\u98ce\u63a7\u53cd\u4f5c\u5f0a<\/strong>\u2014\u2014\u5bf9\u5f15\u6d41\u5bfc\u6d41\u3001\u6279\u91cf\u6ce8\u518c\u3001\u5237\u91cf\u7b49\u9ed1\u4ea7\u884c\u4e3a\u505a\u79d2\u7ea7\u53d1\u73b0\u4e0e\u81ea\u52a8\u5904\u7f6e\uff08\u5c01\u7981\/\u9a8c\u8bc1\u7801\uff09\uff1b<\/li><li><strong>\u5408\u89c4\u4e0e\u5916\u90e8\u6570\u636e\u56de\u6d41<\/strong>\u2014\u2014\u6309\u76d1\u7ba1\u89c4\u8303\u4e0a\u62a5\u660e\u7ec6\u884c\u4e3a\u6570\u636e\uff08BCP \u6587\u4ef6 + FTP\uff09\uff0c\u5e76\u5411\u5e7f\u544a\u6295\u653e\u5e73\u53f0\u56de\u4f20\u6fc0\u6d3b\/\u7559\u5b58\/\u4ed8\u8d39\u4e8b\u4ef6\u7528\u4e8e\u6295\u653e\u4f18\u5316\u3002<\/li><\/ol>\n\n\n\n<p><strong>\u9879\u76ee\u5b9a\u4f4d<\/strong>\uff1a\u4e00\u5957<strong>\u4ee5 Kafka \u4e3a\u6570\u636e\u603b\u7ebf\u3001\u4ee5 Kafka Streams \u4e3a\u8ba1\u7b97\u5f15\u64ce<\/strong>\u7684\u5b9e\u65f6\u6570\u4ed3\/\u5b9e\u65f6\u5904\u7406\u5e73\u53f0\uff0c\u8986\u76d6\u4e86\u5b9e\u65f6 ETL\u3001\u7a97\u53e3\u805a\u5408\u3001CDC \u589e\u91cf\u540c\u6b65\u3001\u5b9e\u65f6\u753b\u50cf\u3001\u6d41\u5f0f\u98ce\u63a7\u3001\u699c\u5355\u8ba1\u7b97\u3001\u5408\u89c4\u4e0a\u62a5\u7b49\u5178\u578b\u5b9e\u65f6\u573a\u666f\u3002<\/p>\n\n\n\n<p><strong>\u89c4\u6a21\u91cf\u7ea7<\/strong>\uff1a<\/p>\n\n\n\n<ul><li>\u5355\u4e00\u4ee3\u7801\u5e93\u88c2\u53d8\u4e3a <strong>40+ \u4e2a\u72ec\u7acb\u90e8\u7f72\u7684\u6d41\u5904\u7406\u5e94\u7528<\/strong>\uff0c\u8986\u76d6 <strong>20+ \u4e2a Kafka \u6570\u636e\u6e90 Topic<\/strong>\uff08\u57cb\u70b9\u7c7b + CDC \u7c7b\uff09\uff1b<\/li><li>\u670d\u52a1<strong>\u767e\u4e07\u7ea7\u6ce8\u518c\u7528\u6237<\/strong>\u7684\u5b9e\u65f6\u6307\u6807\u8ba1\u7b97\u4e0e\u753b\u50cf\u66f4\u65b0\uff1b<\/li><li>\u4ee3\u7801\u7ea6 150 \u4e2a Java\/Scala \u7c7b\uff0c\u6301\u7eed\u8fed\u4ee3 5 \u5e74\u4ee5\u4e0a\uff082018\u20132023\uff09\uff0c\u65e5\u5747\u5904\u7406\u5168\u91cf\u57cb\u70b9\u4e0e\u6570\u636e\u5e93\u53d8\u66f4\u6d41\u3002<\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2>2. \u6574\u4f53\u67b6\u6784<\/h2>\n\n\n\n<h3>2.1 \u67b6\u6784\u603b\u89c8\u56fe<\/h3>\n\n\n\n<pre class=\"mermaid\">flowchart TB\n    subgraph SRC[\"\u6570\u636e\u6e90\u5c42\"]\n        A1[\"App \u5ba2\u6237\u7aef\u670d\u52a1\u7aef\u57cb\u70b9<br>report-video \/ report-im \/ report-push \u7b49\"]\n        A2[\"\u7f51\u5173 API \u8bbf\u95ee\u65e5\u5fd7<br>access \/ access-api\"]\n        A3[\"\u4e1a\u52a1 MySQL \u96c6\u7fa4<br>\u7528\u6237\u5e93 \/ \u8d44\u91d1\u5e93 \/ \u5ba1\u6838\u5e93 \/ \u8bdd\u9898\u5e93\"]\n    end\n\n    subgraph MQ[\"\u91c7\u96c6\u4e0e\u6d88\u606f\u5c42\"]\n        C1[\"Fluentd -&gt; filebeat\"]\n        C2[\"Canal<br>MySQL Binlog \u8f6c JSON FlatMessage\"]\n        B[(\"Kafka \u96c6\u7fa4<br>\u57cb\u70b9 Topic \u4e0e binlog Topic<br>\u53ca Streams \u72b6\u6001 Changelog\")]\n    end\n\n    subgraph RT[\"\u5b9e\u65f6\u8ba1\u7b97\u5c42 - Kafka Streams \u5171 40+ \u6d41\u5e94\u7528\"]\n        D1[\"\u5b9e\u65f6\u7edf\u8ba1\u770b\u677f<br>10 \u5206\u949f\u7a97\u53e3\u805a\u5408\"]\n        D2[\"\u7528\u6237\u753b\u50cf<br>\u591a\u6e90 upsert\"]\n        D3[\"\u5b9e\u65f6\u98ce\u63a7<br>\u9891\u6b21 \/ UV \/ \u5185\u5bb9 \/ \u56fe\u7247\"]\n        D4[\"\u5b9e\u65f6\u699c\u5355 TopN<br>\u6ed1\u52a8\u7a97\u53e3\"]\n        D5[\"\u5e7f\u544a\u5f52\u56e0\u56de\u6d41<br>\u591a\u5e73\u53f0\u56de\u8c03\"]\n        D6[\"\u5408\u89c4\u4e0a\u62a5 WA<br>BCP \u6587\u4ef6\"]\n        D7[\"DataFinder \u56de\u6d41<br>\u6512\u6279\u4e0a\u62a5\"]\n    end\n\n    subgraph STORE[\"\u5b58\u50a8\u4e0e\u670d\u52a1\u5c42\"]\n        E1[(\"InfluxDB<br>\u5341\u5206\u949f\u770b\u677f\")]\n        E2[(\"Elasticsearch<br>user_profile \u753b\u50cf\")]\n        E3[(\"PostgreSQL<br>\u98ce\u63a7\u4e0e\u7edf\u8ba1\u6570\u636e\")]\n        E4[(\"Redis<br>\u53bb\u91cd \/ \u9501 \/ \u699c\u5355 \/ \u8ba1\u6570\")]\n        E5[(\"MySQL<br>\u4e1a\u52a1\u5e93\u4e0e\u79bb\u7ebf\u6570\u4ed3\")]\n        E6[\"\u63a8\u8350\u670d\u52a1 \/ \u5ba1\u6838\u670d\u52a1<br>\u53cd\u5783\u573e\u670d\u52a1 \/ \u5c01\u7981\u670d\u52a1\"]\n        E7[\"\u5e7f\u544a\u5e73\u53f0\u56de\u8c03<br>\u5934\u6761 \/ \u5feb\u624b \/ \u817e\u8baf\"]\n        E8[\"\u76d1\u7ba1 FTP \u4e0a\u62a5<br>BCP \u4e0e ZIP\"]\n        E9[\"\u706b\u5c71 DataFinder\"]\n        E10[\"\u9489\u9489\u544a\u8b66\u673a\u5668\u4eba\"]\n    end\n\n    A1 --&gt; C1\n    A2 --&gt; C1\n    C1 --&gt; B\n    A3 --&gt; C2 --&gt; B\n    B --&gt; D1\n    B --&gt; D2\n    B --&gt; D3\n    B --&gt; D4\n    B --&gt; D5\n    B --&gt; D6\n    B --&gt; D7\n    D1 --&gt; E1\n    D2 --&gt; E2\n    D3 --&gt; E3\n    D3 --&gt; E4\n    D3 --&gt; E6\n    D3 --&gt; E10\n    D4 --&gt; E4\n    D5 --&gt; E7\n    D6 --&gt; E8\n    D7 --&gt; E9\n    D2 --&gt; E5\n    D1 -. \u6279\u91cf\u5199\u5931\u8d25\u6216\u6d41\u5f02\u5e38 .-&gt; E10\n<\/pre>\n\n\n\n<h3>2.2 \u90e8\u7f72\u67b6\u6784\u56fe<\/h3>\n\n\n\n<pre class=\"mermaid\">flowchart LR\n    subgraph CICD[\"CI \u4e0e CD \u6d41\u6c34\u7ebf\"]\n        S1[\"Maven \u6784\u5efa<br>\u5355\u4e00 Fat Jar\"] --&gt; S2[\"Docker \u955c\u50cf<br>streams-appName:tag\"] --&gt; S3[\"Helm \u4e0e K8s\"]\n    end\n    subgraph K8S[\"Kubernetes \u96c6\u7fa4 - namespace colorv\"]\n        subgraph POOL[\"\u5927\u6570\u636e\u4e13\u7528\u8282\u70b9\u6c60 - nodeSelector big.data=stream\"]\n            P1[\"Pod: mau-stream<br>profile=mau\"]\n            P2[\"Pod: suspectim-stream<br>profile=suspectim\"]\n            P3[\"Pod: hotaudio-stream<br>profile=hotaudio\"]\n            PN[\"\u2026\u2026 \u5171 40+ \u4e2a\u72ec\u7acb Deployment\"]\n        end\n        CM[\"ConfigMap<br>\u751f\u4ea7\u914d\u7f6e\u70ed\u5237\u65b0\"] -.-&gt; P1\n        CM -.-&gt; P2\n        CM -.-&gt; P3\n        NAS[(\"NAS PVC<br>\u5408\u89c4\u6587\u4ef6\u5171\u4eab\u76d8\")] -.-&gt; PN\n    end\n    S3 --&gt; P1\n    S3 --&gt; P2\n    S3 --&gt; P3\n    S3 --&gt; PN\n<\/pre>\n\n\n\n<p><strong>\u90e8\u7f72\u6a21\u5f0f\u6838\u5fc3\u601d\u60f3\uff1a\u4e00\u4e2a\u4ee3\u7801\u5e93\u3001\u4e00\u4e2a Fat Jar\u3001\u4e00\u4e2a\u901a\u7528\u955c\u50cf\uff0c\u501f Spring Profile \u5728 K8s \u4e0a\u88c2\u53d8\u4e3a\u51e0\u5341\u4e2a\u72ec\u7acb\u7684\u6d41\u5904\u7406\u5e94\u7528\u3002<\/strong><\/p>\n\n\n\n<ul><li>\u6bcf\u6761\u6d41 = \u4e00\u4e2a <code>@Configuration + @EnableKafkaStreams + @Profile(\"xxx\")<\/code> \u7684\u62d3\u6251\u58f0\u660e\u7c7b\uff1b<\/li><li>\u5bb9\u5668\u542f\u52a8\u547d\u4ee4\u56fa\u5b9a\u4e3a <code>java -jar -Dspring.profiles.active=prod,&lt;appName&gt; app.jar<\/code>\uff0c<strong>\u4e00\u4e2a Deployment \u53ea\u6fc0\u6d3b\u4e00\u4e2a\u62d3\u6251<\/strong>\uff1b<\/li><li>\u6bcf\u4e2a\u5e94\u7528\u4ee5 <code>STREAM_NAME=&lt;appName&gt;-stream<\/code> \u4f5c\u4e3a Kafka Streams \u7684 <code>application.id<\/code> \u2192 <strong>\u72ec\u7acb\u6d88\u8d39\u7ec4\u3001\u72ec\u7acb\u72b6\u6001\u5b58\u50a8\uff08RocksDB State Store + Changelog\uff09\u3001\u72ec\u7acb\u6269\u7f29\u5bb9\u4e0e\u6eda\u52a8\u5347\u7ea7<\/strong>\uff0c\u5355\u6761\u6d41\u7684\u6545\u969c\/\u91cd\u542f\u5b8c\u5168\u4e0d\u5f71\u54cd\u5176\u4ed6\u6d41\uff1b<\/li><li>Helm Chart \u7528\u4e00\u4e2a\u6a21\u677f\u904d\u5386 <code>values.yaml<\/code> \u4e2d\u7684\u5e94\u7528\u5217\u8868\u6279\u91cf\u751f\u6210 Deployment\uff0c\u6784\u5efa\u811a\u672c\u652f\u6301<strong>\u6309\u5e94\u7528\u540d\u5355\u72ec\u6784\u5efa\u3001\u53d1\u7248\u3001\u7070\u5ea6\u6eda\u52a8<\/strong>\uff1b<\/li><li>\u8d44\u6e90\u89c4\u683c\uff1a\u5355 Pod \u9650\u5236 1C\/2G\uff0c\u8c03\u5ea6\u5230\u4e13\u7528\u5927\u6570\u636e\u8282\u70b9\uff0c\u5173\u95ed Service Mesh sidecar \u6ce8\u5165\u4ee5\u964d\u4f4e\u6d41\u5904\u7406\u65f6\u5ef6\u3002<\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2>3. \u6280\u672f\u6808<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5206\u7c7b<\/th><th>\u6280\u672f\u9009\u578b<\/th><th>\u7528\u9014\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u6d41\u8ba1\u7b97\u5f15\u64ce<\/td><td><strong>Kafka Streams<\/strong>\uff08RocksDB 5.18 \u72b6\u6001\u5b58\u50a8\uff09<\/td><td>40+ \u6761\u5b9e\u65f6\u62d3\u6251\uff1a\u7a97\u53e3\u805a\u5408\u3001TopN\u3001\u6d41\u8868 join\u3001CDC \u5904\u7406<\/td><\/tr><tr><td>\u6d88\u606f\u603b\u7ebf<\/td><td><strong>Kafka<\/strong><\/td><td>\u57cb\u70b9\/\u65e5\u5fd7\/CDC \u7edf\u4e00\u6570\u636e\u603b\u7ebf + Streams \u72b6\u6001 changelog<\/td><\/tr><tr><td>CDC \u91c7\u96c6<\/td><td><strong>Alibaba Canal<\/strong>\uff08FlatMessage JSON \u534f\u8bae\uff09<\/td><td>MySQL binlog \u2192 Kafka\uff0c\u6570\u636e\u5e93\u53d8\u66f4\u5b9e\u65f6\u6355\u83b7<\/td><\/tr><tr><td>\u57cb\u70b9\u4e0e\u5176\u4ed6\u6570\u636e\u91c7\u96c6<\/td><td>Fluentd -&gt; filebeat<\/td><td>\u670d\u52a1\u7aef\u5c06\u57cb\u70b9\u4e0e\u63a5\u53e3\u7b49\u65e5\u5fd7\u6570\u636e\u4e0a\u62a5 Fluentd<\/td><\/tr><tr><td>\u5e94\u7528\u6846\u67b6<\/td><td>Spring Boot 2.3 + Spring Kafka\uff08@EnableKafkaStreams\uff09<\/td><td>\u62d3\u6251\u58f0\u660e\u4e3a Spring Bean\uff0cProfile \u9694\u79bb\u591a\u5e94\u7528<\/td><\/tr><tr><td>\u8bbe\u8ba1\u8bed\u8a00<\/td><td>Java\u3001Shell<\/td><td>Java \u8d1f\u8d23\u4e3b\u903b\u8f91\u4ee3\u7801\u7f16\u5199\uff0cShell \u8d1f\u8d23\u7279\u5b9a\u903b\u8f91\u811a\u672c\u5b9e\u73b0<\/td><\/tr><tr><td>\u65f6\u5e8f\u5b58\u50a8<\/td><td><strong>InfluxDB<\/strong>\uff08\u6279\u91cf\u5199 + 2 \u5468\u4fdd\u7559\u7b56\u7565\uff09<\/td><td>\u300c\u5341\u5206\u949f\u770b\u677f\u300d\u5168\u90e8\u5b9e\u65f6\u6307\u6807<\/td><\/tr><tr><td>\u641c\u7d22\/\u753b\u50cf<\/td><td><strong>Elasticsearch 7.6<\/strong>\uff08RestHighLevelClient\uff09<\/td><td>user_profile \u7528\u6237\u753b\u50cf\u5bbd\u8868\uff0cupsert + scroll<\/td><\/tr><tr><td>\u7f13\u5b58\/\u5171\u4eab\u72b6\u6001<\/td><td><strong>Redis<\/strong>\uff08Jedis \u591a\u8fde\u63a5\u6c60\uff09<\/td><td>\u53bb\u91cd Set\u3001\u9891\u63a7\u8ba1\u6570\u3001\u5206\u5e03\u5f0f\u9501\u3001\u699c\u5355\u3001key \u8fc7\u671f\u4e8b\u4ef6<\/td><\/tr><tr><td>\u5173\u7cfb\u5e93<\/td><td>MySQL\uff08\u4e1a\u52a1\u5e93\u00d7\u591a\u5957\uff09\u3001<strong>PostgreSQL<\/strong>\uff08\u7edf\u8ba1\u5e93\uff09<\/td><td>\u98ce\u63a7\u843d\u5e93\u3001\u5e42\u7b49 upsert\uff08ON CONFLICT\uff09<\/td><\/tr><tr><td>\u5bf9\u8c61\u5b58\u50a8\/\u5185\u5bb9\u5b89\u5168<\/td><td><strong>\u4e03\u725b\u4e91<\/strong>\uff08\u56fe\u7247 hash\u3001OCR\u3001\u9274\u9ec4 API\uff09<\/td><td>\u5acc\u7591\u56fe\u7247\u8bc6\u522b\u3001\u56fe\u4e2d\u6587\u5b57\u62bd\u53d6<\/td><\/tr><tr><td>\u914d\u7f6e\u4e2d\u5fc3<\/td><td>Spring Cloud Kubernetes\uff08ConfigMap\uff09<\/td><td>\u751f\u4ea7\u914d\u7f6e event \u6a21\u5f0f\u76d1\u542c\u70ed\u5237\u65b0<\/td><\/tr><tr><td>\u5bb9\u5668\u5316<\/td><td>Docker + <strong>Helm + Kubernetes<\/strong><\/td><td>40+ Deployment \u6279\u91cf\u7f16\u6392\uff0cNAS PVC \u5171\u4eab\u76d8<\/td><\/tr><tr><td>\u53ef\u89c2\u6d4b\u6027<\/td><td>\u9489\u9489\u673a\u5668\u4eba\uff08HMAC \u52a0\u7b7e\uff09\u3001Kafka Streams \u72b6\u6001\u673a\u8054\u52a8\u63a2\u9488<\/td><td>\u5f02\u5e38\u544a\u8b66 + Pod \u81ea\u6108<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2>4. \u6838\u5fc3\u539f\u7406\u4e0e\u903b\u8f91\uff08\u6309\u6570\u636e\u94fe\u8def\u5c55\u5f00\uff09<\/h2>\n\n\n\n<h3>4.1 \u6570\u636e\u63a5\u5165\u5c42\uff1a\u4e24\u7c7b\u6570\u636e\u6e90<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u7c7b\u578b<\/th><th>Topic \u4e3e\u4f8b<\/th><th>\u751f\u4ea7\u65b9<\/th><th>\u6d88\u606f\u683c\u5f0f<\/th><\/tr><\/thead><tbody><tr><td>\u57cb\u70b9\/\u65e5\u5fd7\u6d41<\/td><td>report-video\u3001report-im\u3001report-push\u3001report-login\u3001access-api\u3001report-robot \u7b49<\/td><td>App \u5ba2\u6237\u7aef \/ \u4e1a\u52a1\u670d\u52a1\u7aef \/ \u7f51\u5173<\/td><td>JSON\uff08Snake_case\uff09<\/td><\/tr><tr><td>CDC \u6d41<\/td><td>binlog-master\u3001binlog-money\u3001binlog-topic\u3001binlog-video-texts \u7b49<\/td><td>Canal \u76d1\u542c\u5404 MySQL \u4e1a\u52a1\u5e93<\/td><td>Canal FlatMessage JSON<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Canal \u6d88\u606f\u89e3\u6790\u6a21\u578b<\/strong>\uff08CDC \u94fe\u8def\u7684\u7edf\u4e00\u5165\u53e3\uff09\uff1a\u6bcf\u6761\u6d88\u606f\u643a\u5e26 <code>database\/table<\/code>\uff08\u5e93\u8868\u8def\u7531\uff09\u3001<code>type<\/code>\uff08INSERT\/UPDATE\/DELETE\uff09\u3001<code>data<\/code>\uff08\u53d8\u66f4\u540e\u884c\u6570\u636e\u6570\u7ec4\uff09\u3001<code>old<\/code>\uff08\u53d8\u66f4\u524d\u5217\u503c\uff09\u3001<code>es<\/code>\uff08MySQL \u6267\u884c\u65f6\u95f4\uff09\u4e0e <code>ts<\/code>\uff08Canal \u5904\u7406\u65f6\u95f4\uff09\u3002\u8ba1\u7b97\u5c42\u7edf\u4e00\u6a21\u5f0f\u4e3a\uff1a<code>JsonSerde(FlatMessage)<\/code> \u53cd\u5e8f\u5217\u5316 \u2192 \u6309 <code>\u5e93.\u8868<\/code> \u8fc7\u6ee4\u8def\u7531\uff08<code>branch<\/code> \u5206\u6d41\uff09\u2192 <code>flatMapValues(getData())<\/code> \u644a\u5e73\u591a\u884c \u2192 \u6309\u4e8b\u4ef6\u7c7b\u578b\u5904\u7406\u3002\u5176\u4e2d <strong><code>data<\/code> \u4e0e <code>old<\/code> \u7684\u5dee\u5206<\/strong>\u662f\u8d44\u4ea7\u589e\u91cf\u5bf9\u8d26\u3001\u8ba2\u5355\u72b6\u6001\u8fc1\u79fb\u5224\u65ad\uff08\u5982\u300c\u652f\u4ed8\u56de\u8c03\u5b57\u6bb5\u7531 0 \u53d8\u975e 0\u300d\uff09\u7684\u5173\u952e\u3002<\/p>\n\n\n\n<h3>4.2 \u5b9e\u65f6\u7edf\u8ba1\u770b\u677f\uff08\u5341\u5206\u949f\u770b\u677f\uff09<\/h3>\n\n\n\n<p><strong>\u6a21\u5f0f<\/strong>\uff1a<code>stream \u2192 filter\/map \u2192 groupByKey \u2192 windowedBy(10 \u5206\u949f\u6eda\u52a8\u7a97\u53e3) \u2192 count\/reduce\/aggregate(Materialized \u547d\u540d\u72b6\u6001\u5e93) \u2192 foreach \u5199 InfluxDB<\/code>\u3002<\/p>\n\n\n\n<p>\u5178\u578b\u6307\u6807\u4e0e\u53bb\u91cd\u624b\u6bb5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u6307\u6807<\/th><th>\u6570\u636e\u6e90<\/th><th>\u8ba1\u7b97\u65b9\u5f0f<\/th><\/tr><\/thead><tbody><tr><td>\u6d3b\u8dc3\u7528\u6237\/\u8bbe\u5907\uff08\u6309 OS\uff09<\/td><td>access-api<\/td><td>\u65f6\u95f4\u6233\u5bf9\u9f50 10 \u5206\u949f\u6876\uff0c<strong>Redis Set SADD\/SCARD \u7cbe\u786e\u53bb\u91cd<\/strong>\uff0c\u4ec5\u5728\u96c6\u5408\u65b0\u589e\u6210\u5458\u65f6\u6253\u70b9<\/td><\/tr><tr><td>\u76f4\u64ad\u5927\u76d8\uff08\u623f\u95f4\u6570\/\u4e3b\u64ad UV\/\u65f6\u957f\/\u9001\u793c\u94bb\u77f3\/\u89c2\u770b PV\/UV\uff09<\/td><td>report-live + report-im \u53cc\u6e90\u5408\u6d41<\/td><td>\u7a97\u53e3 aggregate \u5230\u81ea\u5b9a\u4e49\u7d2f\u52a0\u5668\uff0c<strong>\u7a97\u53e3\u72b6\u6001\u5185 HashSet \u505a UV \u53bb\u91cd<\/strong><\/td><\/tr><tr><td>\u63a8\u9001\u5168\u94fe\u8def\u6f0f\u6597\uff08\u89e6\u53d1\u2192\u5382\u5546\u53d7\u7406\u2192\u5230\u8fbe\u2192\u70b9\u51fb\uff09<\/td><td>report-push<\/td><td>\u4e00\u4e2a\u7a97\u53e3\u805a\u5408\u51fa\u56db\u7ea7\u6f0f\u6597\u8ba1\u6570\uff0c\u4ec5\u4fe1\u4efb\u53ef\u4fe1\u5382\u5546\u56de\u6267\u9632\u5237\u91cf<\/td><\/tr><tr><td>\u5168\u7ad9\u865a\u62df\u8d44\u4ea7\u4f59\u989d<\/td><td>binlog-money\uff08Canal\uff09<\/td><td>\u89c1 4.6\u300c\u589e\u91cf\u5bf9\u8d26\u300d<\/td><\/tr><tr><td>\u5b9e\u9a8c\u5206\u6876\u6d41\u91cf\uff08A\/B \u5b9e\u9a8c\uff09<\/td><td>report-experiment<\/td><td>1 \u5206\u949f\u7a97\u53e3\u5185 <code>HashSet<\/code> \u7cbe\u786e\u53bb\u91cd\u7edf\u8ba1\u5404\u5b9e\u9a8c\u5206\u6876\u6d3b\u8dc3\u6570<\/td><\/tr><tr><td>\u6ce8\u518c\/\u8bbe\u5907\u6fc0\u6d3b\/\u652f\u4ed8\u8ba2\u5355\/\u5ba1\u6838\u65f6\u6548\/\u673a\u5668\u4eba\u4efb\u52a1\u91cf \u7b49<\/td><td>binlog \/ \u5404 report topic<\/td><td>\u540c\u6a21\u5f0f\u7a97\u53e3\u805a\u5408<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3>4.3 \u5b9e\u65f6\u7528\u6237\u753b\u50cf<\/h3>\n\n\n\n<pre class=\"mermaid\">flowchart LR\n    subgraph \u591a\u6e90\u6570\u636e\n        B1[access-api \u8bbf\u95ee\u65e5\u5fd7] --&gt;|ip| M\n        B2[report-video \u5730\u7406\u4e8b\u4ef6] --&gt;|\u7701\u5e02\/\u7ecf\u7eac\u5ea6| M\n        B3[binlog \u624b\u673a\u8d26\u53f7\u8868] --&gt;|phone| M\n        B4[binlog \u5b9e\u540d\u8ba4\u8bc1\u8868] --&gt;|\u59d3\u540d\/\u8bc1\u4ef6| M\n        B5[binlog \u8d44\u91d1\u5e93\u8d44\u4ea7\u8868] --&gt;|\u94bb\u77f3\/\u91d1\u5e01\/\u91d1\u8c46| M\n        B6[access-api \u8001\u7528\u6237\u56de\u8bbf] --&gt;|last_active\/app_version\/\u6e20\u9053| M\n    end\n    M[ES user_profile \u7d22\u5f15<br>doc_id = user_id<br>doc \u5c40\u90e8\u66f4\u65b0 + \u51b2\u7a81\u91cd\u8bd5]\n    M --&gt; R1[\u98ce\u63a7\uff1a\u7528\u6237\u4ef7\u503c\/\u98ce\u9669\u5224\u5b9a]\n    M --&gt; R2[\u5408\u89c4\u4e0a\u62a5\uff1aIP\/\u7ecf\u7eac\u5ea6\/\u884c\u653f\u533a\u5212\u8865\u5168]\n    M --&gt; R3[\u8fd0\u8425\u67e5\u8be2]\n<\/pre>\n\n\n\n<ul><li><strong>\u5bbd\u8868\u5f0f\u753b\u50cf<\/strong>\uff1a\u4e0d\u5efa\u5927\u5bbd\u8868 Schema\uff0c\u800c\u662f\u5404\u7ef4\u5ea6\u72ec\u7acb\u4e8b\u4ef6\u6d41\u6309 user_id \u6301\u7eed <code>upsert<\/code> \u5230\u540c\u4e00 ES \u6587\u6863\uff08<code>UpdateRequest.doc<\/code> \u5c40\u90e8\u5408\u5e76 + <code>retryOnConflict<\/code>\uff09\uff0c\u5355\u7ef4\u5ea6\u66f4\u65b0\u4e92\u4e0d\u8986\u76d6\u3001\u5929\u7136\u5e42\u7b49\u53ef\u91cd\u653e\uff1b<\/li><li>\u300c\u6700\u540e\u6d3b\u8dc3\/\u7248\u672c\/\u6e20\u9053\u300d\u7c7b\u5f31\u5b9e\u65f6\u5b57\u6bb5\u7528 <strong>\u6309\u5929\u7a97\u53e3 + reduce \u53d6\u6700\u65b0\u503c<\/strong> \u7684\u65b9\u5f0f\u964d\u9891\u66f4\u65b0\uff08\u6bcf\u7528\u6237\u6bcf\u5929\u81f3\u591a\u4e00\u6761\uff09\uff1b<\/li><li>\u8bfb\u53d6\u4fa7\u6309\u89c4\u6a21\u81ea\u9002\u5e94\uff1a&lt;1000 \u7528\u6237\u8d70 terms \u67e5\u8be2\uff0c\u22651000 \u8d70 <strong>scroll \u6eda\u52a8\u67e5\u8be2<\/strong>\uff0c\u591a\u7528\u6237\u591a\u5b57\u6bb5\u7528 <strong>msearch<\/strong> \u6279\u91cf\u3002<\/li><\/ul>\n\n\n\n<h3>4.4 \u5b9e\u65f6\u98ce\u63a7\uff08\u53cd\u5f15\u6d41\/\u53cd\u4f5c\u5f0a\uff09<\/h3>\n\n\n\n<p>\u98ce\u63a7\u662f\u672c\u9879\u76ee\u903b\u8f91\u6700\u590d\u6742\u3001\u5bf9\u6297\u6027\u6700\u5f3a\u7684\u90e8\u5206\u3002\u603b\u4f53\u67b6\u6784\u4e3a\u300c<strong>5 \u8def\u4fe1\u53f7\u91c7\u96c6 \u2192 \u7edf\u4e00\u5acc\u7591\u670d\u52a1 \u2192 \u5206\u7ea7\u5904\u7f6e<\/strong>\u300d\uff1a<\/p>\n\n\n\n<pre class=\"mermaid\">flowchart TB\n    subgraph SIG[\"\u4e94\u8def\u4fe1\u53f7\u91c7\u96c6 - \u5404\u81ea\u72ec\u7acb\u6d41\u5e94\u7528\"]\n        S1[\"\u63a5\u53e3\u9891\u6b21<br>access-api \u9ad8\u5371\u63a5\u53e3\"]\n        S2[\"IM \u79c1\u4fe1<br>\u817e\u8baf\u4e91\u56de\u8c03\"]\n        S3[\"\u8bc4\u8bba\u9891\u6b21<br>report-video\"]\n        S4[\"\u6587\u672c\u5185\u5bb9<br>\u8bc4\u8bba \/ \u6635\u79f0 \/ \u7b7e\u540d \/ \u79c1\u4fe1\"]\n        S5[\"\u56fe\u7247\u5185\u5bb9<br>\u5934\u50cf \/ \u76f8\u518c \/ \u79c1\u4fe1\u56fe \/ \u8bdd\u9898\u5c01\u9762\"]\n    end\n    subgraph CORE[\"\u7edf\u4e00\u5224\u5b9a SuspectContentService\"]\n        J1[\"\u5b57\u7b26\u53cd\u6df7\u6dc6\u5f52\u4e00\u5316<br>\u82b1\u4f53\u6570\u5b57 \/ \u5168\u89d2 \/ \u5f62\u8fd1\u5b57 \/ \u4e2d\u6587\u6570\u5b57\"]\n        J2[\"\u6b63\u5219\u62bd\u53d6\u5acc\u7591\u5173\u952e\u8bcd<br>\u5fae\u4fe1\u53f7 \/ QQ \/ \u624b\u673a\u53f7 \/ URL\"]\n        J3[\"\u56fe\u7247 hash \u9ed1\u767d\u540d\u5355<br>\u4e0e OCR \u56fe\u4e2d\u6587\u5b57\"]\n        J4[\"PG \u5e42\u7b49\u843d\u5e93<br>key \u52a0 user \u52a0 md5 \u552f\u4e00\uff0ccount \u7d2f\u52a0\"]\n        J5[\"\u9608\u503c\u5206\u7ea7<br>\u5168\u7ad9\u4e0e\u5355\u7528\u6237\u4e24\u7ea7\u9608\u503c\"]\n    end\n    subgraph ACT[\"\u5206\u7ea7\u5904\u7f6e\"]\n        O1[\"\u9a8c\u8bc1\u7801\u6311\u6218<br>\u5f31\u4fe1\u53f7 - \u8bc4\u8bba\u9891\u6b21\"]\n        O2[\"\u7cfb\u7edf\u7ea7\u5168\u7ad9\u5c01\u7981<br>\u5f3a\u4fe1\u53f7 - \u9ad8\u5371\u6e20\u9053\u5305 \/ \u9ed1\u8bcd \/ \u9ed1\u56fe\"]\n        O3[\"\u9489\u9489\u544a\u8b66\u4e0e\u9ed1\u8bcd\u5e93\u56de\u704c<br>\u4eba\u5de5\u5728\u56de\u8def\u5b9a\u6027\"]\n    end\n    S1 --&gt; J4\n    S2 --&gt; J4\n    S3 --&gt; J4\n    S4 --&gt; J1\n    J1 --&gt; J2\n    J2 --&gt; J4\n    S5 --&gt; J3\n    J3 --&gt; J4\n    J4 --&gt; J5\n    J5 --&gt; O1\n    J5 --&gt; O2\n    J5 --&gt; O3\n<\/pre>\n\n\n\n<p><strong>\u5173\u952e\u8bbe\u8ba1\u70b9<\/strong>\uff1a<\/p>\n\n\n\n<ol><li><strong>Redis Key + TTL \u5373\u98ce\u63a7\u7a97\u53e3<\/strong>\uff1a\u5206\u949f\u7ea7\uff08Set \u7edf\u8ba1\u79c1\u4fe1\u89e6\u8fbe\u7684\u4e0d\u540c\u6536\u4ef6\u4eba UV\uff0c\u9608\u503c 60\uff09\u3001\u65e5\u7ea7\uff08UV 500 \/ \u63a5\u53e3 PV 2000\/1000\/500 \u6309\u63a5\u53e3\u5206\u7ea7\uff09\u2014\u2014\u98ce\u63a7\u8ba1\u6570\u4e0d\u4f9d\u8d56 Kafka Streams \u7a97\u53e3\uff0c\u8de8\u5b9e\u4f8b\u5171\u4eab\u3001\u5929\u7136\u6eda\u52a8\u8fc7\u671f\uff1b<\/li><li><strong>\u65b0\u8001\u7528\u6237\u6c34\u4f4d\u7ebf<\/strong>\uff1a\u7528\u81ea\u589e user_id \u6c34\u4f4d\uff08\u5982\u300c3 \u4e2a\u6708\u524d\u6700\u5c0f user_id\u300d\uff09\u533a\u5206\u65b0\u8001\u8d26\u53f7\uff0c\u8001\u7528\u6237\u8c41\u514d\u9891\u63a7\uff0c\u805a\u7126\u65b0\u6ce8\u518c\u9ed1\u4ea7\u5c0f\u53f7\uff0c\u540c\u65f6\u7ed3\u5408\u8bbe\u5907\/\u6e20\u9053\u753b\u50cf\uff08\u7279\u5b9a\u8001\u5b89\u5353\u7248\u672c + \u5e94\u7528\u5546\u5e97\u6e20\u9053\u5305\uff09\u76f4\u63a5\u5c01\u7981\uff1b<\/li><li><strong>\u300c\u5148\u89c2\u6d4b\u3001\u540e\u5b9a\u6027\u3001\u518d\u81ea\u52a8\u5c01\u7981\u300d\u7684\u4eba\u5728\u56de\u8def\u673a\u5236<\/strong>\uff1a\u65b0\u51fa\u73b0\u7684\u8054\u7cfb\u65b9\u5f0f\u53ea\u7d2f\u8ba1\u4e0d\u5c01\u7981\uff1b\u88ab\u8fd0\u8425\/\u544a\u8b66\u5b9a\u6027\u4e3a\u9ed1\u4ea7\u7684\u8bcd\/\u56fe\u8fdb\u5165\u9ed1\u540d\u5355\u540e\uff0c\u518d\u4f20\u64ad\u8005\u81ea\u52a8\u5c01\u7981\uff08\u56fe\u7247\u7528\u4e03\u725b hash \u8de8\u7528\u6237\u590d\u7528\u5df2\u5b9a\u6027\u8fdd\u89c4\u56fe\uff09\uff1b\u666e\u901a\u5185\u5bb9\u8981\u6c42\u5355\u7528\u6237\u5386\u53f2\u7d2f\u8ba1\u8d85\u9608\u503c\u624d\u5c01\uff0c\u907f\u514d\u8bef\u4f24\uff1b<\/li><li><strong>\u6587\u672c\u53cd\u6df7\u6dc6\u5bf9\u6297<\/strong>\uff1a\u9ed1\u4ea7\u7528\u82b1\u4f53 Unicode \u6570\u5b57\u3001\u5168\u89d2\u5b57\u7b26\u3001\u4e2d\u6587\u6570\u5b57\u3001\u5f62\u8fd1\u5b57\u62fc\u8054\u7cfb\u65b9\u5f0f\uff0c\u7cfb\u7edf\u5148\u505a\u5b57\u7b26\u5f52\u4e00\u5316\u518d\u6b63\u5219\u62bd\u53d6\uff08\u5fae\u4fe1\u53f7\u6837\u5f0f \/ 5\u201320 \u4f4d\u8fde\u7eed\u6570\u5b57 \/ URL\uff09\uff0c\u957f\u6587\u672c\u6309 100 \u5b57\u5207\u7247\u9001\u68c0\u9632\u622a\u65ad\u6f0f\u5339\u914d\uff1b<\/li><li><strong>\u884c\u4e3a\u5bbd\u8868<\/strong>\uff1a\u53e6\u6709\u4e00\u8def\u628a\u300c\u6bcf\u7528\u6237\u6bcf\u5c0f\u65f6\u5bf9\u591a\u5c11\u4e0d\u540c\u5bf9\u8c61\u70b9\u8d5e\/\u8bc4\u8bba\/\u5173\u6ce8\/\u79c1\u4fe1\u300d\u7684\u53bb\u91cd UV \u5199\u5165 PG \u5c0f\u65f6\u8868\uff0c\u4f9b\u79bb\u7ebf\u7b56\u7565\u5206\u6790\u3002<\/li><\/ol>\n\n\n\n<h3>4.5 \u5b9e\u65f6\u699c\u5355 TopN\uff08\u70ed\u95e8\u97f3\u4e50\/\u641c\u7d22\u70ed\u8bcd\/\u573a\u666f\u8bcd\uff09<\/h3>\n\n\n\n<p><strong>\u4e24\u6bb5\u5f0f\u7a97\u53e3\u805a\u5408 + \u81ea\u7814 Top \u5bb9\u5668 + \u539f\u5b50\u53d1\u5e03<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u7b2c\u4e00\u5c42\uff1a\u6309\u5185\u5bb9 key \u5206\u7ec4 \u2192 6 \u5c0f\u65f6\u7a97\u53e3 \/ 1 \u5c0f\u65f6\u6ed1\u52a8 hopping window\n        \u2192 aggregate \u51fa (\u66dd\u5149\u6570, \u4f7f\u7528\u6570)          [WindowStore]\n\u7b2c\u4e8c\u5c42\uff1a\u4ee5\u300c\u7a97\u53e3\u7ed3\u675f\u65f6\u95f4\u300d\u4e3a key \u2192 \u805a\u5408\u8fdb\u81ea\u7814 Top&lt;T> \u5bb9\u5668\n        \uff08TreeSet \u5b9a\u957f\u6709\u5e8f\u3001\u652f\u6301\u7a97\u53e3\u6ed1\u51fa\u65f6\u64a4\u56de remove\uff09  [KeyValueStore]\n\u8f93\u51fa\uff1a  \u4ec5\u53d1\u5e03\u300c\u7a97\u53e3\u7ed3\u675f\u8ddd\u4eca 1 \u5c0f\u65f6\u5185\u300d\u7684\u699c\u5355\u5143\u6570\u636e\n        \u2192 Redis \u4e34\u65f6 list \u5199\u6ee1\u540e rename \u539f\u5b50\u66ff\u6362\u6b63\u5f0f key<\/pre>\n\n\n\n<ul><li>\u81ea\u7814 <code>Top&lt;T&gt;<\/code> \u5bb9\u5668\u89e3\u51b3\u300cTopN \u72b6\u6001\u9700\u8981\u53ef\u5e8f\u5217\u5316\u6062\u590d + \u7a97\u53e3\u8fc7\u671f\u64a4\u56de\u300d\u4e24\u4e2a\u95ee\u9898\uff0c\u914d\u5957\u81ea\u5b9a\u4e49 Deserializer \u5728\u72b6\u6001\u6062\u590d\u65f6\u91cd\u5efa\u5bb9\u5668\uff1b<\/li><li>\u699c\u5355\u6392\u5e8f\u4ee5<strong>\u771f\u5b9e\u4f7f\u7528\u91cf\u4e3a\u4e3b\u6743\u91cd\u3001\u66dd\u5149\u91cf\u4e3a\u6b21\u5e8f<\/strong>\uff0c\u9632\u5237\u91cf\uff1b<\/li><li>\u4e34\u65f6 key + <code>rename<\/code> \u4fdd\u8bc1\u8bfb\u4fa7\u6c38\u8fdc\u770b\u4e0d\u5230\u534a\u6210\u54c1\u699c\u5355\u3002<\/li><\/ul>\n\n\n\n<h3>4.6 CDC \u589e\u91cf\u5bf9\u8d26\uff08\u5168\u7ad9\u8d44\u4ea7\u603b\u989d\u7edf\u8ba1\uff09\u2014\u2014\u6700\u5178\u578b\u7684\u7a97\u53e3\u5de5\u7a0b\u96be\u70b9<\/h3>\n\n\n\n<p><strong>\u95ee\u9898<\/strong>\uff1aKafka Streams \u7684 <code>windowedBy(...)<\/code> \u540e\u7684\u8f93\u51fa<strong>\u4e0d\u662f\u7a97\u53e3\u5173\u95ed\u65f6\u89e6\u53d1\u4e00\u6b21<\/strong>\uff0c\u800c\u662f\u4ee5\u79d2\u7ea7\u8282\u594f\u6301\u7eed\u589e\u91cf\u89e6\u53d1\uff1b\u4e14\u628a\u300c\u65b0\u589e\u300d\u548c\u300c\u51cf\u5c11\u300d\u62c6\u6210\u4e24\u6761\u652f\u6d41\u540e\uff0c\u5e76\u53d1\u56de\u8bfb\u65f6\u5e8f\u5e93\u4e0a\u4e00\u7a97\u53e3\u503c\u5b58\u5728\u7ade\u6001\u3002<\/p>\n\n\n\n<p><strong>\u89e3\u6cd5\uff08\u5f53\u524d\u7a97\u53e3\u53ea\u7d2f\u52a0\u3001\u4e0b\u4e00\u7a97\u53e3\u505a\u7ed3\u7b97\uff0cRedis \u5355\u7ebf\u7a0b\u505a\u4ef2\u88c1\uff09<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"mermaid\">sequenceDiagram\n    participant K as Kafka Streams \u7a97\u53e3\u805a\u5408\n    participant R as Redis\uff08\u5355\u7ebf\u7a0b\u4ef2\u88c1\uff09\n    participant I as InfluxDB\n    Note over K: \u7a97\u53e3 N\uff0810 \u5206\u949f\uff09\n    K-&gt;&gt;R: add \u6d41\uff1adata \u65b0\u503c\u7a97\u53e3\u6c42\u548c \u2192 key add_N\n    K-&gt;&gt;R: sub \u6d41\uff1aold \u65e7\u503c\u7a97\u53e3\u6c42\u548c \u2192 key sub_N\n    Note over K: \u8fdb\u5165\u7a97\u53e3 N+1\uff08start == N.end \u5bf9\u9f50\uff09\n    K-&gt;&gt;R: setnx \u5360\u4f4d\uff08\u4fdd\u8bc1\u53ea\u7ed3\u7b97\u4e00\u6b21\uff09\n    K-&gt;&gt;R: \u8bfb final_N-1 + add_N \u2212 sub_N\n    K-&gt;&gt;I: \u5199\u5165\u5168\u7ad9\u8d44\u4ea7\u603b\u989d\uff0810 \u5206\u949f\u7c92\u5ea6\uff09\n    K-&gt;&gt;R: \u66f4\u65b0 final_N\uff0c\u6e05\u7406 N \u5468\u671f\u4e2d\u95f4 key\n<\/pre>\n\n\n\n<p>\u914d\u5408\u300c\u5b9e\u65f6\u5148\u884c\u3001\u79bb\u7ebf T+1 \u6821\u6b63\u5dee\u503c\u300d\u7684\u53e3\u5f84\u5bf9\u8d26\u601d\u8def\uff0c\u89e3\u51b3\u4e86\u5b9e\u65f6\u503c\u4e0e\u79bb\u7ebf\u57fa\u51c6\u7684\u8854\u63a5\u3002\u540c\u4e00\u6a21\u5f0f\uff08\u7a97\u53e3\u5bf9\u9f50 + Redis \u7f13\u5b58 + \u4e0b\u4e00\u7a97\u53e3\u7ed3\u7b97\uff09\u4e5f\u7528\u4e8e\u300c\u89c6\u9891\u53d1\u5e03\u2192\u5ba1\u6838\u5165\u5e93\u5e73\u5747\u65f6\u957f\u300d\u7b49\u5747\u503c\u7c7b\u6307\u6807\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923.png\" target=\"_blank\" rel=\"noopener\"><img width=\"1024\" height=\"559\" class=\"wp-image-1712 lazyload\" title=\"\u6570\u636e\u5b9e\u65f6\u6d41\u5904\u7406\u5e73\u53f0\uff08Kafka Streams\uff09\u9879\u76ee\u4ecb\u7ecd\" src=\"data:image\/gif;base64,R0lGODlhAgABAIAAALGxsQAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==\" data-src=\"https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-1024x559.png\" alt=\"https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-1024x559.png\" data-srcset=\"https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-1024x559.png 1024w, https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-300x164.png 300w, https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-768x419.png 768w, https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-1536x839.png 1536w, https:\/\/file.blog.humh.cn\/wp-content\/uploads\/2026\/11\/20261112202933923-2048x1118.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/a><figcaption>\u90e8\u5206\u793a\u4f8b\u4ee3\u7801<\/figcaption><\/figure><\/div>\n\n\n\n<h3>4.7 \u5e7f\u544a\u6295\u653e\u5f52\u56e0\u4e0e\u4e8b\u4ef6\u56de\u6d41<\/h3>\n\n\n\n<p><strong>\u5f52\u56e0\u94fe\u8def<\/strong>\uff1a\u5e7f\u544a\u70b9\u51fb\u65e5\u5fd7\uff08\u542b\u8bbe\u5907\u6807\u8bc6 only_key \/ idfa \/ udid + \u8ba1\u5212\/\u521b\u610f\/\u5e7f\u544a\u4e3b\/\u6295\u653e\u7aef\u7ef4\u5ea6\uff09\u843d\u4e1a\u52a1\u5e93 \u2192 \u5b9e\u65f6\u6d41\u4ee5\u8bbe\u5907\u6807\u8bc6\u53cd\u67e5\u70b9\u51fb\u8bb0\u5f55\u5bcc\u5316\u6295\u653e\u7ef4\u5ea6\uff08\u5185\u7f6e\u6295\u653e\u7aef\/\u5e7f\u544a\u4e3b\/\u4ee3\u7406\u5546\u5b57\u5178\u7ffb\u8bd1\uff09\u2192 \u6309\u7ef4\u5ea6\u7a97\u53e3\u8ba1\u6570\u4ea7\u51fa\u300c\u6fc0\u6d3b\u5f52\u56e0\u300d\u300c\u65b0\u5ba2\u5f53\u5929\u521b\u4f5c\u8f6c\u5316\u300d\u5b9e\u65f6\u6307\u6807\u3002<\/p>\n\n\n\n<p><strong>\u4e8b\u4ef6\u56de\u6d41\u94fe\u8def<\/strong>\uff08\u6fc0\u6d3b\/\u6b21\u7559\/\u4ed8\u8d39\u56de\u4f20\u7ed9\u6295\u653e\u5e73\u53f0\uff0c\u7528\u4e8e\u5e73\u53f0\u4fa7 oCPX \u4f18\u5316\uff09\uff1a<\/p>\n\n\n\n<ul><li>\u6b21\u7559\u56de\u6d41\uff1a\u8bc6\u522b\u300c\u6628\u65e5\u9996\u6b21\u8bbf\u95ee\u3001\u4eca\u65e5\u4ecd\u6d3b\u8dc3\u300d\u7684\u7528\u6237 \u2192 \u67e5 Redis \u4e2d\u7f13\u5b58\u7684\u8be5\u8bbe\u5907\u56de\u8c03 URL \u2192 <strong>\u6309\u56de\u8c03 URL \u57df\u540d\u8def\u7531\u5230\u4e0d\u540c\u5e73\u53f0<\/strong>\uff08\u5934\u6761\/\u5feb\u624b\/\u817e\u8baf\/\u53cb\u76df\uff09\uff0c\u4ee5\u5404\u5e73\u53f0\u7ea6\u5b9a\u7684 <code>event_type<\/code> \u7ec4\u88c5\u53c2\u6570\u56de\u4f20\uff1b<\/li><li>\u4ed8\u8d39\u56de\u6d41\uff1a\u76d1\u542c\u8ba2\u5355\u8868 binlog \u7684\u652f\u4ed8\u6210\u529f\u72b6\u6001\u8fc1\u79fb\uff08<code>old<\/code>\/<code>data<\/code> \u5dee\u5206\u5224\u5b9a\uff09\u2192 \u56de\u4f20\u4ed8\u8d39\u4e8b\u4ef6\uff1b<\/li><li><strong>\u5e42\u7b49\u4fdd\u969c<\/strong>\uff1a\u56de\u8c03\u6210\u529f\u5373\u5220\u9664 Redis \u56de\u8c03\u7f13\u5b58 key\uff0c\u786e\u4fdd\u6bcf\u53f0\u8bbe\u5907\u6bcf\u7c7b\u4e8b\u4ef6\u53ea\u56de\u4f20\u4e00\u6b21\uff1b\u5931\u8d25\u9489\u9489\u544a\u8b66\u3002<\/li><\/ul>\n\n\n\n<h3>4.8 \u76d1\u7ba1\u5408\u89c4\u6570\u636e\u4e0a\u62a5\uff08WA \u94fe\u8def\uff09<\/h3>\n\n\n\n<p>\u6309\u76d1\u7ba1\u89c4\u8303\u4e0a\u62a5 15 \u7c7b\u660e\u7ec6\u884c\u4e3a\u6570\u636e\uff08\u6ce8\u518c\/\u767b\u5f55\/\u597d\u53cb\/\u64ad\u653e\/\u8bc4\u8bba\/\u70b9\u8d5e\/\u5173\u6ce8\/\u5206\u4eab\/\u79c1\u4fe1\/\u652f\u4ed8\/\u5145\u503c\/\u4e0b\u5355\/\u6253\u8d4f\/\u641c\u7d22\uff09\uff0c\u6bcf\u6761\u8bb0\u5f55\u9700\u8865\u5168\u884c\u653f\u533a\u5212\uff08GB\/T 2260 \u516d\u4f4d\u7801\uff0c\u672c\u5730\u5b57\u5178 + \u753b\u50cf\u7701\u5e02\u533a\u8f6c\u6362\uff09\u3001IP\uff08\u8f6c\u957f\u6574\u578b\uff09\u3001\u7ecf\u7eac\u5ea6\u7b49\u6eaf\u6e90\u5b57\u6bb5\u3002<\/p>\n\n\n\n<p><strong>\u94fe\u8def\u8bbe\u8ba1<\/strong>\uff08\u5178\u578b\u300c\u6d41\u5f0f\u843d\u76d8 + \u5b9a\u65f6\u6253\u5305\u4e0a\u4f20\u300d\u67b6\u6784\uff09\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Canal binlog \/ \u57cb\u70b9 topic\n  \u2192 \u6d41\u5185\u8fc7\u6ee4\u5bcc\u5316\uff08CSV \u914d\u7f6e\u9a71\u52a8\u7684\u300c\u76d1\u7ba1\u5b57\u6bb5 \u2190 \u4e1a\u52a1\u5e93.\u8868.\u5b57\u6bb5\u300d\u6620\u5c04\uff0c\u975e\u786c\u7f16\u7801\uff09\n  \u2192 \u8ffd\u52a0\u5199 BCP \u6570\u636e\u6587\u4ef6\uff08NAS \u5171\u4eab\u76d8\uff0c\u591a Pod \u6587\u4ef6\u9501\u9632\u5e76\u53d1\uff1b\u5355\u6587\u4ef6 5000 \u884c\u6eda\u52a8\u5207\u5206\uff09\n  \u2192 \u51d1\u591f N \u4e2a\u6587\u4ef6 \u6216 Redis \u89e6\u53d1 key \u8fc7\u671f\uff08keyspace notification \u76d1\u542c\uff0c\u4fdd\u8bc1\u81f3\u5c11\u6bcf 5 \u5206\u949f\u4e00\u5305\uff09\n      \u2192 setnx \u62a2\u9501\uff08\u591a\u8282\u70b9\u53ea\u6709\u4e00\u4e2a\u6267\u884c\uff09\n  \u2192 shell \u6e05\u6d17 + \u4ece ES \u753b\u50cf\u6279\u91cf\u8865\u5217 + \u6a2a\u5411\u5408\u5e76\n  \u2192 \u751f\u6210\u7d22\u5f15 XML\uff08GAB_ZIP_INDEX\uff0cXStream \u5e8f\u5217\u5316\uff09\u2192 \u6253 ZIP\n  \u2192 \u5bbf\u4e3b\u673a crontab \u6bcf\u5206\u949f\u7ecf VPN + FTP \u4e0a\u4f20\u76d1\u7ba1\u4fa7\uff08\u4e0a\u4f20\u524d\u81ea\u52a8\u68c0\u6d4b VPN \u5065\u5eb7\u3001\u5931\u8d25\u81ea\u6108\u91cd\u542f\uff09<\/pre>\n\n\n\n<h3>4.9 \u670d\u52a1\u7aef\u57cb\u70b9\u56de\u6d41\uff08DataFinder\uff09<\/h3>\n\n\n\n<p>\u628a\u670d\u52a1\u7aef\u65e5\u5fd7\u4e0e\u8ba2\u5355 binlog \u4e8c\u6b21\u52a0\u5de5\u6210\u6807\u51c6\u57cb\u70b9\u4e8b\u4ef6\uff08<code>user\/header\/events<\/code> \u4e09\u6bb5\u5f0f\u534f\u8bae\uff09\uff0c\u56de\u6d41\u5230\u589e\u957f\u5206\u6790\u5e73\u53f0\uff0c\u8865\u9f50\u5ba2\u6237\u7aef\u57cb\u70b9\u8986\u76d6\u4e0d\u5230\u7684\u670d\u52a1\u7aef\u884c\u4e3a\uff08VIP\/\u94bb\u77f3\u5546\u54c1\u4e0b\u5355\u4e0e\u652f\u4ed8\u6210\u529f\u7b49\u5546\u4e1a\u5316\u4e8b\u4ef6\uff09\u3002<\/p>\n\n\n\n<ul><li><strong>10 \u79d2\u77ed\u7a97\u53e3\u6512\u6279<\/strong>\uff1a\u6309 userId \u5206\u7ec4\u3001\u7a97\u53e3\u5185\u5b57\u7b26\u4e32\u62fc\u63a5\u805a\u5408\u6210\u6279\u540e\u6279\u91cf\u4e0a\u62a5\uff0c\u663e\u8457\u964d\u4f4e\u5916\u547c\u8bf7\u6c42\u6570\uff08\u6279\u91cf\u63a5\u53e3\u6709\u6761\u6570\u4e0a\u9650\uff09\uff1b<\/li><li>10 \u7ebf\u7a0b\u5f02\u6b65 + <code>@Retryable<\/code> \u6307\u6570\u9000\u907f\u91cd\u8bd5\uff0c\u5931\u8d25\u9489\u9489\u544a\u8b66\uff1b<\/li><li>\u5ba2\u6237\u7aef\u4e8b\u4ef6\u6309\u300c\u4e8b\u4ef6 ID \u767d\u540d\u5355\uff08Redis Set \u52a8\u6001\u914d\u7f6e\uff09\u300d\u8fc7\u6ee4\u540e\u56de\u6d41\u3002<\/li><\/ul>\n\n\n\n<h3>4.10 \u5b9e\u65f6\u63a8\u8350\u534f\u540c<\/h3>\n\n\n\n<p>\u63a8\u8350\u7b97\u6cd5\u672c\u4f53\u5728\u5916\u90e8 Python \u63a8\u8350\u670d\u52a1\uff0c\u672c\u5e73\u53f0\u627f\u62c5<strong>\u5b9e\u65f6\u5582\u6599\u4e0e\u95e8\u69db\u5224\u5b9a<\/strong>\uff1a<\/p>\n\n\n\n<ul><li>\u8bdd\u9898\/\u56fe\u6587\u5185\u5bb9 binlog \u2192 \u8fc7\u6ee4\uff08\u5ba1\u6838\u901a\u8fc7\/\u672a\u5220\/\u767d\u540d\u5355\u4f5c\u8005\/\u6b63\u6587\u957f\u5ea6\uff09\u2192 HTTP \u8c03\u63a8\u8350\u670d\u52a1<strong>\u52a0\u5165\u968f\u673a\u6c60<\/strong>\uff1b\u8fd0\u8425\u6807\u8bb0\u4e0a\u699c \u2192 \u52a0\u5165\u7cbe\u9009\u6c60\uff1b\u5220\u9664\/\u4e0b\u67b6 \u2192 \u79fb\u51fa\uff1b\u6bcf\u4e2a\u52a8\u4f5c\u6210\u8d25\u6253\u70b9\u76d1\u63a7\uff1b<\/li><li>\u7528\u6237\u767b\u5f55 \u2192 \u6e05\u7a7a\u63a8\u8350\u4f1a\u8bdd\uff08\u907f\u514d\u91cd\u590d\u66dd\u5149\uff09\uff1b<\/li><li>\u5bf9\u5916\u66b4\u9732\u300c\u89c6\u9891\u662f\u5426\u53ef\u63a8\u8350\u300d\u5224\u5b9a HTTP \u63a5\u53e3\uff1a\u89c6\u9891\u5b58\u5728\u6027 + \u975e\u6a21\u677f\u9ed8\u8ba4\u6807\u9898 + \u4f5c\u8005\u767d\u540d\u5355 + <strong>\u5c01\u9762\u56fe\u50cf\u8d28\u91cf\u5224\u5b9a<\/strong>\uff08\u8c03\u7528\u56fe\u50cf\u670d\u52a1\u68c0\u6d4b\u9ed1\u8fb9\/\u753b\u8d28\uff09\u56db\u91cd\u95e8\u69db\u3002<\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2>5. \u5173\u952e\u6280\u672f\u96be\u70b9\u4e0e\u89e3\u51b3\u65b9\u6848<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>#<\/th><th>\u96be\u70b9<\/th><th>\u89e3\u51b3\u65b9\u6848<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>\u51e0\u5341\u6761\u5b9e\u65f6\u4efb\u52a1\u9700\u8981\u72ec\u7acb\u90e8\u7f72\u3001\u72ec\u7acb\u6269\u7f29\u5bb9\u3001\u6545\u969c\u9694\u79bb<\/td><td><strong>\u5355\u955c\u50cf + Spring Profile \u88c2\u53d8<\/strong>\uff1a\u4e00\u4efd\u4ee3\u7801\/\u955c\u50cf\u6309 Profile \u90e8\u7f72\u4e3a 40+ \u4e2a K8s Deployment\uff0c\u5404\u81ea\u72ec\u7acb\u6d88\u8d39\u7ec4\u4e0e\u72b6\u6001\u5b58\u50a8\uff0cHelm \u5355\u6a21\u677f\u6279\u91cf\u7f16\u6392<\/td><\/tr><tr><td>2<\/td><td>Kafka Streams \u7a97\u53e3\u8f93\u51fa\u4e3a<strong>\u6301\u7eed\u589e\u91cf\u89e6\u53d1<\/strong>\u800c\u975e\u7a97\u53e3\u5173\u95ed\u89e6\u53d1\uff0c\u65e0\u6cd5\u76f4\u63a5\u53d6\u7a97\u53e3\u6700\u7ec8\u503c<\/td><td>\u300c\u5f53\u524d\u7a97\u53e3\u53ea\u7d2f\u52a0\u5199 Redis\uff0c\u4e0b\u4e00\u7a97\u53e3\u7528\u7a97\u53e3\u8fb9\u754c\u5bf9\u9f50\u540e\u7ed3\u7b97\u4e0a\u4e00\u7a97\u53e3\u300d\u6a21\u5f0f + Redis \u5355\u7ebf\u7a0b\u7279\u6027\u4ef2\u88c1\u5e76\u53d1\u7ade\u6001<\/td><\/tr><tr><td>3<\/td><td>at-least-once \u8bed\u4e49\u4e0b\u6d41\u5904\u7406\u526f\u4f5c\u7528\u53ef\u80fd\u91cd\u590d<\/td><td><strong>\u5168\u94fe\u8def\u5e42\u7b49<\/strong>\uff1aES doc \u5c40\u90e8\u66f4\u65b0 + \u51b2\u7a81\u91cd\u8bd5\u3001MySQL\/PG <code>ON CONFLICT<\/code> upsert\u3001\u699c\u5355\u4e34\u65f6 key + rename \u539f\u5b50\u66ff\u6362\u3001\u5e7f\u544a\u56de\u8c03\u300c\u6210\u529f\u5373\u5220 key\u300d\u3001\u591a\u8282\u70b9\u52a8\u4f5c setnx \u62a2\u9501<\/td><\/tr><tr><td>4<\/td><td>\u6d41\u4efb\u52a1\u300c\u5047\u6d3b\u300d\u2014\u2014\u8fdb\u7a0b\u5728\u4f46\u62d3\u6251\u5df2\u505c<\/td><td><strong>Kafka Streams \u72b6\u6001\u673a\u8054\u52a8 K8s \u63a2\u9488<\/strong>\uff1a\u62d3\u6251\u8fdb\u5165 RUNNING \u624d\u521b\u5efa\u5065\u5eb7\u6807\u8bb0\u6587\u4ef6\uff0cliveness \u63a2\u9488\u68c0\u67e5\u8be5\u6587\u4ef6\uff0c\u5f02\u5e38\u81ea\u52a8\u91cd\u542f + \u9489\u9489\u544a\u8b66\uff08\u542b\u4e1a\u52a1\u5305\u5806\u6808\u88c1\u526a\uff09<\/td><\/tr><tr><td>5<\/td><td>\u9ed1\u4ea7\u7528\u82b1\u4f53\/\u5168\u89d2\/\u5f62\u8fd1\u5b57\u7b26\u6df7\u6dc6\u8054\u7cfb\u65b9\u5f0f<\/td><td><strong>\u5b57\u7b26\u53cd\u6df7\u6dc6\u5f52\u4e00\u5316\uff08\u6570\u5b66 Unicode\/\u5708\u7801\/\u4e2d\u6587\u6570\u5b57\u7b49\u7edf\u4e00\u6620\u5c04\uff09+ \u6b63\u5219\u62bd\u53d6 + \u56fe\u7247 OCR + hash \u9ed1\u540d\u5355<\/strong>\u7684\u6587\u672c\/\u56fe\u7247\u53cc\u91cd\u8bc6\u522b\uff0c\u4eba\u5728\u56de\u8def\u9ed1\u540d\u5355\u81ea\u52a8\u5c01\u7981<\/td><\/tr><tr><td>6<\/td><td>\u5927\u57fa\u6570 UV \u53bb\u91cd vs 2G \u5185\u5b58 Pod \u9650\u5236<\/td><td>\u53bb\u91cd\u5206\u6d41\uff1a\u8de8\u5b9e\u4f8b\u5927\u57fa\u6570\u7528 <strong>Redis Set \u7cbe\u786e\u53bb\u91cd<\/strong>\uff0c\u7a97\u53e3\u5185\u4e2d\u5c0f\u57fa\u6570\u7528<strong>\u72b6\u6001\u5b58\u50a8\u5185 HashSet<\/strong>\uff08\u968f changelog \u6301\u4e45\u5316\u53ef\u56de\u653e\uff09<\/td><\/tr><tr><td>7<\/td><td>\u6bd2\u6d88\u606f\u5bfc\u81f4\u6574\u6761\u6d41\u5d29\u6e83<\/td><td>\u5168\u5c40 <code>LogAndContinueExceptionHandler<\/code> \u8df3\u8fc7\u810f\u6570\u636e\uff1b\u5173\u952e\u94fe\u8def\u53cd\u5411\u4e3a\u4e4b\u2014\u2014<strong>\u4e3b\u52a8\u4e0d\u6355\u83b7\u7cfb\u7edf\u5f02\u5e38\u8ba9\u6d41\u963b\u585e<\/strong>\u4ee5\u66b4\u9732\u95ee\u9898<\/td><\/tr><tr><td>8<\/td><td>\u591a\u8282\u70b9\u5b9a\u65f6\/\u4e8b\u4ef6\u52a8\u4f5c\u91cd\u590d\u6267\u884c<\/td><td>\u6ce8\u89e3\u5f0f\u5206\u5e03\u5f0f\u9501\uff08AOP + setnx + Lua \u811a\u672c\u6821\u9a8c requestId \u91ca\u653e\uff09+ Redis keyspace \u8fc7\u671f\u4e8b\u4ef6\u89e6\u53d1 + setnx \u62a2\u5360<\/td><\/tr><tr><td>9<\/td><td>\u9ad8\u541e\u5410\u4e0b\u7684\u5916\u90e8\u4f9d\u8d56\u8c03\u7528<\/td><td>\u6d88\u8d39\u53c2\u6570\u8c03\u4f18\uff08\u5355\u6b21 poll \u4e0a\u9650\/\u63d0\u4ea4\u95f4\u9694\/\u6700\u5927\u5904\u7406\u65f6\u957f\u7ea6\u675f\uff09\u3001\u5916\u547c\u5168\u90e8\u8bbe\u77ed\u8d85\u65f6\u3001\u6162\u64cd\u4f5c\uff08\u56fe\u7247\u5ba1\u6838\u5ef6\u8fdf 60s \u7b49\u5f85\u4e0a\u4f20\u5b8c\u6210\uff09\u5f02\u6b65\u5316\u3001InfluxDB\/\u4e0a\u62a5\u63a5\u53e3\u6279\u91cf\u5199<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2>6. \u9879\u76ee\u6210\u679c\u4e0e\u4ef7\u503c<\/h2>\n\n\n\n<ul><li>\u5efa\u6210\u8986\u76d6\u300c<strong>\u57cb\u70b9 + CDC<\/strong>\u300d\u53cc\u6570\u636e\u6e90\u7684\u7edf\u4e00\u5b9e\u65f6\u6570\u4ed3\uff0c\u652f\u6491\u6d3b\u8dc3\/\u76f4\u64ad\/\u63a8\u9001\/\u652f\u4ed8\/\u8d44\u4ea7\/\u5ba1\u6838\u65f6\u6548\/\u6295\u653e\u7b49<strong>\u5168\u4e1a\u52a1\u7ebf 10 \u5206\u949f\u7c92\u5ea6\u5b9e\u65f6\u770b\u677f<\/strong>\uff0c\u66ff\u4ee3 T+1 \u79bb\u7ebf\u62a5\u8868\u6210\u4e3a\u8fd0\u8425\u51b3\u7b56\u4e3b\u5165\u53e3\uff1b<\/li><li>\u79d2\u7ea7\u7528\u6237\u753b\u50cf\uff08ES \u5bbd\u8868\uff09\u6210\u4e3a\u63a8\u8350\u3001\u98ce\u63a7\u3001\u8fd0\u8425\u7684<strong>\u7edf\u4e00\u7528\u6237\u6570\u636e\u5e95\u5ea7<\/strong>\uff1b<\/li><li>\u5b9e\u65f6\u98ce\u63a7\u4f53\u7cfb\uff08\u4e94\u8def\u4fe1\u53f7 + \u5206\u7ea7\u5904\u7f6e + \u4eba\u5728\u56de\u8def\u9ed1\u540d\u5355\uff09\u6709\u6548\u538b\u5236\u4e2d\u8001\u5e74\u793e\u533a\u9ad8\u53d1\u7684<strong>\u5f15\u6d41\u5bfc\u6d41\u9ed1\u4ea7<\/strong>\uff0c\u652f\u6301\u9a8c\u8bc1\u7801\/\u7cfb\u7edf\u5c01\u7981\u81ea\u52a8\u5904\u7f6e\uff1b<\/li><li>\u6253\u901a\u5e7f\u544a\u6295\u653e<strong>\u5f52\u56e0\u2014\u56de\u6d41\u95ed\u73af<\/strong>\uff08\u6fc0\u6d3b\/\u6b21\u7559\/\u4ed8\u8d39\u56de\u4f20\u591a\u5e73\u53f0\uff09\uff0c\u76f4\u63a5\u670d\u52a1\u4e70\u91cf\u4f18\u5316\uff1b<\/li><li>\u5b8c\u6210<strong>\u76d1\u7ba1\u5408\u89c4\u4e0a\u62a5<\/strong>\u5de5\u7a0b\u5efa\u8bbe\uff0815 \u7c7b\u6570\u636e\u96c6\u3001BCP\/ZIP\/FTP\/VPN \u5168\u94fe\u8def\u81ea\u52a8\u6253\u5305\u4e0a\u4f20\uff09\uff0c\u6ee1\u8db3\u76d1\u7ba1\u5ba1\u8ba1\u8981\u6c42\uff1b<\/li><li>\u5e73\u53f0\u7a33\u5b9a\u8fd0\u884c 5 \u5e74\uff0c\u540e\u671f\u4e3b\u5bfc\u6309\u4e1a\u52a1\u4f18\u5148\u7ea7<strong>\u5206\u6279\u4e0b\u7ebf\u4e0e\u8fc1\u79fb<\/strong>\uff08\u57cb\u70b9\u94fe\u8def\u8fc1\u79fb\u81f3\u65e5\u5fd7\u670d\u52a1\u65b9\u6848\uff09\uff0c\u5b8c\u6210\u6280\u672f\u6808\u7684\u65b0\u8001\u4ea4\u66ff\u6536\u5c3e\u3002<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u5b9e\u65f6\u6570\u4ed3\/\u5b9e\u65f6\u6570\u636e\u6d41\u5904\u7406\u5e73\u53f0\uff08Kafka + Kafka Streams + K8s\uff09\uff1a\u4ece 0 \u5230 1 \u642d\u5efa  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[129,10,76],"tags":[154,122],"_links":{"self":[{"href":"https:\/\/blog.humh.cn\/index.php?rest_route=\/wp\/v2\/posts\/1699"}],"collection":[{"href":"https:\/\/blog.humh.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.humh.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.humh.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.humh.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1699"}],"version-history":[{"count":13,"href":"https:\/\/blog.humh.cn\/index.php?rest_route=\/wp\/v2\/posts\/1699\/revisions"}],"predecessor-version":[{"id":1715,"href":"https:\/\/blog.humh.cn\/index.php?rest_route=\/wp\/v2\/posts\/1699\/revisions\/1715"}],"wp:attachment":[{"href":"https:\/\/blog.humh.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.humh.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.humh.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}