企业通信系统真正难的,从来不是"把短信、语音、邮件接进来",而是当业务规模扩大以后,系统仍然能够做到稳定、可扩展、可观测、可治理。
尤其对于出海企业来说,通信系统面对的是全球不同运营商、不同协议、不同国家监管规则以及不同网络环境。一个简单的 HTTP API,到了生产环境,很快就会遇到通道切换、消息堆积、回执延迟、接口超时、号码合规、发送限流等问题。
因此,企业通信系统的架构设计,不能只从"功能能不能实现"出发,而应该从业务、协议、调度、网络、通道和数据几个层面建立完整的方法论。
一、先确定:企业通信系统到底解决什么问题?
在设计架构之前,首先要明确通信系统的核心职责。
通常可以拆成四个层面:
-
触达:短信、语音、邮件等消息能够发送出去。
-
路由:根据国家、运营商、业务类型、成本和质量选择合适通道。
-
状态管理:能够知道消息是否提交、送达、失败以及失败原因。
-
运营治理:对账号、模板、号码、通道、资费、合规和风险进行管理。
所以,一个成熟的企业通信平台,本质上不是一个"消息发送接口",而是一套通信资源调度系统。
二、企业通信系统的六层架构
从工程实践来看,可以将企业通信平台抽象成六层:
API接入层 → 业务调度层 → 协议适配层 → 网络通信层 → 通道资源层 → 数据与监控层
1. API接入层
API层是业务系统与通信平台之间的入口。
常见接口包括:
-
短信发送 API
-
批量短信 API
-
OTP 验证码 API
-
语音呼叫 API
-
邮件发送 API
-
查询消息状态 API
-
查询余额 API
-
回执通知 API
这一层重点不是功能越多越好,而是接口稳定性和兼容性。
建议统一使用 RESTful API,并对请求进行:
-
Authentication
-
Signature
-
Timestamp
-
Idempotency
-
Rate Limit
-
Parameter Validation
尤其是短信发送接口,一定要考虑幂等机制。
例如业务系统因为网络抖动重复提交:
Request A → SMS Platform
Request A → Timeout
Request A → Retry
如果没有幂等控制,就可能导致用户收到两条验证码。
三、调度层决定系统的核心能力
如果说 API 层负责"接收消息",那么调度层负责决定:
这条消息应该怎么发送。
一个成熟的调度系统至少需要考虑:
-
国家/地区
-
运营商
-
Sender ID
-
消息类型
-
通道质量
-
通道价格
-
当前并发
-
历史送达率
-
错误率
-
通道状态
-
合规限制
因此,不建议把路由规则直接写死在业务代码里。
例如:
中国 → Channel A
美国 → Channel B
印度 → Channel C
这种方式在通道数量少的时候还能运行,但随着业务扩大,维护成本会迅速上升。
更合理的方式是建立动态路由引擎:
消息
↓
国家识别
↓
业务类型识别
↓
通道可用性判断
↓
质量评分
↓
成本策略
↓
路由决策
↓
发送
最终形成:
"规则路由 + 动态质量评分 + 故障自动切换"
的组合架构。
四、协议层必须做好解耦
企业通信平台通常不会只连接一种通信协议。
短信领域可能涉及:
-
HTTP API
-
SMPP
-
CMPP
-
SS7相关能力
-
HLR
-
第三方聚合接口
语音领域则可能涉及:
-
SIP
-
RTP
-
WebRTC
如果业务代码直接调用不同供应商的协议接口,系统很快会变成一个巨大的"供应商适配器"。
更合理的方式是建立统一的协议抽象层。
例如统一定义:
sendMessage()
queryStatus()
receiveDelivery()
closeConnection()
底层再分别实现:
HTTP Adapter
SMPP Adapter
CMPP Adapter
SIP Adapter
Provider Adapter
这样做的最大价值是:
业务层不需要知道底层到底使用什么协议。
以后新增一个 SMPP 供应商,或者替换一个 HTTP 通道,只需要增加或修改 Adapter,而不需要改动核心业务逻辑。
五、通道层不要和供应商强绑定
很多通信平台早期架构最大的隐患,就是:
一个供应商 = 一套业务代码。
这种设计初期开发很快,但后期非常难维护。
建议建立统一的 Channel Model:
Channel
├── Provider
├── Country
├── Operator
├── Protocol
├── Sender
├── Cost
├── Capacity
├── Quality
└── Compliance
这样平台管理的就不再是"供应商",而是标准化的通信资源。
例如同一个国家存在多个通道:
US
├── Provider A
├── Provider B
├── Provider C
└── Direct Operator
系统可以根据实时质量动态选择。
六、消息队列是高并发通信系统的关键
企业业务系统通常不会直接同步等待通信平台发送完成。
更合理的架构是:
业务系统
↓
API Gateway
↓
Message Queue
↓
Scheduling
↓
Channel
↓
Carrier
例如企业瞬间提交10万条短信。
如果 API 接口直接同步发送:
10万请求
↓
10万个网络连接
↓
供应商接口压力
↓
API响应变慢
↓
业务系统超时
而采用消息队列后:
10万消息
↓
Queue
↓
Worker集群
↓
按照通道并发能力消费
这样可以实现削峰填谷。
同时,还可以针对不同通道设置独立的消费速率:
Channel A → 500 TPS
Channel B → 300 TPS
Channel C → 100 TPS
避免某一个通道故障拖垮整个通信系统。
七、不要只做"发送成功",一定要做状态闭环
通信平台最容易被忽略的一点,就是:
发送成功 ≠ 用户收到。
短信至少存在:
Created
↓
Submitted
↓
Accepted
↓
Delivered / Failed
因此系统需要建立完整的消息状态机。
例如:
INIT
↓
QUEUED
↓
SUBMITTED
↓
DELIVERED
异常情况下:
SUBMITTED
↓
TIMEOUT
↓
RETRY
↓
FALLBACK
或者:
SUBMITTED
↓
FAILED
↓
Retry / Failover
同时要保留供应商原始状态码,并建立统一错误码体系。
例如:
Provider Error
↓
Error Mapping
↓
Internal Error Code
↓
Business Callback
这样企业客户才能真正理解:
为什么这条短信没有送达。
八、故障设计:不要追求"永不出错",而要追求"出错可控"
通信系统天然依赖大量外部资源。
运营商会维护,供应商会故障,网络会抖动,SMPP连接会断开,HTTP接口会超时。
所以架构设计不能建立在:
"通道永远正常。"
这个假设上。
应该建立完整的故障处理机制:
1. 超时
设置合理的 Connect Timeout、Read Timeout。
2. 重试
采用指数退避,避免故障时大量请求同时重试。
3. 熔断
某个通道错误率持续升高时,自动降低流量甚至暂时摘除。
4. 降级
主通道异常时切换备用通道。
5. 隔离
不同国家、不同客户、不同业务使用独立资源池,避免局部故障扩散。
最终形成:
监控 → 判断 → 熔断 → 切换 → 恢复
的完整闭环。
九、数据层需要区分"业务数据"和"通信数据"
通信系统的数据量通常非常大。
如果所有数据都塞进一张业务表,后期查询性能会越来越差。
建议进行数据分层:
核心业务数据
例如:
-
用户
-
企业
-
API Key
-
模板
-
Sender ID
-
账户余额
消息数据
例如:
-
Message ID
-
Destination
-
Country
-
Channel
-
Submit Time
-
Delivery Time
-
Status
日志数据
例如:
-
API Log
-
Provider Log
-
SMPP Log
-
Error Log
-
Callback Log
统计数据
例如:
-
TPS
-
Delivery Rate
-
Failure Rate
-
Channel Cost
-
Country Statistics
消息明细和日志数据量巨大时,可以考虑按时间、客户、国家等维度进行分表或数据归档。
十、监控体系不能只监控服务器
传统系统监控通常关注:
CPU
Memory
Disk
Network
但通信平台真正应该关注的是:
系统指标
-
CPU
-
Memory
-
QPS
-
TPS
-
API Latency
-
Queue Depth
通道指标
-
Submit Rate
-
Delivery Rate
-
Failure Rate
-
Timeout Rate
-
Connection Count
业务指标
-
验证码发送量
-
营销短信发送量
-
国家维度送达率
-
客户维度失败率
-
通道成本
例如:
美国短信今天送达率从98%下降到72%。
这比"服务器CPU 40%"更加值得关注。
因此通信平台应该建立业务监控 + 系统监控 + 通道监控三层监控体系。
十一、全球通信系统必须把合规设计放进架构
对于出海企业来说,合规不能作为上线前的补丁。
从系统设计阶段就应该考虑:
-
Sender ID 管理
-
模板管理
-
用户授权
-
Opt-out
-
黑名单
-
国家规则
-
发送时间限制
-
业务类型限制
-
内容风控
-
号码风险控制
可以在发送链路中加入:
API
↓
身份认证
↓
内容审核
↓
合规检查
↓
号码检查
↓
路由
↓
发送
这样才能避免"技术上能发送,但实际上不能发送"的情况。
十二、企业通信系统设计的核心原则
如果把前面的内容总结成几条架构原则,我认为最重要的是以下六点:
原则一:业务与通信协议解耦
业务系统不应该关心 SMPP、HTTP 还是 CMPP。
原则二:通道与供应商解耦
不要让核心业务逻辑绑定某一家供应商。
原则三:同步与异步结合
API负责快速接收,消息队列负责削峰,Worker负责实际发送。
原则四:状态必须闭环
从创建、提交到最终送达,都应该有明确状态。
原则五:故障必须可隔离
任何单点通道故障,都不应该影响整个通信平台。
原则六:合规前置
合规能力应该成为通信平台的基础设施,而不是运营阶段再补。
十三、一个成熟企业通信平台应该长什么样?
最终可以抽象成下面这套架构:
企业业务系统
│
┌──────▼──────┐
│ API Gateway │
└──────┬──────┘
│
┌──────▼──────┐
│ Auth / Rate │
│ Limit / Risk │
└──────┬──────┘
│
┌──────▼──────┐
│ Message Queue │
└──────┬──────┘
│
┌──────▼──────┐
│ Routing Engine│
└──────┬──────┘
│
┌──────────────┼──────────────┐
│ │ │
HTTP Adapter SMPP Adapter SIP Adapter
│ │ │
Provider A Provider B Voice Provider
│ │ │
└──────────────┼──────────────┘
│
运营商网络
│
最终用户
旁边再配套:
监控系统
日志系统
计费系统
数据分析
合规系统
告警系统
这才是一套完整的企业级通信基础设施。
结语
企业通信系统的架构设计,本质上是在解决三个问题:
如何稳定地发出去,如何准确地知道结果,以及出现问题后如何快速恢复。
对于小规模业务,HTTP API + 单通道就可以满足需求;但当企业进入多国家、多运营商、高并发、强合规阶段后,通信系统就必须从"接口调用"升级为真正的通信基础设施平台。
好的架构并不是把技术栈堆得越复杂越好,而是做到:
业务解耦、协议统一、通道可替换、路由可调度、故障可隔离、状态可追踪、数据可分析、合规可治理。
这几项能力,决定了一套企业通信系统究竟只能"跑起来",还是能够真正支撑企业长期出海。