news 2026/7/10 15:44:01

大数据量数据传输与部分字段逻辑操作修改的高效实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大数据量数据传输与部分字段逻辑操作修改的高效实现

需求

现在有一些表,部分字段存在加密信息,需要解密后存到另一个数据库。

存在一些数据量超大的单表,服务器配置有限无法一次性加载进内存。

解密后的表被下游使用,解密效率上有要求。

加密的表数量可能增加,加密字段也可能增加,开发完后可手动维护一张配置表,自动解密配置的加密表和对应表字段。

实现目标

大数据量情况下服务使用正常

最大化利用资源提升解密速度

自动适配多表(无需根据数据源表结构变化进行额外编码开发)

问题拆解

先从资源利用出手

很明显,一条数据经过服务的生命周期分为三个耗时阶段(数据加载,数据解密,数据写出)

从单线程出发,一个线程加载数据时无法对其它已加载的数据进行解密,同理线程在数据解密时无法将已解密的数据写出。于是采用经典的生产-消费模型,将三个耗时阶段分为三个线程组模块,各个模块的线程处理完自己的任务直接向下游抛出,线程组模块之间通过java内置的线程安全的阻塞队列进行数据交互(阻塞队列是分段锁设计,模块之间的交互依旧是并行的)。

接下来看单表超大数据量会造成什么情况(全量加载进内存会导致内存溢出的那种),假设数据加载线程组模块各自线程分配的任务单位是表,总会有线程拿到单表超大数据量的任务导致服务的直接崩溃,所以数据加载的任务单位应该是表分片,但是配置的表需求方无法提供主键,根据什么分片?postgre数据库有内置字段ctid,在离线场景数据不变化情况下每条数据都有唯一的ctid且恰好数据在块上分布均匀,所以可以根据ctid进行分片而且是从连续的磁盘地址上拿到数据。

看似资源利用和内存溢出情况已经解决了,实际上内置的阻塞队列默认是无界的,也就是说三个线程组模块如果处理速率差异较大就会导致处理速度慢的模块和上级模块之间的阻塞队列超过服务器内存配置使服务崩溃,好在内置的阻塞队列有最大容量限制可以很好的避免此类问题。但是为了提高线程的使用率,需要调整线程组模块参数给耗时模块更多的线程,直到遇到服务器瓶颈(理想情况是服务器带宽打满,且有剩余内存、cpu资源)。

至于适配多表,解决方式就比较好处理了,通过jdbc拉取数据的时候,字段元数据与存储的业务数据索引是一致的,一行数据直接封装成一个map在线程组之间流转就好了,在需要解密的字段也只需要O1时间复杂度的get操作解密放回去就行了。至于java的内存回收机制,生产消费模式频繁的对象创建销毁,通过Object Pool技术,数据加载阶段的数据载体从pool中获取,数据写出阶段的销毁可以替换为pool回收,内存回收的开销基本就可以忽略了。

基础结构

扩展

表分片的几种方式

1.Postgre数据库天然有内置字段ctid,结构为(块号, 元组索引) (0,1)

第一个值(block_number):数据所在的数据块编号(PostgreSQL 中数据按固定大小的块存储,默认块大小为 8KB)。块号从 0 开始,按物理顺序递增。

第二个值(tuple_index):数据块内的元组索引(即行在块内的位置)。每个数据块可以存储多个行(元组),索引从 1 开始。

2.row_number()

3.主键分片

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 15:41:25

嵌入式新人怎么读懂一个完整固件项目?

tags: 嵌入式,固件,ARM,单片机,新手入门,代码阅读 category: 嵌入式 type: original series: learning-method 嵌入式新人怎么读懂一个完整固件项目?一句话: 拿到一个上万行的固件项目不要从目录结构开始读。跟着 CPU 上电的执行顺序走——从 main() 的第一个函数调…

作者头像 李华
网站建设 2026/7/10 15:40:57

FFXIV TexTools:终极FF14模组管理框架,让游戏个性化变得简单

FFXIV TexTools:终极FF14模组管理框架,让游戏个性化变得简单 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI FFXIV TexTools是一款专业的《最终幻想14》模组管理框架,它为玩家提…

作者头像 李华
网站建设 2026/7/10 15:39:05

sVim vs cVim:浏览器Vim扩展终极对比,谁才是效率之王?

sVim vs cVim:浏览器Vim扩展终极对比,谁才是效率之王? 【免费下载链接】sVim Safari extension with shortcuts similar to Vim 项目地址: https://gitcode.com/gh_mirrors/sv/sVim 在现代浏览器操作中,效率工具的选择直接…

作者头像 李华
网站建设 2026/7/10 15:36:46

终极GitHub资源下载指南:三步实现精准文件打包下载

终极GitHub资源下载指南:三步实现精准文件打包下载 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 你是否曾为下载GitHub上的单个文件夹而烦恼?面对庞大的开源项目,你只需要…

作者头像 李华