<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>追风笔记</title><link>https://4f0a9a3b.wangpeng.pages.dev/</link><description>Recent content on 追风笔记</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Tue, 25 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://4f0a9a3b.wangpeng.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Dubbo 总体架构与核心概念</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/dubbo/architecture/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/dubbo/architecture/</guid><description>&lt;p&gt;Dubbo 的核心竞争力在于清晰的职责分层与高度可插拔的扩展机制。理解分层与 Invoker 抽象，是读懂 Dubbo 源码与排查线上问题的基础。&lt;/p&gt;&#10;&lt;h2 id="分层架构"&gt;分层架构&#10;&lt;/h2&gt;&#10;&lt;p&gt;Dubbo 自顶向下可分为若干逻辑层，每一层只依赖其下层的接口而非实现：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;service / config 层&lt;/strong&gt;：面向用户的 API 与配置层，&lt;code&gt;@DubboService&lt;/code&gt;、&lt;code&gt;@DubboReference&lt;/code&gt; 以及 &lt;code&gt;ReferenceConfig&lt;/code&gt;、&lt;code&gt;ServiceConfig&lt;/code&gt; 在此落地。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;proxy 层&lt;/strong&gt;：生成服务接口的动态代理，让远程调用对业务代码透明。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;registry 层&lt;/strong&gt;：封装服务注册与订阅，感知 provider/consumer 的上线下线。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;cluster 层&lt;/strong&gt;：将多个 Invoker 封装为「集群 Invoker」，负责负载均衡、容错与路由。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;protocol 层&lt;/strong&gt;：封装 RPC 调用，是 Invoker 暴露与引用的核心。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;filter 链&lt;/strong&gt;：贯穿调用的拦截器，可用于日志、鉴权、限流等横切逻辑。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="invoker-与-spi"&gt;Invoker 与 SPI&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Invoker&lt;/code&gt; 是 Dubbo 的通用领域模型，代表「一个可执行且可描述的调用」，抽象了本地、远程、集群等不同类型的调用。&lt;code&gt;URL&lt;/code&gt; 则作为贯穿各层的配置总线，几乎所有扩展点都通过 URL 传递参数。&lt;/p&gt;&#10;&lt;p&gt;Dubbo 的扩展机制基于改进版的 JDK SPI，通过 &lt;code&gt;@SPI&lt;/code&gt; 注解声明扩展接口，&lt;code&gt;@Adaptive&lt;/code&gt; 生成自适应实现，&lt;code&gt;META-INF/dubbo/&lt;/code&gt; 下以接口全限定名命名的文件登记实现类：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-63727b2b-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="java" data-td-line-count="7"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-63727b2b-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@SPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dubbo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Adaptive&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exporter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Invoker&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invoker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;throws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RpcException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Adaptive&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Invoker&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;refer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;throws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RpcException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="一次同步调用的链路"&gt;一次同步调用的链路&#10;&lt;/h2&gt;&#10;&lt;p&gt;当 consumer 发起一次同步调用时，请求大致经历以下步骤：&lt;/p&gt;</description></item><item><title>Kafka 存储与消费模型</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/kafka/storage-consumer/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/kafka/storage-consumer/</guid><description>&lt;p&gt;Kafka 的高性能依赖于「分区日志 + 顺序写 + 批量拉取」的设计。理解存储与消费模型，才能合理配置并行度与避免重复消费。&lt;/p&gt;&#10;&lt;h2 id="topic-与-partition"&gt;Topic 与 Partition&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;topic&lt;/strong&gt; 是逻辑主题，&lt;strong&gt;partition&lt;/strong&gt; 是物理并行单位，消息只追加写入分区末尾。&lt;/li&gt;&#10;&lt;li&gt;每个分区是一个有序、不可变的日志，由多个 segment 文件组成，并维护 offset（分区内唯一递增）。&lt;/li&gt;&#10;&lt;li&gt;分区数决定了消费的并行上限：一个分区同一时刻只被 group 内一个消费者消费。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="offset-与消费位移"&gt;Offset 与消费位移&#10;&lt;/h2&gt;&#10;&lt;p&gt;消费者处理完消息后提交的位移称为 &lt;strong&gt;offset&lt;/strong&gt;，Kafka 将其保存在内部 topic &lt;code&gt;__consumer_offsets&lt;/code&gt; 中：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-de365f5c-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="4"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-de365f5c-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Producer -&amp;gt; [partition-0: 0,1,2,3 ...]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | committed offset (group A)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Consumer group A 从 offset=4 继续拉取&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;位移提交方式影响可靠性：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;自动提交&lt;/strong&gt;：间隔提交，可能丢失（提交后未处理崩溃）或重复（处理中崩溃未提交）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;手动提交&lt;/strong&gt;：处理成功后再提交，配合幂等可实现至少一次/精确一次。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="consumer-group-与-rebalance"&gt;Consumer Group 与 Rebalance&#10;&lt;/h2&gt;&#10;&lt;p&gt;同一 group 内的消费者共同消费 topic 的全部分区，分区在成员间均衡分配。当成员加入/退出时触发 &lt;strong&gt;rebalance&lt;/strong&gt;，重新分配分区。频繁 rebalance 会暂停消费，应控制 &lt;code&gt;session.timeout&lt;/code&gt; 与 &lt;code&gt;heartbeat.interval&lt;/code&gt; 并避免消费耗时过长。&lt;/p&gt;</description></item><item><title>MySQL 索引原理与最佳实践</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/mysql/indexing/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/mysql/indexing/</guid><description>&lt;p&gt;索引是 MySQL 查询性能的决定性因素。理解 InnoDB 的 B+Tree 索引结构，才能写出真正命中索引的 SQL。&lt;/p&gt;&#10;&lt;h2 id="btree-与聚簇索引"&gt;B+Tree 与聚簇索引&#10;&lt;/h2&gt;&#10;&lt;p&gt;InnoDB 使用 B+Tree 组织索引，其特点是非叶子节点只存索引键用于导航，所有数据都落在叶子节点，且叶子节点通过双向链表串联，非常适合范围扫描。&lt;/p&gt;&#10;&lt;p&gt;InnoDB 的主键索引是&lt;strong&gt;聚簇索引&lt;/strong&gt;，叶子节点直接存放整行数据；二级索引的叶子节点存放「索引键 + 主键值」。因此通过二级索引查询非索引列时，需要再用主键回表查聚簇索引。&lt;/p&gt;&#10;&lt;h2 id="回表与覆盖索引"&gt;回表与覆盖索引&#10;&lt;/h2&gt;&#10;&lt;p&gt;当查询的列都在二级索引中时，无需回表，称为&lt;strong&gt;覆盖索引&lt;/strong&gt;，性能更好：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-5f7f444b-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="sql" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-5f7f444b-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- idx_user_age 为 (name, age) 的联合索引&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 仅取索引列，命中覆盖索引&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;若 &lt;code&gt;SELECT *&lt;/code&gt; 还需要 &lt;code&gt;phone&lt;/code&gt; 等额外列，则会触发回表。高频查询应优先设计为覆盖索引。&lt;/p&gt;&#10;&lt;h2 id="最左前缀原则"&gt;最左前缀原则&#10;&lt;/h2&gt;&#10;&lt;p&gt;联合索引 &lt;code&gt;(a, b, c)&lt;/code&gt; 能生效的条件是查询从最左列开始连续匹配：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;WHERE a = ?&lt;/code&gt; 可用&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WHERE a = ? AND b = ?&lt;/code&gt; 可用&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WHERE b = ?&lt;/code&gt; 无法使用该联合索引（断开了最左前缀）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="避免索引失效"&gt;避免索引失效&#10;&lt;/h2&gt;&#10;&lt;p&gt;常见导致索引失效的写法：&lt;/p&gt;</description></item><item><title>Redis 数据结构与底层实现</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/redis/data-structures/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/redis/data-structures/</guid><description>&lt;p&gt;Redis 对外暴露五种常用类型，但底层有多种编码（encoding）。根据数据规模自动在不同编码间转换，是它兼顾内存与性能的关键。&lt;/p&gt;&#10;&lt;h2 id="核心底层结构"&gt;核心底层结构&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;SDS（简单动态字符串）&lt;/strong&gt;：相比 C 字符串记录长度、预分配空间，避免缓冲区溢出并支持二进制安全。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ziplist / listpack&lt;/strong&gt;：连续内存的紧凑列表，节省空间，适合小数据量。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;linkedlist&lt;/strong&gt;：双向链表，元素多时替代 ziplist。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;dict（字典）&lt;/strong&gt;：哈希表，使用链地址法解决冲突，渐进式 rehash 避免阻塞。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;skiplist（跳表）&lt;/strong&gt;：多层有序链表，结合 dict 实现 zset，范围查询高效。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="各类型的编码与转换"&gt;各类型的编码与转换&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;类型&lt;/th&gt;&#10; &lt;th scope="col"&gt;小数据编码&lt;/th&gt;&#10; &lt;th scope="col"&gt;大数据编码&lt;/th&gt;&#10; &lt;th scope="col"&gt;转换阈值（示意）&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;string&lt;/td&gt;&#10; &lt;td&gt;int / embstr&lt;/td&gt;&#10; &lt;td&gt;raw&lt;/td&gt;&#10; &lt;td&gt;长度 &amp;gt; 44 字节转 raw&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;hash&lt;/td&gt;&#10; &lt;td&gt;ziplist/listpack&lt;/td&gt;&#10; &lt;td&gt;hashtable&lt;/td&gt;&#10; &lt;td&gt;元素数或单个值超阈值&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;list&lt;/td&gt;&#10; &lt;td&gt;quicklist（ziplist 片段）&lt;/td&gt;&#10; &lt;td&gt;quicklist&lt;/td&gt;&#10; &lt;td&gt;—&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;set&lt;/td&gt;&#10; &lt;td&gt;intset&lt;/td&gt;&#10; &lt;td&gt;hashtable&lt;/td&gt;&#10; &lt;td&gt;含非整数或元素过多&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;zset&lt;/td&gt;&#10; &lt;td&gt;ziplist&lt;/td&gt;&#10; &lt;td&gt;skiplist+dict&lt;/td&gt;&#10; &lt;td&gt;元素数或值长度超阈值&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;以 &lt;code&gt;zset&lt;/code&gt; 为例，小数据使用 ziplist 紧凑存储（member 与 score 相邻），当元素数量或单个 member 长度超过阈值时转为 &lt;code&gt;skiplist + dict&lt;/code&gt;，保证有序遍历与按 member 查找都为 O(1)/O(log n)。&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-d3cd55a5-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-d3cd55a5-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zset 小: [member1, score1, member2, score2, ...] (ziplist)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zset 大: dict(member-&amp;gt;score) + skiplist(score-&amp;gt;member)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;理解这些阈值有助于解释「为什么小哈希比单独 key 省内存」，也提醒我们避免让单个 key 堆积过多元素，否则编码升级或操作耗时都会陡增。&lt;/p&gt;</description></item><item><title>ZooKeeper 数据模型与 ZAB 协议</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/model-zab/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/model-zab/</guid><description>&lt;p&gt;ZooKeeper 的可靠性来源于其简洁的数据模型与强一致的 ZAB 协议。理解二者是正确使用 ZK 的前提。&lt;/p&gt;&#10;&lt;h2 id="数据模型-znode"&gt;数据模型 znode&#10;&lt;/h2&gt;&#10;&lt;p&gt;ZK 维护一棵类似文件系统的层级树，每个节点称为 &lt;strong&gt;znode&lt;/strong&gt;，可同时承载数据与子节点。其类型决定了生命周期与并发语义：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;持久节点 / 临时节点&lt;/strong&gt;：临时节点随 session 断开自动删除，是分布式锁、选主的基础。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;普通节点 / 顺序节点&lt;/strong&gt;：顺序节点创建时自动追加单调递增序号。&lt;/li&gt;&#10;&lt;li&gt;每个 znode 带有 &lt;code&gt;version&lt;/code&gt;、&lt;code&gt;cversion&lt;/code&gt;、&lt;code&gt;aversion&lt;/code&gt;，修改时版本自增，提供乐观锁语义。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="session-与-watcher"&gt;Session 与 Watcher&#10;&lt;/h2&gt;&#10;&lt;p&gt;客户端与服务器建立 &lt;strong&gt;session&lt;/strong&gt;，通过心跳保活，session 超时则服务器清理其临时节点。客户端可对节点注册 &lt;strong&gt;Watcher&lt;/strong&gt;，节点发生变化（数据写、子节点变）时收到一次性通知，需重新注册才能继续监听。&lt;/p&gt;&#10;&lt;h2 id="zab-协议"&gt;ZAB 协议&#10;&lt;/h2&gt;&#10;&lt;p&gt;ZAB（ZooKeeper Atomic Broadcast）是为 ZK 设计的崩溃恢复原子广播协议，保证所有事务以相同顺序被所有副本应用。&lt;/p&gt;&#10;&lt;h3 id="崩溃恢复与选主"&gt;崩溃恢复与选主&#10;&lt;/h3&gt;&#10;&lt;p&gt;集群启动时或 Leader 宕机进入恢复阶段：选举产生新 Leader，并让各 Follower 补齐到与 Leader 相同的状态。选主依赖 &lt;code&gt;zxid&lt;/code&gt;（事务 id）与 &lt;code&gt;myid&lt;/code&gt;，zxid 越大代表数据越新，优先当选。&lt;/p&gt;&#10;&lt;h3 id="消息广播"&gt;消息广播&#10;&lt;/h3&gt;&#10;&lt;p&gt;正常阶段采用类似 2PC 的广播：Leader 为每个写请求分配递增 &lt;code&gt;zxid&lt;/code&gt; 并发起提议，Follower 写本地日志后 ACK，Leader 收到多数派 ACK 即提交并通知应用。&lt;/p&gt;</description></item><item><title>PageFly</title><link>https://4f0a9a3b.wangpeng.pages.dev/projects/pagefly/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/projects/pagefly/</guid><description>&lt;p&gt;PageFly 是一个面向 AI 工作流的轻量页面托管方案：写好 HTML/Markdown 后直接发布，适合把分析页、工具页或实验性内容快速上线。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;状态&lt;/strong&gt;：已上线&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;地址&lt;/strong&gt;：&lt;a href="https://fly.882680.xyz"&gt;https://fly.882680.xyz&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：Cloudflare Pages + Functions + KV（免费层）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：个人工作流落地页、轻量产品原型、AI 输出展示&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Kafka 可靠性与精确一次</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/kafka/reliability/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/kafka/reliability/</guid><description>&lt;p&gt;Kafka 的可靠性需要在 producer、broker、consumer 三端协同配置。下面从「不丢、不重、有序」三个目标展开。&lt;/p&gt;&#10;&lt;h2 id="producer-端的可靠性"&gt;Producer 端的可靠性&#10;&lt;/h2&gt;&#10;&lt;p&gt;通过 &lt;code&gt;acks&lt;/code&gt; 控制写入持久化级别：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;acks=0&lt;/code&gt;：发完即认为成功，可能丢消息，吞吐最高。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;acks=1&lt;/code&gt;：leader 写入即成功，leader 宕机可能丢。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;acks=all&lt;/code&gt;：ISR 全部同步才成功，最安全，配合 &lt;code&gt;min.insync.replicas&lt;/code&gt; 防单点。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;开启重试（&lt;code&gt;retries&lt;/code&gt;）可应对瞬时失败，但会带来&lt;strong&gt;重复&lt;/strong&gt;：网络抖动导致 producer 未收到 ack 而重试，同一条消息被写两次。&lt;/p&gt;&#10;&lt;h2 id="幂等-producer-与事务"&gt;幂等 Producer 与事务&#10;&lt;/h2&gt;&#10;&lt;p&gt;Kafka 提供 &lt;strong&gt;幂等 producer&lt;/strong&gt;（&lt;code&gt;enable.idempotence=true&lt;/code&gt;），broker 用 &lt;code&gt;producerId + 序列号&lt;/code&gt; 去重，保证单分区内不重不漏。需要跨分区、跨系统的原子写入时，使用&lt;strong&gt;事务&lt;/strong&gt;（&lt;code&gt;transactional.id&lt;/code&gt;）将多次 produce 与 offset 提交纳入一个事务：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-5a2edc9c-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="java" data-td-line-count="5"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-5a2edc9c-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initTransactions&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;beginTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;commitTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;要么都成功&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;要么都不可见&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="消费端去重与幂等"&gt;消费端去重与幂等&#10;&lt;/h2&gt;&#10;&lt;p&gt;即使 producer 幂等，consumer 在 rebalance 或位移提交时机不当时仍可能重复消费。消费端应保证&lt;strong&gt;业务幂等&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;用唯一键（订单号等）做去重表/唯一索引。&lt;/li&gt;&#10;&lt;li&gt;将「处理 + 提交位移」放在同一事务（如消费写 DB 同时记录 offset）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="分区顺序性"&gt;分区顺序性&#10;&lt;/h2&gt;&#10;&lt;p&gt;Kafka 只保证&lt;strong&gt;单分区内有序&lt;/strong&gt;。需要全局顺序只能单分区（牺牲并行）；需要业务顺序则按 key（如用户 id）分区，使同一 key 落到同一分区，从而在该 key 维度保持顺序。精确一次（EOS）正是幂等 + 事务 + 消费幂等三者叠加的结果。&lt;/p&gt;</description></item><item><title>MySQL 事务与锁机制</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/mysql/transaction-lock/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/mysql/transaction-lock/</guid><description>&lt;p&gt;并发场景下，事务与锁共同保证了数据的一致性。InnoDB 通过 MVCC 与锁的协同，在性能与隔离性之间取得平衡。&lt;/p&gt;&#10;&lt;h2 id="acid-与隔离级别"&gt;ACID 与隔离级别&#10;&lt;/h2&gt;&#10;&lt;p&gt;事务的 ACID 由不同机制保障：原子性靠 undo log，持久性靠 redo log，隔离性靠 MVCC 与锁，一致性是最终目标。&lt;/p&gt;&#10;&lt;p&gt;SQL 标准定义四种隔离级别，InnoDB 默认 &lt;code&gt;REPEATABLE READ&lt;/code&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;READ UNCOMMITTED：可能脏读&lt;/li&gt;&#10;&lt;li&gt;READ COMMITTED：避免脏读，可能不可重复读&lt;/li&gt;&#10;&lt;li&gt;REPEATABLE READ：避免不可重复读（InnoDB 额外避免幻读）&lt;/li&gt;&#10;&lt;li&gt;SERIALIZABLE：完全串行，性能最低&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="mvcc-与日志"&gt;MVCC 与日志&#10;&lt;/h2&gt;&#10;&lt;p&gt;MVCC（多版本并发控制）让读不加锁、读写不阻塞。每行记录隐含 &lt;code&gt;trx_id&lt;/code&gt; 与 &lt;code&gt;roll_pointer&lt;/code&gt;，通过 undo log 构建历史版本，配合 ReadView 判断某版本对当前事务是否可见。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;undo log&lt;/strong&gt;：记录数据修改前的镜像，用于回滚与构建旧版本。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;redo log&lt;/strong&gt;：记录物理页修改，保证崩溃后已提交事务不丢失（WAL 机制）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="行锁间隙锁与-next-key-lock"&gt;行锁、间隙锁与 Next-Key Lock&#10;&lt;/h2&gt;&#10;&lt;p&gt;InnoDB 默认使用行锁，但「锁的是索引记录」而非行本身。在 &lt;code&gt;REPEATABLE READ&lt;/code&gt; 下，为解决幻读引入：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;行锁（Record Lock）&lt;/strong&gt;：锁住具体索引记录。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;间隙锁（Gap Lock）&lt;/strong&gt;：锁住索引记录之间的间隙，阻止插入。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Next-Key Lock&lt;/strong&gt;：行锁 + 间隙锁，锁定左开右闭的区间。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-634a084d-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="sql" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-634a084d-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 在 (10, 20] 区间加 Next-Key Lock，阻止其他事务插入 id=15&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BETWEEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FOR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="死锁成因与排查"&gt;死锁成因与排查&#10;&lt;/h2&gt;&#10;&lt;p&gt;死锁通常由两个事务以相反顺序获取锁引起。排查手段：&lt;/p&gt;</description></item><item><title>Redis 缓存设计</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/redis/cache-design/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/redis/cache-design/</guid><description>&lt;p&gt;引入缓存能显著降低数据库压力，但设计不当会引入穿透、击穿、雪崩等经典问题。下面逐一拆解成因与对策。&lt;/p&gt;&#10;&lt;h2 id="三大经典问题"&gt;三大经典问题&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;缓存穿透&lt;/strong&gt;：查询不存在的数据，缓存与数据库都查不到，请求每次都打到 DB。应对：缓存空值（短过期）、布隆过滤器拦截非法 key。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;缓存击穿&lt;/strong&gt;：某个热点 key 过期瞬间，大量并发同时回源 DB。应对：互斥锁（只放一个线程重建）、逻辑过期（异步刷新）、热点 key 不过期。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;缓存雪崩&lt;/strong&gt;：大量 key 同一时刻集中失效，或 Redis 整体不可用，DB 被冲垮。应对：过期时间加随机抖动、多级缓存、Redis 高可用（哨兵/集群）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="cache-aside-与一致性"&gt;Cache-Aside 与一致性&#10;&lt;/h2&gt;&#10;&lt;p&gt;最常用的是 &lt;strong&gt;Cache-Aside（旁路缓存）&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-9a055417-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-9a055417-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;读: 先读缓存 -&amp;gt; 命中返回; 未命中读 DB -&amp;gt; 写入缓存&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;写: 先更新 DB -&amp;gt; 再删除缓存 (而非更新缓存)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;「先更新 DB 再删缓存」可降低并发下读到旧值的概率；极端不一致可通过延迟双删或订阅 binlog（如 Canal）补偿。注意：不要盲目「更新缓存」，否则并发写可能产生脏数据。&lt;/p&gt;&#10;&lt;h2 id="大-key-与热-key"&gt;大 key 与热 key&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;大 key&lt;/strong&gt;：如包含百万元素的 hash/list，删除或序列化会阻塞主线程。应对：拆分、分批删除（&lt;code&gt;unlink&lt;/code&gt;）、定期清理。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;热 key&lt;/strong&gt;：单个 key 访问极高，单节点成为瓶颈。应对：本地缓存副本、key 打散到多个副本、Redis 集群分片。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="过期与淘汰策略"&gt;过期与淘汰策略&#10;&lt;/h2&gt;&#10;&lt;p&gt;Redis 提供主动 + 惰性两种过期删除，内存不足时按 &lt;code&gt;maxmemory-policy&lt;/code&gt; 淘汰：&lt;/p&gt;</description></item><item><title>ZooKeeper 分布式协调实战</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/coordination/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/coordination/</guid><description>&lt;p&gt;ZooKeeper 提供原语级的协调能力，几乎所有分布式协调需求都可基于「临时节点 + 顺序节点 + Watcher」组合实现。&lt;/p&gt;&#10;&lt;h2 id="选主master-election"&gt;选主（Master Election）&#10;&lt;/h2&gt;&#10;&lt;p&gt;每个候选者在 &lt;code&gt;/election&lt;/code&gt; 下创建临时顺序节点，序号最小的即成为 Master。非最小节点监听其前一个节点，前驱消失时重新判断自己是否最小，从而实现故障自动转移：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-96c7e587-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="4"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-96c7e587-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/election&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── /n_0000000001 (master)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── /n_0000000002 (watch 001)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── /n_0000000003 (watch 002)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="配置中心"&gt;配置中心&#10;&lt;/h2&gt;&#10;&lt;p&gt;将配置写入持久节点，客户端读取并注册 Watcher，配置变更时收到通知后热更新，无需重启应用。注意配置节点应控制体积，避免单次推送过大。&lt;/p&gt;&#10;&lt;h2 id="分布式锁"&gt;分布式锁&#10;&lt;/h2&gt;&#10;&lt;p&gt;基于「临时顺序节点 + 监听前驱」实现公平排他锁，比简单 &lt;code&gt;create&lt;/code&gt; 抢锁更健壮、可避免惊群。&lt;/p&gt;&#10;&lt;h3 id="羊群效应herd-effect"&gt;羊群效应（Herd Effect）&#10;&lt;/h3&gt;&#10;&lt;p&gt;若所有客户端都监听同一个锁节点，释放时会被同时唤醒并争抢，产生大量无效请求。正确做法是&lt;strong&gt;只监听比自己序号小的前一个节点&lt;/strong&gt;，形成链式唤醒，将 O(N) 通知降为 O(1)。&lt;/p&gt;&#10;&lt;h3 id="临时节点的坑"&gt;临时节点的坑&#10;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;客户端 GC 停顿或网络抖动可能导致 session 超时，临时节点被误删而锁提前释放。需结合合理的 &lt;code&gt;sessionTimeout&lt;/code&gt; 与心跳。&lt;/li&gt;&#10;&lt;li&gt;持锁方崩溃后锁自动释放，但业务未提交，需保证操作幂等。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="与-etcd-的取舍"&gt;与 etcd 的取舍&#10;&lt;/h2&gt;&#10;&lt;p&gt;etcd 基于 Raft，提供更强一致与租约（lease）、Watch 增量推送，API 更简单，云原生场景（Kubernetes）更主流；ZK 生态成熟、客户端丰富，但在超大规模 Watch 下存在性能瓶颈。新项目可优先考虑 etcd，存量 Dubbo/Hadoop 体系仍常用 ZK。&lt;/p&gt;</description></item><item><title>服务注册与发现实战</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/dubbo/registry-discovery/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/dubbo/registry-discovery/</guid><description>&lt;p&gt;服务注册与发现是微服务架构的基石。Dubbo 将注册中心抽象为 &lt;code&gt;Registry&lt;/code&gt; 接口，因此可以在 ZooKeeper、Nacos、Consul 等实现之间平滑切换，业务代码无需改动。&lt;/p&gt;&#10;&lt;h2 id="注册中心接入"&gt;注册中心接入&#10;&lt;/h2&gt;&#10;&lt;p&gt;以 Nacos 为例，只需在配置中声明注册中心地址与协议即可。Dubbo 在启动时自动完成服务导出（export）与订阅（subscribe）：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-404ebe0c-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="yaml" data-td-line-count="8"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-404ebe0c-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;dubbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nacos://127.0.0.1:8848&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dubbo&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20880&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Provider 启动后会在注册中心写入自身元数据（接口、IP、端口、权重等）；Consumer 启动后订阅接口节点，拿到可用 Provider 列表并缓存到本地，后续调用直接走本地缓存，降低注册中心压力。&lt;/p&gt;&#10;&lt;h2 id="健康检查与上下线"&gt;健康检查与上下线&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;注册中心侧健康&lt;/strong&gt;：基于临时节点（ZooKeeper）或心跳（Nacos）感知进程存活，进程宕机时节点被摘除，Consumer 收到 &lt;code&gt;unregister&lt;/code&gt; 通知后剔除实例。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;应用侧优雅下线&lt;/strong&gt;：收到 &lt;code&gt;SIGTERM&lt;/code&gt; 时先取消注册、拒绝新请求、等待在途请求处理完毕再退出，避免调用方打到已下线的实例。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="不停机发布"&gt;不停机发布&#10;&lt;/h2&gt;&#10;&lt;p&gt;滚动发布时常见问题是「刚下线就又有流量」。推荐组合拳：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;下线前通过注册中心将实例权重置 0，使其不再接收新流量。&lt;/li&gt;&#10;&lt;li&gt;等待预热期与在途请求排空（如 10s）。&lt;/li&gt;&#10;&lt;li&gt;再执行实际进程关闭。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;配合 Consumer 端的失败重试与 &lt;code&gt;Cluster&lt;/code&gt; 容错（如 &lt;code&gt;Failover&lt;/code&gt;），可基本实现调用方无感知的版本迭代。需要注意：注册中心通知存在网络延迟，Consumer 本地缓存与重试机制是兜底关键。&lt;/p&gt;</description></item><item><title>投资顾问系统</title><link>https://4f0a9a3b.wangpeng.pages.dev/projects/investment-advisor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/projects/investment-advisor/</guid><description>&lt;p&gt;一个偏向个人投资研究的原型系统：用 AKShare 获取 A 股/基金数据，Supabase 做后端存储，All-Weather 策略做资产配置参考。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;状态&lt;/strong&gt;：进行中&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：Python / AKShare / Supabase / All-Weather&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：把「数据获取 → 策略回测 → 组合跟踪」串成可复用的工作流&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;适用&lt;/strong&gt;：个人投资研究，非投资建议&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>认知匹配 / AI 认知画像</title><link>https://4f0a9a3b.wangpeng.pages.dev/projects/cognitive-match/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/projects/cognitive-match/</guid><description>&lt;p&gt;一个轻资产创业方向的探索：通过 AI 认知画像，把人的知识结构、偏好与能力结构化，再与机会（项目、人、内容）做匹配。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;状态&lt;/strong&gt;：规划中&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;形态&lt;/strong&gt;：React + Claude API 的轻量原型&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;投入&lt;/strong&gt;：每周约 18–27 小时，优先免费/低成本方案&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;核心问题&lt;/strong&gt;：如何把「认知相似性」变成可计算、可解释的匹配信号&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>中文 AI 人味化 skill</title><link>https://4f0a9a3b.wangpeng.pages.dev/projects/ai-humanizer-skill/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/projects/ai-humanizer-skill/</guid><description>&lt;p&gt;一个 WorkBuddy skill（v3.0.0-zh），用于把 AI 生成的中文内容去「AI 味」，覆盖 18 类常见痕迹：夸张象征、宣传腔、-ing 分析、模糊归因、破折号滥用、三段式、AI 词汇等。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;版本&lt;/strong&gt;：v3.0.0-zh&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;形态&lt;/strong&gt;：WorkBuddy skill&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：公众号、技术文档、邮件、报告等需要「像人写的」中文场景&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;思路&lt;/strong&gt;：先检测痕迹模式，再按类别做针对性改写&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>银行业本体论</title><link>https://4f0a9a3b.wangpeng.pages.dev/projects/banking-ontology/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/projects/banking-ontology/</guid><description>&lt;p&gt;把银行科技中反复出现的概念（组织、产品、账户、交易、客户、渠道、风险、监管报送等）结构化成本体，形成可复用的知识框架。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;状态&lt;/strong&gt;：研究中&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：PPT、概念图、领域词汇表&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：让业务→技术→数据的映射有统一语言&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;关联方向&lt;/strong&gt;：ECIF、MDM、监管报送、数据资产&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>开博第一篇：为什么写「追风笔记」</title><link>https://4f0a9a3b.wangpeng.pages.dev/blog/welcome/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/blog/welcome/</guid><description>&lt;p&gt;做银行系统架构这些年，踩过的坑、想明白的事，大多散落在笔记本和聊天记录里。开这个站点，是想把它们系统地沉淀下来。&lt;/p&gt;&#10;&lt;h2 id="我会写什么"&gt;我会写什么&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;架构专栏&lt;/strong&gt;：客户信息系统（ECIF）、核心系统、分布式架构，以及领域驱动设计（DDD）在银行场景下的落地。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;银行业务专栏&lt;/strong&gt;：支付清算、计息与限额、账户/卡、反洗钱（AML）/KYC/CRS 等核心业务梳理。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;数据专栏&lt;/strong&gt;：数据治理、加密与安全、分库分表、消息与流处理。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="写给谁"&gt;写给谁&#10;&lt;/h2&gt;&#10;&lt;p&gt;同行、想转行做金融科技的工程师，以及任何对「银行系统为什么这么设计」感到好奇的人。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;这个站点是示例内容，框架搭好后，真实文章会逐步替换进来。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>在银行客户信息系统（ECIF）里落地 DDD 聚合</title><link>https://4f0a9a3b.wangpeng.pages.dev/columns/architecture/ddd-aggregate/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/columns/architecture/ddd-aggregate/</guid><description>&lt;p&gt;ECIF 里「客户」的概念极其庞大：个人、对公、同业，各自的属性、关系、生命周期都不同。如果用一个巨大的 &lt;code&gt;Customer&lt;/code&gt; 实体硬扛，代码会迅速腐化。&lt;/p&gt;&#10;&lt;h2 id="用界限上下文切分"&gt;用界限上下文切分&#10;&lt;/h2&gt;&#10;&lt;p&gt;把客户拆成几个界限上下文：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;客户主数据（Party）&lt;/strong&gt;：统一的自然人/机构标识与基础属性。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;客户画像（Profile）&lt;/strong&gt;：风险偏好、营销标签，读写频率高、变化快。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;客户关系（Relationship）&lt;/strong&gt;：持股、担保、集团关系。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="聚合根怎么定"&gt;聚合根怎么定&#10;&lt;/h2&gt;&#10;&lt;p&gt;每个上下文内部再定聚合根。例如 Party 上下文里，&lt;code&gt;Party&lt;/code&gt; 是聚合根，&lt;code&gt;Address&lt;/code&gt;、&lt;code&gt;Contact&lt;/code&gt; 是其值对象，保证一致性边界内不跨聚合调用。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;经验：聚合的边界应以「事务一致性」而非「业务概念大小」来划。ECIF 里最容易犯的错，就是把所有客户信息塞进一个聚合。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;这样设计后，主数据服务稳定，画像服务可以独立迭代，互不影响。&lt;/p&gt;</description></item><item><title>一文理清 ECIF：客户信息为什么要「集中」</title><link>https://4f0a9a3b.wangpeng.pages.dev/columns/banking/ecif-overview/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/columns/banking/ecif-overview/</guid><description>&lt;p&gt;在没有 ECIF 的年代，网点、网银、信用卡中心各自维护一份客户信息。同一个客户，在不同系统里姓名、证件、联系方式都不一样，营销和风控都无从谈起。&lt;/p&gt;&#10;&lt;h2 id="ecif-解决什么"&gt;ECIF 解决什么&#10;&lt;/h2&gt;&#10;&lt;p&gt;ECIF（企业客户信息整合）把分散在各业务系统的客户主数据收敛到一处，对外提供&lt;strong&gt;唯一客户视图&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;唯一标识&lt;/strong&gt;：用客户号（Party ID）统一自然人/机构，而非证件号。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;主次关系&lt;/strong&gt;：支持一人多户、一户多卡，但主数据唯一。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;服务化&lt;/strong&gt;：其他系统通过接口查询，不再各自落库。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="技术上的关键取舍"&gt;技术上的关键取舍&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;读写分离&lt;/strong&gt;：主数据写入强一致，查询可走缓存/只读副本。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;变更可溯源&lt;/strong&gt;：客户信息变更需要留痕，满足监管审计。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;ECIF 不是「又一个数据库」，而是银行数字化的最底层地基。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>银行数据治理：先治「元数据」再治「质量」</title><link>https://4f0a9a3b.wangpeng.pages.dev/columns/data/data-governance/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/columns/data/data-governance/</guid><description>&lt;p&gt;很多银行的数据治理项目最后沦为「补元数据、填责任表」。要见效，得把治理内建到数据生产的流水线里。&lt;/p&gt;&#10;&lt;h2 id="两件事优先做"&gt;两件事优先做&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;元数据与血缘&lt;/strong&gt;：字段从哪个系统来、被哪些任务加工、流向哪里，必须可自动追踪。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;质量规则内建&lt;/strong&gt;：非空、唯一、口径一致等校验，在 ETL/湖仓任务里当「门禁」，不过不入库。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="安全与加密"&gt;安全与加密&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;静态加密&lt;/strong&gt;：落盘即对敏感字段加密（如证件号、卡号）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;动态脱敏&lt;/strong&gt;：查询侧按角色脱敏，开发环境拿不到明文。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;治理的目标不是「漂亮的报告」，而是让 downstream 系统敢用这份数据。&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>关于</title><link>https://4f0a9a3b.wangpeng.pages.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/about/</guid><description>&lt;h2 id="简介"&gt;简介&#10;&lt;/h2&gt;&#10;&lt;p&gt;王鹏，数学学士 + 软件工程硕士（跨专业），现就职于某银行总部（北京），从事核心系统后端研发。主要关注&lt;strong&gt;分布式架构、单元化部署、银行核心业务建模&lt;/strong&gt;，以及 AI 在银行业务中的工程化落地。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;证书：PMP&lt;/li&gt;&#10;&lt;li&gt;技术主线：Java 后端、分布式系统、DDD / CQRS / Saga、企业架构与数据资产&lt;/li&gt;&#10;&lt;li&gt;当前重点：对客 AI Agent 平台建设；企业级 Java AI 框架选型（Spring AI 2.0 / LangChain4j / SAA / Embabel）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="经历"&gt;经历&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;阶段&lt;/th&gt;&#10; &lt;th scope="col"&gt;内容&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;教育&lt;/td&gt;&#10; &lt;td&gt;数学本科 → 软件工程硕士（跨专业转型）&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;现任&lt;/td&gt;&#10; &lt;td&gt;银行总部核心系统研发工程师&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;备考&lt;/td&gt;&#10; &lt;td&gt;软考高级「系统架构设计师」&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="技术栈"&gt;技术栈&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Java&lt;/code&gt; · &lt;code&gt;Spring Cloud&lt;/code&gt; · 分布式事务 · 单元化 · &lt;code&gt;DDD&lt;/code&gt; · 数据库（&lt;code&gt;MySQL&lt;/code&gt; / 分库分表）· 消息与流（&lt;code&gt;Kafka&lt;/code&gt;）· 缓存（&lt;code&gt;Redis&lt;/code&gt;）· 协调服务（&lt;code&gt;ZooKeeper&lt;/code&gt;）· 微服务治理 · 企业架构&lt;/p&gt;&#10;&lt;h2 id="项目与研究"&gt;项目与研究&#10;&lt;/h2&gt;&#10;&lt;p&gt;详见 &lt;a href="https://4f0a9a3b.wangpeng.pages.dev/projects/"&gt;项目&lt;/a&gt; 与 &lt;a href="https://4f0a9a3b.wangpeng.pages.dev/tech/"&gt;技术笔记&lt;/a&gt;。近期方向包括：投资顾问系统（AKShare + Supabase + All-Weather）、认知匹配 / AI 认知画像、PageFly 轻量页面托管、中文 AI 人味化、银行业本体论，并计划重启「银行科技 + AI」主题公众号。&lt;/p&gt;</description></item></channel></rss>