3. 接口同步协议选型:RESTful vs GraphQL vs gRPC 在供应商场景下的对比
供应商目录接口同步的核心挑战在于:数据模型异构(不同供应商字段定义不同)、同步频率差异(全量/增量)、网络环境复杂(公网/专线/跨云)。选择错误的协议会导致接口开发成本高、同步失败率高、排障困难。本节从供应商目录同步的典型场景出发,对三种主流协议进行横向对比。
3.1 三种协议的核心差异
| 对比维度 | RESTful (JSON over HTTP) | GraphQL | gRPC (Protobuf over HTTP/2) |
|---|---|---|---|
| 数据格式 | JSON(文本,自描述) | JSON(查询结果) | Protobuf(二进制,强类型) |
| 接口定义 | URL + HTTP Method 隐式定义 | Schema + Query/Mutation 显式定义 | .proto 文件显式定义 |
| 数据获取粒度 | 服务端固定返回结构(可能 over-fetching) | 客户端精确指定所需字段(无 over-fetching) | 按 .proto 定义返回(需预定义字段) |
| 传输效率 | 文本冗余大,Payload 体积大 | 文本冗余中等,可减少字段传输 | 二进制编码,体积最小,解析最快 |
| 流式支持 | 需额外实现 SSE/WebSocket | 支持 Subscription(基于 WebSocket) | 原生支持 Server Streaming / Bidirectional Streaming |
| 浏览器兼容性 | 原生支持 | 需 HTTP POST 代理,缓存困难 | 需 gRPC-Web 代理,不直接支持 |
| 工具链成熟度 | 极高(Postman, curl, 各类 SDK) | 高(GraphiQL, Apollo, Relay) | 中高(protoc, grpcurl, 代码生成) |
3.2 供应商目录场景下的协议选型分析
3.2.1 RESTful:适合标准化的供应商全量同步
RESTful 是目前供应商对接中最常见的协议。其优势在于生态成熟、调试方便,适合供应商数量不多(< 50 家)、接口规范统一的场景。
- 适用场景:供应商提供标准 REST API,返回固定字段的 JSON 数据;采购平台定时拉取全量目录。
- 痛点:当不同供应商返回的字段结构差异大时,客户端需要写大量适配代码;一次拉取可能包含大量不需要的字段(over-fetching),浪费带宽。
典型 REST 请求示例(获取供应商目录)
GET /api/v1/suppliers/{supplierId}/catalog?page=1&size=100
Host: supplier-platform.com
Authorization: Bearer {}
Response:
{
"total": 5000,
"items": [
{
"sku": "SP-001",
"name": "工业轴承 6205",
"price": 12.50,
"currency": "CNY",
"stock": 200,
"category": "轴承",
"specs": {
"material": "铬钢",
"weight_kg": 0.15
}
}
]
}
3.2.2 GraphQL:适合多供应商异构字段的增量同步
当采购平台需要对接数十家甚至上百家供应商,且每家供应商的目录字段差异较大时,GraphQL 的按需查询能力可以显著降低数据传输量和客户端适配成本。
- 适用场景:供应商提供统一的 GraphQL 端点,采购平台按需查询特定字段;适合增量同步场景,只拉取变更的字段。
- 优势:客户端可以精确指定需要的字段(如只拉取价格和库存),避免 over-fetching;Schema 强类型定义,接口文档自动生成。
- 劣势:查询复杂度高时可能造成服务端性能压力;缓存策略比 REST 复杂;部分供应商技术团队对 GraphQL 不熟悉。
选型建议:如果供应商目录的字段超过 30 个,且不同供应商的字段交集小于 60%,优先考虑 GraphQL。它能让采购平台以统一查询语言屏蔽供应商的字段差异。
3.2.3 gRPC:适合高频、大批量的流式同步
对于需要实时或准实时同步大量供应商目录数据的场景(如每日百万级 SKU 变更),gRPC 的二进制传输和流式通信能力具有明显优势。
- 适用场景:供应商与采购平台之间建立专线或内网连接;需要持续推送目录变更事件;数据量大且对延迟敏感。
- 优势:Protobuf 序列化后 Payload 体积比 JSON 小 60%-80%;支持 Server Streaming,供应商可以持续推送变更;强类型接口定义,代码生成减少适配错误。
- 劣势:浏览器端需要 gRPC-Web 代理;调试工具不如 REST 丰富;.proto 文件变更后需要重新生成客户端代码。
注意:gRPC 不适合公网环境下大量供应商直接对接。如果供应商无法提供 gRPC 端点,采购平台可以在内部使用 gRPC 做数据管道,对外仍暴露 REST/GraphQL 接口。
3.3 协议选型决策流程
以下决策流程帮助架构师在供应商目录同步场景中快速选择协议:
- 供应商技术能力评估:供应商是否具备提供 GraphQL 或 gRPC 接口的能力?如果大部分供应商只支持 REST,则优先考虑 REST。
- 数据量级评估:单次同步数据量是否超过 10MB?每日同步次数是否超过 1000 次?如果是,考虑 gRPC 或 GraphQL 减少传输量。
- 字段异构程度:不同供应商的目录字段交集是否小于 70%?如果是,GraphQL 的按需查询能显著降低适配成本。
- 实时性要求:是否需要秒级感知供应商目录变更?如果是,gRPC 的流式推送是最佳选择。
- 团队技术栈:团队是否熟悉 Protobuf 或 GraphQL?如果团队以传统 Web 开发为主,REST 的维护成本最低。
决策矩阵总结
| 场景特征 | 推荐协议 | 理由 |
|---|---|---|
| 供应商 < 30 家,字段标准统一 | RESTful | 开发快,调试方便,生态成熟 |
| 供应商 > 30 家,字段差异大 | GraphQL | 按需查询,减少适配和传输 |
| 日同步量 > 100 万 SKU,低延迟要求 | gRPC | 二进制高效,流式推送 |
| 混合场景:对外 REST,对内 gRPC | REST + gRPC | 对外兼容,对内高效 |
3.4 协议选型架构图
下图展示了在供应商目录同步场景中,三种协议如何与采购平台的不同模块配合:
3.5 混合协议策略:对外兼容,对内高效
在实际的供应商目录同步平台中,单一协议往往无法满足所有场景。推荐采用混合协议策略:
- 对外接口:对供应商暴露 RESTful 或 GraphQL 接口,降低供应商对接门槛。对于技术能力强的供应商,优先推荐 GraphQL。
- 内部数据管道:采购平台内部的服务间通信统一使用 gRPC,利用其高性能和流式特性处理大规模目录数据。
- 协议转换层:在网关层实现协议适配,将外部 REST/GraphQL 请求转换为内部 gRPC 调用,对上层业务透明。
实践建议:在项目初期,如果供应商数量少于 20 家,可以先统一使用 RESTful 快速上线。随着供应商数量增长和同步数据量增加,逐步引入 GraphQL 和 gRPC,通过网关层实现平滑迁移,避免一次性全量改造。