传统B2B系统常常采用单体架构,但随着业务模块增多,比如订单管理、支付结算、物流追踪、供应商管理等功能耦合在一起,改一个地方就可能牵动全局。微服务架构的出现就是为了解决这个问题。它把每个业务模块拆分成独立的服务,比如订单服务、支付服务、商品服务等,每个服务可以独立开发、部署、扩展。
但拆分不是越细越好,说实话,很多团队踩过坑:服务拆得太碎,导致服务间调用链路过长,延迟增加,维护成本反而飙升。比如我曾见过一个B2B平台,把“用户地址管理”也拆成一个独立微服务,结果每次下单都要调用十几次服务,响应速度慢得像蜗牛。所以,拆分时要根据业务边界来,比如订单相关的功能放在一个服务里,物流相关的放在另一个,同时通过API网关统一管理入口。
另外,微服务间的通信方式也要考虑清楚。同步调用用REST或gRPC,异步用消息队列。比如订单创建后,通知仓储服务准备发货,用消息队列能避免因仓储服务宕机导致整个流程卡死。说白了,微服务架构的核心是“高内聚、低耦合”,每个服务只做自己最擅长的事。
B2B场景下,数据一致性是绕不过去的难题。比如一个订单涉及扣库存、扣款、生成物流单等多个步骤,如果某个步骤失败但其他步骤已执行,就会导致数据不一致。传统单体数据库可以用本地事务解决,但分布式环境下,每个服务有自己的数据库,事务管理变得复杂。
常用的方案有两种:强一致性用两阶段提交,但性能损耗大,适合对一致性要求极高的场景,比如金融交易。更多时候,我们选择最终一致性方案,比如使用消息队列加本地事件表。举个例子,订单服务先在自己数据库写入订单并记录一条“扣库存”事件,然后通过消息队列通知库存服务。库存服务消费消息后执行扣减,如果失败,可以重试或回滚。这就像发快递,只要最终能送到就行,不要求瞬间到位。
当然,设计时还要考虑幂等性——同一操作执行多次结果一样。比如支付回调接口,如果网络抖动导致重复调用,系统不能重复扣款。我的建议是,每个操作都带上全局唯一ID,服务端根据ID判断是否已处理。说实话,数据一致性是B2B技术架构中最容易出问题的环节,多花时间设计总比后期补坑要划算。
B2B平台一旦上线,可用性直接影响企业营收。想象一下,如果供应商正通过平台处理订单,系统突然崩溃,那损失可不止是几笔交易。所以,高可用架构必须从设计之初就考虑进去。
首先,服务节点要冗余部署,至少两台以上的实例运行同一服务,通过负载均衡器分发流量。比如用Nginx或云负载均衡,当一台服务器宕机,流量自动切换到其他节点。其次,数据库也要做读写分离或主从复制,避免单点故障。我见过一个案例:某B2B平台把所有数据放在一台MySQL上,结果硬盘坏了,恢复数据花了整整两天,业务几乎瘫痪。后来他们改用云数据库加上跨可用区备份,再遇到类似问题,秒级切换。
容灾策略上,冷备和热备要结合。冷备是定期备份数据,但恢复时间长;热备是实时同步数据到异地机房,切换快但成本高。说实话,对于中小企业,可以先实现同城双活,即在同一城市两个数据中心部署,成本可控且可用性有保障。另外,熔断机制也很重要:当某个服务响应过慢时,自动切断请求,防止雪崩效应。比如用Hystrix或Sentinel,一旦发现支付服务超时,直接返回降级结果,而不是让用户一直等待。
B2B技术架构的另一个特点是需要对接大量第三方系统,比如ERP、CRM、物流平台、支付网关等。API管理就成了连接这些系统的桥梁。如果API设计混乱,每次对接都像重新发明轮子,开发和维护成本会直线上升。
我的建议是,统一API网关作为入口,所有外部请求都经过网关。网关负责鉴权、限流、日志记录、协议转换等通用功能。比如供应商调用订单查询API,网关先验证其身份,再路由到订单服务。这样,每个服务只需专注业务逻辑,不用重复实现鉴权。同时,API版本管理也要重视,比如用URL路径区分版本“/v1/orders”、“/v2/orders”,避免升级时影响旧客户端。
第三方系统集成时,协议兼容性是个大坑。有些老系统只支持SOAP,新系统用RESTful,中间需要适配层。我参与过一个项目,客户要求对接一家物流公司,对方只提供FTP文件传输方式,我们只好写定时任务拉取文件再解析,效率低但不得不做。说实话,B2B集成没有银弹,唯一能做的就是提前调研清楚对方的接口规范,预留足够的适配时间。另外,熔断和限流也要应用在第三方调用上,防止某个第三方拖垮整个系统。