ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

金融核心系统上云:批处理PaaS化改造与多租户隔离实践

金融核心系统上云:批处理PaaS化改造与多租户隔离实践 简介金融行业核心系统上云是近年来的热门议题这份PPT从一家传统寿险公司的IT困境切入系统梳理了新一代金融核心业务系统云架构的建设路径与关键抉择适合金融企业技术管理者、架构师以及云平台规划人员参考。资源包内为单个PPT演示文稿压缩包大小2.58MB以图文形式覆盖项目现状、建设目标、云部署模式与服务模式选择并重点说明PaaS层10个组件的来源、分工及自建/购买情况帮助读者较快建立整体认知。内容还以批处理平台为例完整呈现从原有Batch平台向Batch PaaS改造的过程包括引入ZooKeeper实现分布式并行计算、动态节点管理和故障自动转移以及多租户数据、性能、安全隔离的落地做法能直接用于类似系统的方案设计或汇报演示。目前已有91人学习浏览对想了解保险核心系统云化路径、批处理平台PaaS化细节的读者是一份难得的实践复盘与架构参考。1. 金融核心系统上云先别谈 IaaS把批处理做成 PaaS 再说这份 PPT 讲的是一个典型矛盾一边是云技术发展如火如荼一边是传统金融公司 IT 还陷在 JDK 1.4.2 和 JSPServlet 的老坑里。作者给了个非常务实的答案——不是推倒重来上 IaaS而是把现有系统里最痛、最独立的批处理能力先抽出来改造成 PaaS。这个思路对中小型金融机构尤其有参考价值资源有限、业务年增长 50%、核心系统跑不稳却还要支撑未来十年的业务量。如果你是传统行业里做架构转型、平台建设的从业者这份材料能帮你少走不少弯路关键是怎么拆、怎么选型、改造到什么粒度。2. 云平台选型十个 PaaS 组件哪些该买、哪些必须自建2.1 部署模式与服务模式混合云是远期当下先落在私有云PPT 对部署模式的规划分了三层公有云、私有云、混合云远期。这里头有个关键判断对于持牌金融机构核心业务系统短期内不可能放在公有云上跑安全和合规是硬约束。所以公有云只是远期选项当下实际落地的重心在私有云——用 VMware 管虚拟机Oracle 12C 做数据库Weblogic 12C 做中间件这些都是已购资产。服务模式上IaaS 三个、PaaS 十个、SaaS 待规划这个结构很说明问题。SaaS 对这家公司来说太激进PaaS 才是真正发力的地方。我在做类似项目的时候会先画一张分层图底层 IaaS 只解决资源供给问题PaaS 层才是开发效率的杠杆SaaS 层则要往后放。选型原则通常是越靠近基础设施层越优先复用已购商业产品越靠近业务能力层越倾向自建或二次开发。提示私有云不是必须从零搭一套 OpenStack用 VMware 加自动化脚本也能形成私有云的资源池关键是形成「申请—审批—自动交付」的闭环。2.2 PaaS 十个组件的选型决策商业产品 7 个、自主设计 6 个这是整个 PPT 信息密度最高的一页直接看组件清单和状态组件能力说明建设方式IBM BPM流程管理购买IBM ODM规则管理保险产品规则、基本法购买ECM内容管理自建实施中Monita监控平台自建实施中DTX分布式事务管理购买UM用户管理自建Batch批处理平台二次开发Report报表平台自建CIPS渠道接入平台购买PF产品工厂自建商业产品 7 个、自主设计 6 个数字有重叠说明有的组件是商业产品加自建改造混合的。选型逻辑值得拆一下流程管理和规则管理直接用 IBM 的成熟产品因为保险行业的产品规则、销管基本法极其复杂自建成本极高而批处理、用户管理这类与具体业务紧耦合、又需要深度定制的能力选择自建更可控。我做选型时有一条经验先看这个组件是不是行业标准化的。BPM、规则引擎、分布式事务国际上都有成熟标准买比造划算而批处理平台涉及大量内部系统的任务编排和资源管理逻辑外部产品套不上必须自己拆。另一个判断维度是差异化程度——凡是能成为公司效率壁垒的自建凡是买了就能用的通用能力别碰。2.3 与常见云架构演进路径的差异利用遗留系统而非推倒重来这里值得多说一句。PPT 花了一整页强调「跟别人有点不一样」三个不一样分别是充分利用遗留应用系统、充分利用已购买软硬件资产、充分利用现有人员的知识技能。这条原则非常关键尤其在 IOE 架构向云原生架构演进的过程中很多团队容易走极端——要么一切重来要么死守旧系统。作者给的折中路径是在遗留系统旁边建一层 PaaS把共性能力抽出来老系统逐步接入。这样做的好处是风险可控每一期都有可交付的成果代价是架构上会有过渡期的割裂感需要靠接口层去弥合。注意这里是私有云加已购资产复用不是从零买新硬件。预算有限的团队第一件事永远是盘资产而不是列采购清单。3. 批处理平台改造实录Job/Task/Executor 三级模型与多租户隔离的实现3.1 核心抽象一个并行计算任务拆成 Job、Task、Executor 三层PPT 对批处理平台的定义很清晰提供批处理开发、批处理运行管理两部分功能主要用于大批量数据的统一处理比如分红批处理、满期批处理。这批作业的共同特点是数据量大、计算密集、对完成时间有硬性要求。平台的核心抽象是三级模型Job一个完整的并行计算任务对应一次业务批处理TaskJob 被拆分成多份并行执行每一份叫一个 TaskExecutor真正执行 Task 逻辑的执行者需要开发人员实现。这里有个极易被忽视的设计点开发人员需要学习五个基本概念但真正要实现的只有三个子类——Executor、SharedResourceHolder、任务拆分逻辑。这个设计把使用门槛压到了最低。以 Java 为例Executor 的典型实现骨架是这样的public class DividendExecutor extends AbstractTaskExecutor { Override public void execute(TaskContext context) { // 从共享资源中获取数据源和连接池 DataSource ds SharedResourceHolder.getInstance().getDataSource(context.getTenantId()); // 按任务分片参数处理数据 String batchId context.getTaskParam(batchId); String policyRange context.getTaskParam(policyRange); processDividend(batchId, policyRange, ds); } private void processDividend(String batchId, String policyRange, DataSource ds) { // 实际的批量分红计算逻辑 } }这段代码的逻辑说明Executor 不关心 Job 是怎么拆分的它只收到一个 TaskContext从里面取任务参数和租户标识再从 SharedResourceHolder 获取对应的数据源然后执行自己负责的那份数据。任务拆分逻辑由框架层负责通过 ZooKeeper 协调各节点把 Task 分发到不同的 Executor 上。SharedResourceHolder 的设计意图是封装公共操作比如初始化数据库连接池、缓存连接池、Spring 上下文。它的典型实现是注册表模式。开发人员通常不需要动它框架初始化时一次性加载全部共享资源。3.2 三级模型的关键参数与实现TaskContext 中几个关键参数决定了任务的边界taskId任务分片唯一标识用于故障恢复时定位断点tenantId租户标识多租户隔离的数据路由依据下一节详述taskCount/taskIndex总任务份数、当前份索引用于分片计算jobId所属 Job用于关联日志和监控。动态增加或删除节点的能力是这套模型的价值所在。加入一个节点后ZooKeeper 自动感知后续的任务拆分会按新的节点集合重新分配节点故障时已分配的 Task 会被重新调度到存活节点。我通常会建议运维团队把节点注册做成自动化脚本避免手动在管理页面上加减。3.3 原部署结构改造与多租户设计PPT 里专门对比了改造前后的结构差异。原批处理平台最大的问题有三个用户能查看和管理所有批处理安全风险批处理自动分配到所有服务器执行资源争用数据库访问由批处理程序自行设定安全风险。改造后的多租户设计有几个具体变化用户只能查看和管理自己的批处理用户的批处理自动分配到自己的服务器执行性能隔离用户仅能访问自己的数据库数据隔离。这个隔离不是简单地在数据库表上加一个 tenant_id 字段而是从资源调度到数据访问全链路隔离。租户路由的核心实现我会在数据源工厂里做一层按租户的映射public class TenantAwareDataSourceFactory { private MapString, DataSource tenantDataSources new ConcurrentHashMap(); public DataSource getDataSource(String tenantId) { return tenantDataSources.computeIfAbsent(tenantId, id - { // 每个租户独立数据库连接配置由批处理管理平台授权后自动创建 HikariConfig config new HikariConfig(); config.setJdbcUrl(buildJdbcUrl(id)); config.setUsername(getTenantDbUser(id)); config.setPassword(getTenantDbPassword(id)); config.setMaximumPoolSize(20); return new HikariDataSource(config); }); } private String buildJdbcUrl(String tenantId) { // 实际场景中租户 DB 地址从元数据表读取 return jdbc:oracle:thin://dbserver- tenantId :1521/ORCL; } }逻辑说明这里用 TenantId 做数据源缓存和路由的 key每个租户拿到的是完全独立的数据库连接配置。即使其中某个租户的批处理把连接池打满也不会影响其他租户的任务执行这就是 PPT 里说的数据隔离和性能隔离落地方式。安全隔离则通过授权机制实现租户的批处理 Job 只能在其被授权的服务器节点上运行节点和数据库的授权、回收都由专门的服务器管理功能负责走申请、审批、授权使用、授权回收的闭环流程。提示多租户隔离如果要做彻底虚机层面的隔离也要做。PPT 里的做法是按租户将计算节点分组租户的 Job 由调度器强制绑定到租户所属节点池这套逻辑要在任务分发层实现而不是依赖运维手工操作。3.4 动态分配VMware 接口自动创建虚机批处理马上提速动态分配是批处理平台 PaaS 化的核心亮点。原系统的资源分配方式是所有用户能使用的服务器预先安装配置好需要增加资源时走审批流程甚至采购流程整个周期按周计算。改造后的流程变成了计算资源不足时用户申请计算节点虚机管理员审批系统自动调用 VMware 接口按需创建虚机批处理管理员授权给用户用户的 Job 马上就能用上新节点。我整理了一份资源申请接口的伪代码可以直观看到这部分的自动化程度def provision_compute_node(tenant_id, node_typebatch-worker, cpu8, memory16): # 1. 校验租户配额防止无限申请 current_usage get_tenant_usage(tenant_id) quota get_tenant_quota(tenant_id) if current_usage 1 quota.max_nodes: reject_request(tenant_id, reason配额不足) return # 2. 调用 VMware API 创建虚拟机 vm_info vmware.create_vm(templatebatch-worker-template, cpucpu, memorymemory, datastoreselect_datastore(tenant_id)) # 3. 等待虚机启动并自动完成中间件安装和节点注册 wait_for_ready(vm_info.ip, timeout300) register_worker_to_zookeeper(tenant_id, vm_info.ip, batch-group- tenant_id) # 4. 通知批处理管理员授权 send_approval_request(tenant_idtenant_id, node_ipvm_info.ip)逻辑说明register_worker_to_zookeeper这一步是动态扩容的关键虚机创建完成后自动加入 ZooKeeper 的节点分组调度器立即感知该节点可用新提交的任务会被分配到新节点。授权环节仍然保留人工审批这是金融机构的安全底线。PPT 明确说了管理节点一般不是性能瓶颈动态分配 Oracle DB、Weblogic 尚未实现。也就是当前版本的动态分配只针对运算单元的服务器数据库和中间件的动态化还在路上这一条在项目验收时要想清楚范围。4. 常见问题排查批处理 PaaS 化改造中容易翻车的五个坑4.1 租户隔离只做了字段没做连接路由数据库全串了现象多租户改造上线后A 租户的批处理任务偶发读到 B 租户的数据。原因开发团队在任务和对象层面加了 tenant_id 字段但数据源是共用的Executor 没有从 TaskContext 获取租户标识去切换数据库连接。解决把数据源路由放到框架层统一处理Executor 的代码里永不允许自行创建数据库连接只能通过 SharedResourceHolder 按租户取。凡是绕过框架直连数据库的代码在代码评审阶段一票否决。从那以后我每次都强制检查一句话新增代码里有没有裸的 DriverManager.getConnection。4.2 动态申请虚机没设配额资源被单一租户占满现象无限额放开动态申请后某个租户提交了海量批处理把整个资源池占满其他租户任务全部排队等待。原因动态分配实现了自动化但缺少配额控制。PPT 里的审批流程只校验了「审批动作本身」没有做总量控制。解决给每个租户设置最大节点数和总计算资源配额在自动申请脚本里先做配额检查超限直接拒绝并告警。同时为不同租户的节点创建独立的资源池分组保证单个租户即使打满自己配额也不能影响其他租户。4.3 ZooKeeper 会话超时配置不当批量高峰时节点大面积抖动现象批处理高峰时段大量 Task 被重复调度任务执行时间不降反升。原因ZooKeeper 会话超时时间设置太短比如默认的 10 秒虚拟机的 GC 停顿或网络抖动就导致节点会话过期框架误判节点故障把正在执行的 Task 重新调度到其他节点引起重复计算。解决把会话超时时间调到 30 到 60 秒同时加上『会话即将过期』的监听器在真正过期前尝试续约。另外给 Executor 的任务处理加上幂等控制用 taskId 做去重这样即使发生极端的重复调度也不会产生重复的分红数据。这类问题在测试环境很难复现都是上了生产赶上高峰才暴露。4.4 遗留 JDK 1.4.2 程序迁到并行框架线程安全集体翻车现象老批处理程序迁到新平台后偶尔出现计算结果错乱没有异常日志极难定位。原因老程序是单线程模型用了大量 SimpleDateFormat、静态 Map 这类非线程安全对象拆成多 Task 并行执行后共享状态被并发写坏。解决迁移前先做一轮静态代码扫描重点排查静态可变对象、SimpleDateFormat、单例里的成员变量。处理方式是把这些对象改成局部变量或用 ThreadLocal 包装。这个坑在 PPT 里没有展开但任何一个做批处理并行的团队都会遇到迁移工作量往往比想象中大一倍。4.5 ZooKeeper 管理的协调节点变成隐晦的单点现象管理节点Distributor所在服务器宕机批处理平台整体不可用即使 ZooKeeper 集群完全正常。原因ZooKeeper 做了集群部署但任务分发逻辑只部署了一个实例没人想到分发模块本身也需要双活。解决把分发模块也做成多实例通过 ZooKeeper 选主主节点分发任务备节点实时同步状态主节点故障时秒级切换。这类问题表面上是架构问题实际上是团队对 PaaS 的「无单点故障」要求理解不透彻PPT 原文写的是无单点故障每一层都要过一遍这个检查。5. 方法论复制从 Batch PaaS 到 UM PaaS六个基础模块的落地路径5.1 UM PaaS 拆解用户管理不只是登录认证PPT 的第四部分实例是用户管理平台UM PaaS在保险 IT 场景里用户管理的复杂性被严重低估。这个系统不只是登录和会话管理它要支撑的是 2 万名总用户、10 万名销售人员、以及内外勤多套体系的账号、角色、权限、组织关系管理。UM PaaS 的隔离设计也复用了批处理平台的多租户模式每个租户有自己的一套用户体系租户管理员可以管理本租户内的用户、角色、权限分配框架层提供统一的认证入口和权限判定服务。对于保险公司来说渠道差异导致权限模型差异极大——个险渠道、银保渠道、经代渠道的销售基本法完全不同组织架构和权限模型必须可配置化。我理解的 UM PaaS 分层结构是底层是统一用户存储和认证引擎中间层是权限模型RBAC 加扩展的属性权限上层是按渠道配置的租户隔离策略。5.2 从 Batch 到 UM 的路径复现四步走也能用在其他模块Batch PaaS 的落地路径是四步识别能力边界、定义隔离模型、确定动态扩展机制、建设管理审批流程。这个方法论可以原样搬到 UM PaaS 上第一步识别能力边界。批处理的边界是「大批量数据计算」UM 的边界是「统一的用户、认证、权限」。边界以内的功能收归平台边界以外的留给业务系统。第二步定义隔离模型。批处理是数据隔离、性能隔离、安全隔离UM 是数据隔离租户用户数据独立、权限隔离租户管理员只能管本租户。第三步确定动态扩展机制。批处理是节点动态增减UM 是无状态认证服务加可水平扩展的会话存储。第四步建设管理审批流程。服务器管理、数据库授权在 UM 场景中对应租户接入审批、权限模板审批。复制路径时最忌讳的是把四步做成死流程——每个步骤都要回应该模块的独特性。UM 的独特性在于它处于所有系统的安全边界上所以认证安全策略密码策略、登录失败锁定、会话超时必须是平台级的默认能力。5.3 六个基础模块的推进节奏按依赖排序先做用户再逐步推开PPT 列出了用户、权限、批处理、报表、内容、日志、监控、事务管理这些基础模块目标是要实现六个基础模块的平台化。模块之间是有依赖关系的我的推进建议是第一优先级做 UM 所有系统都依赖第二优先级做日志和监控平台运行的基本可观测性第三优先级做报表和内容管理分布式事务管理可以穿插在业务改造过程中。每个模块的工期预估参考 Batch PaaS 的经验需求梳理和边界确认花一到两个月核心框架搭建两到三个月业务系统接入适配一两个月整体周期约半年。六个模块不可能并行推进——团队人数有限而且并行过深会带来协调成本爆炸。合理的节奏是两条线并行一条做 UM 加权限一条继续完善 Batch每三个月左右交付一个平台能力。外包开发的边界也要划清楚。PPT 提到了本地实施、外包开发、自主开发三种模式我的一般判断是核心框架和隔离模型必须自主开发这是平台的核心资产外围管理和审批界面可以外包IBM BPM、ODM 这类商业产品的实施必须由厂商或资深实施方完成内部团队承接配置和优化。6. 验证与复盘用三个指标确认改造真的达到了 PaaS 标准改造完成后光说「上线了」远远不够。我倾向于用三个指标做验收租户隔离能力、资源供给时效、故障恢复时长。租户隔离能力通过隔离性测试验证资源供给时效用扩容全流程耗时衡量故障恢复时长则看节点故障到任务重新调度的秒级数据。以扩容流程为例可以写一个简单的验收脚本#!/bin/bash # 验证从租户申请节点到任务使用新节点的全流程耗时 start_time$(date %s) # 1. 租户发起计算节点申请模拟调用 curl -X POST http://batch-management/api/tenant/node-apply \ -H Content-Type: application/json \ -d {tenantId: demo-tenant, nodeType: batch-worker, cpu: 4, memory: 8} sleep 5 # 等待管理员审批可配置开关生产建议保留人工审批 # 2. 查询节点注册状态 node_status$(curl -s http://batch-management/api/node/status?tenantIddemo-tenant) while [[ $node_status ! *READY* ]]; do sleep 5 node_status$(curl -s http://batch-management/api/node/status?tenantIddemo-tenant) done end_time$(date %s) echo 节点从申请到就绪总耗时: $((end_time - start_time)) 秒这个脚本的验证逻辑全流程自动化的目标是把节点交付从原来的以天为单位压缩到分钟级甚至秒级。如果验收时发现流程超过 30 分钟就要排查卡在哪个环节——通常是审批流程或中间件安装脚本有问题。故障转移的复盘方法也一样手动 kill 掉一个 worker 节点上的执行进程然后观察任务是否在预期时间内被重新调度到存活节点。你会立刻发现很多问题——比如「任务重复执行了」「断点没有续跑」「另一个节点负载瞬间飙高」。这些观察结果才是架构改进的真正输入。从这套项目里我最大的教训是PaaS 化改造最容易失败的环节不在技术实现而在范围蔓延——今天要加一个模块明天要兼容一种新场景最终平台变成了一个什么都有但什么都不稳定的巨型系统。所以从那以后每次启动新的 PaaS 化改造我都强制列出「这个版本坚决不做的事」把它贴在需求评审的第一页。平台就得有边界边界守住了上面那些模块才能一个一个稳当地长出来。希望这些经验对正在做同类改造的你能有些参考价值。本文还有配套的精品资源点击获取
返回列表