暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

鲸品堂|降低系统对数据库的依赖,工单系统异步持久化了解一下

浩鲸科技 2021-12-06
64

01.

背景


BOSS域的系统中,涉及多个工调度类的系统,如:开、编排、调度、保障、控制等等。这些工单类系统核心在于工单调度的效率与稳定性,因此如何提高系统性能最大程度的提升系统吞吐量是产品研发技术层面的重中之重。此类系统具备以下特点:数据存在明确的生命周期,每个环节的事务均由查询->计算->写入组成。


在经过多轮的优化后,采用缓存技术提升查询性能,采用数据库分库的方式提升写入性能。但数据库写入操作仍然是较为明显的性能瓶颈。如何进一步降低数据库阻塞对系统性能的影响成为工单系统首先考虑的内容,通过异步写入数据库的方式可以有效的降低对数据库的写入效率的依赖,进一步提升系统性能。


02.

异步持久化


数据架构


工单系统中,保存的数据主要包括业务规格数据、单工单数据以及系统间交互报文附件等信息。需要注意的是,在此类系统中所有的过程实例数据均是以定单为单位存在的,其数据的生命周期依赖于定单的生命周期。下图为工单系统常见的数据架构:

数据库分层

关系数据库:用于持久化存储所有关系型数据

系统配置数据:主要包括数据字典、人员权限等,在数据库中使用单片表存储。在应用启动时批量加载到JVM本地缓存中。


业务规格数据:主要包括产品模型、定单规则、工单规则、模板等,在数据库由于与实例表存在关联关系,因此使用全局表存储。在应用启动时批量加载到JVM本地缓存中。


过程实例数据:主要包括定单、工单等相关信息,在数据库中分为在途库与历史库。在途库:以定单为单位,按定单标识散列分片;历史库:按月分+区域进行分片。


查询库:工单系统需要使用定单监控、工单监控、待办任务等列表查询,使用关系型数据库查询时难以避免跨库的情况,因此使用ES实现查询库解决多纬度列表查询问题。利用Otter等数据同步组件,采用侦听Mysql binlog的方式实现数据准实时同步。


文件系统:存储系统间交互报文、附件等。


全局序列:用于提供序列服务。


异步持久化框架


异步持久化的目标尽量降低系统是对于数据库相关的操作依赖,使查询与写入不会因为数据库的阻塞而降低性能。具体处理过程如下图所示:
异步持久化

在传统模式下,业务模块接收到请求后开始事务,依次执行多个业务逻辑方法,在每个方法内进行查询、计算最后操作数据库进行持久化操作。然后进入下一方法,最终提交事务,完成整个业务逻辑的处理。在此过程中,无论查询还是持久化都会操作数据库,因此系统性能主要受数据库影响。

异步持久化模式下,每个业务逻辑方法无论是查询还是写入均不依赖于数据库。

查询:使用本地缓存与分布式缓存相结合的方式,提升查询效率

配置数据,通过JVM本地缓存查询,如果数据不存在再通过数据库查询。


实例数据,通过分布式缓存查询,如果数据不存在再通过数据库查询。


持久化:通过队列实现异步

在业务逻辑请求写入数据时,异步持久化框架只将数据写入当前线程的缓冲存,并不真正操作数据库。


提交事务时,框架负责将数据分别写入分布式缓存供下游模块使用,再写入队列。


持久化进程侦听消息队列,真正完成数据写入。


分片计算


在工单系统中,所有过程数据均依赖于定单存在,因此在进行数据库分片时通常采用以定单为单位,按区域或散列进行分片。考虑到工单系统最常用的查询场景是根据定单标识或工单标识查询,所以在定单及工单标识中包含分片信息或可以直接通过标识计算出分片信息是最高效的算法,在OSS的工单系统中采用的是将分片信息包含在定单与工单标识中(即:定单标识=${序列}+${分片标识}),目的是使数据库扩容时可不迁移数据,具体在后续章节详细说明。

综上所述,在系统中分片计算主要考虑两个场景,即生成定单以及根据定单生成其它信息。具体过程如下:

生成定单:

获取定单序列,记为 ${定单序列}


根据分片数量计算分片标识,分片标识(4位) =  ${定单序列} mod ${分片数量}


定单标识 = ${定单序列} + 分片标识


根据定单生成其它信息:

获取工单序列,记为 ${工单序列}


通过定单获取分片标识,分片标识 = ${定单标识}后4位


工单标识 = ${工单序列} + 分片标识


低代码入侵


在早期异步持久化框架中,开发人员在进行业务逻辑开发时,需要在业务代码中将写入数据库的数据先放入分布式缓存,再写入消息队列,接着需要完成队列消息处理的JDBC代码编写。增加了较多的代码量,同时代码不容易阅读,对后续维护造成不利影响。

在配合OSS3.0编排中心研发过程中,异步持久化框架通过实现JPA规范,利用Spring Data Jpa 定义并实现各 Repository 。从而使业务逻辑代码开发过程中,只需要进行JPA注释,框架负责实现缓冲区,并侦听事务提交。当事务提交时由框架代码负责自动进行缓存更新、队列投放以及队列消息处理时的数据库操作。大大降低了异步持久化开发难度,同时可在必要场景下切换回同步处理。

事务控制


OSS域的工单系统,包括开通、激活、保障、调度、编排、控制等,主要用于支撑运营商的开通线与保障线业务。在确保业务正常开通及保障的情况下,对性能及系统可用性的要求远大于对数据一致性的要求,因此系统在事务控制方面目标是实现最终一致性。

场景说明

工单系统异步持久化过程中,涉及两类事务改造。一类是原有长事务拆分,另一类是数据库及缓存操作的事务控制。


长事务拆分:在单体应用改造为微服务架构时,一般将会按业务能力将应用拆分为多个微服务,以开通系统举例主要分为定单工单、接口、流程微服务。最典型场景为定单入库与回单场景,如下图所示为定单接收入库场景。在过程中涉及多个微服务的同步调用,很容易对系统稳定性造成不良影响。因此采用消息驱动的方式对事务进行拆分。



数据库及缓存操作:数据库及缓存操作,指通过上述消息驱动完成拆分的各业务单元内部多次操作数据库与缓存。系统需要对当前过程做严格的事务控制。


消息补偿与去重

所有通过队列实现异步操作场景,需要利用消息补偿与去重的方式,实现最终一致性。具体方法为:


每条消息需要有一个唯一标识


写入队列的同时,记录消息日志,此消息日志为可解析的文本文件


消费时需要在缓存中记录消费记录


消费时需要在缓存中进行记录比对,以确认是否已经进行消费去重


对于消息日志,需要定时进行比对稽核补偿


缓冲区

在业务逻辑处理中,往往需要多次操作数据库与缓存。在改造为异步持久化时,如果将数据库操作分为多个消息发送会存在部分失败的可能。因此需要利用缓存区合并多次数据库操作为一个消息,进行一次发送实现原子性操作。另外,针对分布式缓存,如果涉及多个操作需要启动Redis事务进行控制。

顺序控制

数据的变更操作包括增、删、改。其中修改的操作涉及到顺序的控制,因为在业务处理过程中,普遍存在对同一数据反复更新的操作,当通过队列实现异步化后,如果不控制消息顺序将影响最终一致性,导致数据最终结果错误。常用的顺序控制方案如下:

利用队列的顺序消息,实现顺序控制。由于对性能影响较大,因此并未采用。


将存在更新要求的库表增加变更记录表,因此可以将更新操作改为新增操作,实现最终一致性。具备高性能高扩展性的优点,但增加了代码复杂度(尤其是查询)。目前主要应用于对性能与扩展性要求较高的场景,如移动业务与停复机业务支撑。


消息分发时指定队列,使同一定单的信息在同一线程中进行处理。优点是性能较高代码量代,缺点为扩容时需要变更分布配置。目前主要用于固网业务支撑中。


数据查询


为了提高查询效果,工单系统利用多级缓存与查询库的方式实现在不同场景下的效率提升。


查询配置数据:通过JVM本地缓存查询,本地缓存无法查询时,查询数据库。


根据标识查询定单数据:根据定单标识查询定单、工单标识查询工单等,通过分布式缓存查询。缓存查询不到时查询数据库。此时根据分片算法中,根据标识的后4位为分片标识,直接路由到相应分片查询。


多纬度查询:通过利用搜索引擎实现的查询完成。


数据库扩容


在进行数据库分片时,通常采用利用较大的数量进行分桶再使多个分片ID落入同一数据库的方式,如按1024进行取模,0至511落入DB1中,512至1023落入DB2。然后在数据扩容时增加分片,如将256至511迁移到DB3。此种方式在扩容时,需要进行数据迁移,而数据迁移是成本与风险都较高的动作。考虑到工单系统主要是以定单工单为主的过程数据,此类数据具有生命周期较短的特点。因此仅需要保证在途数据在原数据库分片上流转,同时新定单数据可落入全部数据库分片的方式,即可使数据库扩容时无需迁移。具体如下图所示:
分片算法:
生成定单时,用分片数量对序列进行取模,作为分片标识,然后分片标识作为定单标识的后4位。在写入其它数据时,分片标识与定单的标识保持一致。


扩容前:

写入数据,定单以2取模,其它数据直接取定单分片标识;


查询数据,取标识的后4位作为分片标识路由到数据库分片。


扩容后:

在途定单新生成数据时,直接所定定单标识的后4位作为分片标识。因此原在途定单在哪个分片,其生成的后续数据都在哪个分片;


新生成定单时,以分片数量4进行取模,平均分配到4个数据库分片中;


数据查询时,无论在途单还是新定单,都可以从标识取后4位进行路由。


03.

实践与收益


目前OSS工单产品,以编排中心、服务开通、激活为代表全面实现异步持久化。极大的降低了系统对于数据库的依赖,在同等硬件条件下性能提升20倍以上。各省项目定单处理能力由原来以几百每分钟,提升到几千每分钟

文章转载自浩鲸科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论