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 协议选型决策流程

以下决策流程帮助架构师在供应商目录同步场景中快速选择协议:

  1. 供应商技术能力评估:供应商是否具备提供 GraphQL 或 gRPC 接口的能力?如果大部分供应商只支持 REST,则优先考虑 REST。
  2. 数据量级评估:单次同步数据量是否超过 10MB?每日同步次数是否超过 1000 次?如果是,考虑 gRPC 或 GraphQL 减少传输量。
  3. 字段异构程度:不同供应商的目录字段交集是否小于 70%?如果是,GraphQL 的按需查询能显著降低适配成本。
  4. 实时性要求:是否需要秒级感知供应商目录变更?如果是,gRPC 的流式推送是最佳选择。
  5. 团队技术栈:团队是否熟悉 Protobuf 或 GraphQL?如果团队以传统 Web 开发为主,REST 的维护成本最低。
决策矩阵总结
场景特征 推荐协议 理由
供应商 < 30 家,字段标准统一 RESTful 开发快,调试方便,生态成熟
供应商 > 30 家,字段差异大 GraphQL 按需查询,减少适配和传输
日同步量 > 100 万 SKU,低延迟要求 gRPC 二进制高效,流式推送
混合场景:对外 REST,对内 gRPC REST + gRPC 对外兼容,对内高效

3.4 协议选型架构图

下图展示了在供应商目录同步场景中,三种协议如何与采购平台的不同模块配合:

供应商目录同步协议选型架构 供应商 A(REST) GET /api/catalog JSON 全量返回 字段固定 供应商 B(GraphQL) POST /graphql 按需查询字段 Schema 驱动 供应商 C(gRPC) 采购平台网关 协议适配层 REST 适配器 GraphQL 适配器 gRPC 适配器 统一数据模型 错误重试队列 幂等校验 内部服务调用 (统一使用 gRPC) 目录存储服务 写入供应商目录 增量变更日志 版本管理 同步调度服务 定时/事件触发 重试策略管理 同步状态追踪 内部服务统一使用 gRPC 通信

3.5 混合协议策略:对外兼容,对内高效

在实际的供应商目录同步平台中,单一协议往往无法满足所有场景。推荐采用混合协议策略:

  • 对外接口:对供应商暴露 RESTful 或 GraphQL 接口,降低供应商对接门槛。对于技术能力强的供应商,优先推荐 GraphQL。
  • 内部数据管道:采购平台内部的服务间通信统一使用 gRPC,利用其高性能和流式特性处理大规模目录数据。
  • 协议转换层:在网关层实现协议适配,将外部 REST/GraphQL 请求转换为内部 gRPC 调用,对上层业务透明。
实践建议:在项目初期,如果供应商数量少于 20 家,可以先统一使用 RESTful 快速上线。随着供应商数量增长和同步数据量增加,逐步引入 GraphQL 和 gRPC,通过网关层实现平滑迁移,避免一次性全量改造。