共计 2151 个字符,预计需要花费 6 分钟才能阅读完成。
从电商订单说起:if-else 的噩梦
最近接手了一个电商订单系统,状态流转逻辑像这样:

if (status == "PAID") {
// 检查库存
if (stockService.check(order)) {
status = "PREPARING";
// 通知仓库
} else {
status = "CANCELLED";
// 退款流程
}
} else if (status == "SHIPPED") {// 物流跟踪逻辑} // 还有 10 多个 else if...
每次新增状态类型,都要在这个 3000 行的类里小心翼翼找插入点。更痛苦的是促销活动期间,临时状态逻辑让代码变成了打满补丁的破裤子。
Agent 模式是什么?
不同于状态模式的状态切换和策略模式的算法替换,Agent 模式有三大特征:
- 自主性 :每个 Agent 维护自己的状态和行为
- 消息驱动 :通过异步消息触发行为
- 隔离性 :内部状态不受外部直接修改
用现实世界比喻:
– 状态模式像电灯开关(有限状态切换)
– 策略模式像汽车变速箱(算法替换)
– Agent 模式像快递小哥(自主处理包裹)
核心实现:从单机到分布式
基类设计(Java 版)
public abstract class Agent<T> implements Runnable {
// 消息队列(Disruptor 高性能环形队列)private final RingBuffer<Message> messageQueue;
// 状态机引用
protected StateMachine stateMachine;
// 处理消息抽象方法
protected abstract void onMessage(Message msg);
@Override
public void run() {while (true) {long sequence = messageQueue.next();
try {Message msg = messageQueue.get(sequence);
onMessage(msg); // 模板方法模式
} finally {messageQueue.publish(sequence);
}
}
}
}
线程安全分发(关键代码)
// 使用 ConcurrentHashMap 存储所有 Agent 实例
ConcurrentHashMap<String, Agent<?>> agents = new ConcurrentHashMap<>();
// Disruptor 事件处理器
class MessageEventHandler implements EventHandler<Message> {public void onEvent(Message event, long sequence, boolean endOfBatch) {Agent agent = agents.get(event.getAgentId());
if (agent != null) {agent.onMessage(event); // 线程隔离处理
}
}
}
Python 协程版(asyncio 实现)
class PyAgent:
def __init__(self):
self._queue = asyncio.Queue()
self._state = "init"
async def run(self):
while True:
msg = await self._queue.get()
await self._process(msg)
async def send(self, msg):
await self._queue.put(msg)
性能优化实战
单 Agent 基准测试(MacBook Pro M1)
| 消息类型 | 吞吐量 (msg/s) | 延迟 (ms) |
|---|---|---|
| 简单文本 | 1,200,000 | 0.8 |
| 带 JSON 解析 | 860,000 | 1.2 |
| 数据库操作 | 23,000 | 43.5 |
防雪崩策略
- 熔断机制 :当消息堆积超过阈值时,丢弃非关键消息
- 动态扩缩 :基于 K8s 的 HPA 自动伸缩 Agent Pod 数量
- 分级隔离 :核心业务 Agent 使用独立线程池
避坑指南
死锁检测实例
# 获取线程 dump
jstack <pid> > thread.dump
# 分析示例输出
"OrderAgent-5" #23 prio=5 os_prio=0 tid=0x00007f8a3c0b8000 nid=0x6d1e waiting for monitor entry [0x00007f8a2b7e7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.Agent.onMessage(Agent.java:47)
- waiting to lock <0x000000076e8a8d58> (a java.lang.Object)
消息幂等方案(Redis+Lua)
-- KEYS[1]: 消息 ID
-- ARGV[1]: 过期时间 (秒)
if redis.call("SETNX", KEYS[1], "1") == 1 then
redis.call("EXPIRE", KEYS[1], ARGV[1])
return true
else
return false
end
思考题:审批流程改造
假设现有审批系统是这样的流程:
提交 → 部门审批 → 财务审批 → CEO 审批 → 归档
如果用 Agent 模式改造:
1. 每个审批环节变成独立 Agent
2. 审批人变更为动态路由规则
3. 如何设计超时自动升级审批机制?
欢迎在评论区分享你的架构设计图!
正文完
