BluLogix CIS:电信计费与 Salesforce 的 ETL 集成
在 BluLogix 主导前端开发和 CIS 到 Salesforce 的集成工程--Java EE、GWT 与 Talend ETL 构建的电信计费平台,加上用 BPMN 设计的工作流,以及关于如何认真对待翻译层的第一课。
有一类集成问题,在白板上看起来很直白,然后每周都在教你新东西,教了整整一年。BluLogix 的 CIS 到 Salesforce 集成就是那个问题。
BluLogix 构建 Cloud Innovation Suite(CIS)—一个面向电信运营商的云计费平台。不是通用 SaaS 计费,是专门的电信计费:基于用量的收费、套餐层级、促销定价、捆绑管理、周期中调整、按比例发票。只有在里面做过的人才能完全理解这种计费复杂度。我从 2013 年到 2014 年在这里担任前端侧的团队负责人和开发者,并主导了 Salesforce 集成工作。
为什么电信计费是自己的域
电信计费不是通用计费的简化版,而是有着不同数据模型的独立学科。
电信运营商的计费系统在事件级别追踪用量—通话、数据、短信—对照套餐权益聚合这些事件,应用分级和促销费率,生成发票,处理信用和调整,管理付款周期,并出具电信运营商被要求提交的监管报告。所有这些都在持续运转,面向网络上的每一个订户。
数据模型反映了这种复杂度。一个订户有一个服务档案,服务档案有一个或多个套餐,每个套餐有权益、超额和促销修饰符。用量事件持续到达,必须按其发生时段的正确套餐版本计费—因为订户可能在周期中途更换了套餐,或者运营商更改了套餐条款,而历史计费必须是正确的。
这是 CIS 的领域,它对这个领域了解得很深。问题是 CRM 系统—Salesforce—知道的是一个完全不同的领域。
不兼容的数据模型问题
Salesforce 围绕 CRM 对象模型构建:Account、Contact、Opportunity、Lead、Case。它懂客户、交易和工单。它不懂订户、服务档案、用量事件和计费周期。
集成需求是真实的:使用 CIS 的电信运营商也用 Salesforce 做销售和支持运营。CIS 里的一个订户在 Salesforce 里有一个对应的 Account。支持团队在 Salesforce 里发起的 CIS 套餐变更需要流进 CIS,不需要支持人员单独登录 CIS。账单历史需要在 Salesforce 界面里可见,不需要单独登录。
这些是合理的产品需求。实际操作中,它们也是同时双向的数据模型翻译问题。
Talend ETL:真正落地的集成层
方案是 Talend ETL—一个企业 ETL 平台—作为 CIS 和 Salesforce 之间的集成层。不是直接 API 集成,不是自定义中间件服务,而是一个专门的 ETL 作业编排层,显式地承担翻译责任。
这是正确的决定,有几个原因在事后才完全清晰。
转换是有状态的。 把 CIS 订户映射到 Salesforce Account 不是一次性翻译,而是持续同步。变更在两个方向流动,ETL 层追踪同步状态、处理冲突、管理已同步内容的历史—这是一项与 CIS 计费引擎或 Salesforce org 都不应该承担的工作。
故障模式不同。 两个生产系统之间的直接 API 集成耦合了它们的故障模式:Salesforce API 慢了,CIS 也慢吗?一个 CIS 事件推送失败,Salesforce 里的支持人员看到的是过期数据还是报错?ETL 层解耦了这些故障域。CIS 跑,Salesforce 跑,ETL 层处理中间的间隙。
业务规则住在一个地方。 从 CIS 服务档案到 Salesforce Account 字段的映射是业务规则,套餐状态到商机阶段的映射也是。这些规则住在 ETL 作业配置里,而不是散落在两个系统里,让它们可被审计、可测试,不需要碰任何一个生产系统就能改变。
BPMN 工作流设计
计费工作流和集成工作流都用 BPMN—Business Process Model and Notation—建模。不是事后的文档,而是工作流引擎执行的规格说明。
这个区别很重要。BPMN-作为文档是在画好的那天准确、然后与现实漂移的图表。BPMN-作为执行是系统行为的权威定义。当电信运营商的销售团队想知道为什么套餐变更还没有传播到 Salesforce,答案是一张 BPMN 图,精确地显示作业在工作流的哪个位置、在等待什么条件、下一步是什么。
我主导了集成侧的 BPMN 工作流设计。挑战在于电信计费工作流有自然的时序依赖—在发票周期关闭之前不能用发票数据更新 Salesforce—这些必须在工作流模型里表达为显式的等待条件,而不是 sleep timer 或 cron schedule。区别在于 BPMN 工作流知道它为什么在等待,能在条件满足时正确响应,而不是轮询到计时器触发。
前端:2013 年的 GWT
CIS 前端建在 GWT—Google Web Toolkit—上,它把 Java 编译成 JavaScript。2013 年对于一个大型企业数据应用来说,这是合理的架构选择。Java 在多贡献者大型代码库里提供的类型安全不是小事,组件模型成熟,调试工具比当时 JavaScript 生态的替代品更好。
在 2026 年,这也是一个被明确超越的技术选择。Web 平台已经移动了,JavaScript 框架已经收敛到让 GWT 的权衡不再必要的模式。我直说,因为这是工作的诚实会计的一部分:我用 GWT 构建了大量 UI,带领团队做 GWT 开发,我能精确地告诉你那个选择在 2013 年为什么合理,也能精确地告诉你我今天不会这样做。
我监督并带领了前端开发团队—代码 review、架构决策、那种让一个团队真正交付而不是产出一堆永远不 merge 的 PR 的任务级协调。这是我第一次真正担任团队负责人的角色,那段经历里的 lessons(关于团队层面的技术决策,关于知道怎么做和知道怎么向正在学习的人解释之间的鸿沟)伴随着我走过了每一个后续角色。
我会告诉自己什么
两个企业系统之间不兼容的数据模型问题,几乎从不通过让任一系统更灵活来解决。它通过显式拥有翻译层来解决—给它正确的责任,不让任何一方假装对方的模型不存在。
Talend ETL 层奏效,因为它认真地把翻译工作当作一份工作—不是螺栓固定在现有 API 上的薄适配器。它有自己的状态,有自己的故障处理,它负责 CIS 的世界和 Salesforce 的世界之间的间隙,而且它清楚地知道这个责任。
那个模型—拥有边界,不假装它比实际更薄—是我在此后每一个集成问题里都会伸手去拿的东西。不同的工具,同样的洞察。