第3章:常见通信协议:HTTP/HTTPS、RPC、消息队列的区别与选型

做接口集成,选通信协议是第一道坎。很多刚入行的同事喜欢问:“哪个协议最好?”我不这么看。没有最好的协议,只有最合适的场景。今天我就把这三种主流方案掰开揉碎了讲,你在实际项目中肯定能用上。

3.1 HTTP/HTTPS:万金油,但不是万能油

HTTP,说白了就是浏览器跟服务器聊天用的那套规矩。不过现在都2025年了,除了内部测试,我还真没见过谁还在用纯HTTP做生产集成。

⚠️ 审计接口的硬性要求:凡是涉及财务数据、审批流程、合同信息的接口,必须上HTTPS。我的建议是,即使是查询一个公开的科目余额,也走HTTPS。这不是技术问题,是合规红线。

我在项目中遇到过几次,对方提供了HTTP接口,说是“内网环境,没关系”。我坚持让他们改了。为什么?因为你没法保证中间没人搭个嗅探器。内部员工泄露数据的案例,你们应该也听过不少。

适用场景:

  • 业务系统与审计系统的单次请求-响应
  • 文件上传下载(审计证据、凭证影像)
  • 对实时性要求不高的查询类接口

举个例子,你要从财务系统拉一份科目余额表:

POST /api/v1/audit/account-balance
Host: finance.internal.com
Content-Type: application/json
Authorization: Bearer <>

{
  "accountCode": "1001",
  "period": "2025-01"
}

这种方式简单明了。但你要是用它做实时的凭证流推送,那就不太明智了——每次都要建立连接、传输、断开,效率上不去。

3.2 RPC:内部系统之间的高速路

RPC,远程过程调用。你想想看,你调一个本地函数,参数传进去,结果回来。RPC就是让你感觉在调一个远程的函数。常见的实现有gRPC、Dubbo、Thrift。

我个人习惯在审计系统的内部模块间用gRPC。比如审计主控系统要去查一下风险模型引擎的结果,用gRPC就比RESTful快得多。为什么?因为它序列化用的是Protobuf,不是JSON,数据包小了不止一半。

💡 实践经验:同一台机器上的两个服务,用gRPC的延迟大概是HTTP的1/3。跨机器的,节省更明显。我在一个银行项目中做过对比,同样传输1000条审计日志,gRPC用了120ms,HTTP用了380ms。

适用场景:

  • 审计系统内部模块之间的高频调用
  • 对延迟敏感的实时规则校验
  • 数据量大的批量查询(一次查几万条分录)

一个gRPC服务的定义大概是这样的:

service AuditRuleEngine {
  rpc CheckTransaction (TransactionRequest) returns (CheckResult);
}

message TransactionRequest {
  string transactionId = 1;
  string accountCode = 2;
  double amount = 3;
  string timestamp = 4;
}

但是,RPC也有坑。我曾遇到过,两个系统用了不同的gRPC版本,结果序列化对不上,跑了一晚上的数据全是空的。嗯,这里要注意,跨系统的RPC一定要事先约好接口规范和版本管理流程。

3.3 消息队列:削峰填谷的利器

消息队列,你先把消息扔进去,消费者有空了再来取。常见的有Kafka、RabbitMQ、RocketMQ。这玩意儿在审计场景里,简直是为数据流转量身定做的。

为什么这么说?你想,审计系统经常要做的是“每天凌晨批量拉取前一天的所有交易流水”。如果用HTTP,财务系统那边可能扛不住瞬间的请求量。用RPC呢?也不现实,因为财务系统没法一直等着审计系统响应。

我建议的做法是:财务系统把流水实时推送到Kafka的一个Topic里,审计系统自己按节奏消费。这样两边都不累。

关键逻辑:消息队列的核心价值在于解耦和异步。审计系统的下游(如报表生成、数据归档)可以用独立的消费者来处理,互不影响。我曾经为了处理一个上游系统的故障,直接把积压的消息拉下来重跑,两周的数据一个晚上就追回来了。

适用场景:

  • 审计数据的批量传输(凭证流、交易流水、审批日志)
  • 跨系统的数据同步(财务-审计-风控)
  • 对一致性要求不那么苛刻(允许秒级延迟)的场景

一个典型的消息体结构:

{
  "messageId": "msg_202501010001",
  "eventType": "TRANSACTION_CREATED",
  "timestamp": "2025-01-01T00:00:00Z",
  "payload": {
    "transactionId": "txn_xxx",
    "amount": 15000.00,
    "accountFrom": "1001",
    "accountTo": "2001"
  }
}

3.4 怎么选?一张表说清楚

很多团队在选型上纠结。我通常会问三个问题:

  1. 数据重要,还是速度重要? —— 重要数据选HTTPS/RPC,速度选消息队列。
  2. 是一对一,还是一对多? —— 一对一用HTTP/RPC,一对多用消息队列。
  3. 能接受几秒延迟吗? —— 能,消息队列;不能,直接调用。
三种协议对比
维度 HTTP/HTTPS RPC (gRPC) 消息队列
通信模式 请求-响应 请求-响应 异步发布/订阅
延迟 ~100-500ms ~10-50ms ~1-10ms (生产侧)
吞吐量 中 高 极高
数据格式 JSON/XML Protobuf JSON/Binary
审计适配性 最适合外部对接 最适合内部模块 最适合数据流转

3.5 我总结的选型逻辑

你打开任何一本集成架构的书,都会告诉你“根据场景选”。但实际项目中,我建议你从两个维度下手:

  • 数据的时间敏感度:实时查询(如当前是否违规)走RPC;批量对账(如日终凭证核对)走消息队列;跨组织的接口(如与税务局对接)走HTTPS。
  • 系统的耦合度:强耦合走RPC;弱耦合走消息队列;无耦合走HTTPS。
💡 我的经验:在审计接口集成的初期,先统一用HTTPS把数据拉进来。等量上来了,再逐步把核心链路切到RPC或消息队列。一步到位容易翻车,我亲眼见过一个团队上来就上Kafka,结果配置错了半年没跑通。

好了,下面这张图可以帮你理清这三种协议在审计环境中的位置关系。

审计接口集成协议选型逻辑 财务系统 业务系统 外部系统 消息队列 (Kafka/RabbitMQ) RPC (gRPC/Dubbo) HTTPS (RESTful) 审计接口网关 说明: • 实时查询(如:检查当前凭证是否违规)→ 走 RPC • 批量对账(如:日终凭证数据核对)→ 走消息队列 • 跨组织对接(如:与外部税务系统交互)→ 走 HTTPS

最后提醒一句:选型不是一次性的。随着审计系统接入的数据源越来越多,你可能今天用HTTP,明天就得切消息队列。别死守一种协议,灵活一点。