共计 2171 个字符,预计需要花费 6 分钟才能阅读完成。
从一次服务超时事故说起
上周排查一个线上问题时,发现订单服务调用风控服务的 P99 时延达到 1200ms,远超 200ms 的 SLA 要求。日志显示每次调用都伴随 TCP 连接建立(约 300ms)和 JSON 序列化开销(约 150ms)。这引出了关键问题:在高频跨服务调用场景下,我们是否应该继续使用基于 HTTP/JSON 的 Skill 方案,还是切换到二进制协议的 MCP?

协议层核心差异
1. 编码方式对比
- MCP(Microservice Communication Protocol):
- 采用 Protocol Buffers 二进制编码
- 字段通过 tag 序号标识,体积缩小 60-80%
-
示例数据:
0A 05 48 65 6C 6C 6F(表示字符串 ”Hello”) -
Skill(JSON-RPC):
- 基于 JSON 文本传输
- 可读性强但冗余度高
- 示例数据:
{"method":"greet","params":["Hello"]}
2. 连接管理模型
graph LR
A[MCP] -->| 长连接 | B[Keep-Alive]
C[Skill] -->| 短连接 | D[三次握手]
MCP 默认维持长连接,减少 TCP 握手开销;而 Skill 通常每个请求独立建立连接(除非显式开启 Keep-Alive)。
性能基准测试
Go 语言实现对比
// MCP 性能测试
func BenchmarkMCP(b *testing.B) {conn := setupMCPConnection() // 建立长连接
defer conn.Close()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {for pb.Next() {req := &pb.Request{Id: 1}
conn.Send(req) // 二进制编码发送
}
})
}
// Skill 性能测试
func BenchmarkSkill(b *testing.B) {client := http.Client{Timeout: 5*time.Second}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {for pb.Next() {body := `{"jsonrpc":"2.0","method":"ping"}`
http.Post("http://api/skill", "application/json", strings.NewReader(body))
}
})
}
测试结果(4 核 8G 环境,100 并发):
| 指标 | MCP | Skill |
|————|——–|——–|
| QPS | 28,000 | 9,500 |
| 平均延迟 | 3.2ms | 9.8ms |
| P99 延迟 | 12ms | 45ms |
主流框架集成方案
Spring Cloud 场景
// MCP 集成(需添加 stub 依赖)@GrpcClient("risk-service")
private RiskServiceGrpc.RiskServiceBlockingStub riskStub;
public void checkRisk() {RiskRequest request = RiskRequest.newBuilder()
.setUserId(123)
.build();
RiskResponse response = riskStub.check(request); // 二进制调用
}
// Skill 集成
@FeignClient(name = "risk-service")
public interface RiskService {@PostMapping("/rpc")
Map<String, Object> check(@RequestBody Map<String,Object> params);
}
Kubernetes 服务网格
# Istio VirtualService 配置示例
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mcp-vs
spec:
hosts:
- risk-service
http:
- route:
- destination:
host: risk-service
port:
number: 9000
timeout: 1s # 比 Skill 更短的超时设置
生产环境注意事项
熔断策略建议
- MCP:
- 错误率阈值:5%(因长连接问题会扩散)
- 最小请求数:50/s
- Skill:
- 错误率阈值:10%
- 最小请求数:20/s
WireShark 诊断技巧
# MCP 流量过滤
proto == "grpc" && frame.time_delta < 0.1
# Skill 问题定位
http contains "error" && ip.dst == SERVICE_IP
证书自动化方案
# 使用 cert-manager 自动轮换
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
Serverless 架构的新思考
当服务实例生命周期缩短到分钟级时:
1. MCP 的长连接优势是否仍然存在?
2. Skill 的无状态特性是否更适合函数计算?
3. 冷启动场景下哪种协议更能保证低延迟?
这些问题需要结合具体的 FaaS 平台特性重新评估,也欢迎读者分享实践经验。
正文完
