Golang中带切片的并发Map数据合并问题及优化方案咨询
并发数据合并的同步问题及方案探讨
问题背景
负责该领域的开发人员离职数月后,我一直在梳理一个并发问题,但始终找不到合适的解决办法。
我们将客户数据加载为如下结构:[Key] -> {Value}[客户专属哈希] -> {数据点/文件切片}
示例结构:
[a60d849ad97bfb833e1096941] -> { { StartDate: '01-02-2022', EndDate: '28-02-2022', DataFrames: [1598,921578,12981,21749,192578...]}, { StartDate: '01-03-2022', EndDate: '28-03-2022', DataFrames: [1234,1567,6781,126978...]}, }
我们服务数十万客户,每天夜间会启动一个流程,基于每个客户的哈希(或称桶)合并其数据。在处理DataFrame前,需要遍历切片将多个DataFrame合并为一个大的DataFrame,这一过程涉及诸多法律与会计规则。
为了尽可能快地完成所有数据点的索引,该流程运行在goroutine中。
当前实现本质上是一个sync.Map[string, []DataFrame],但我发现:虽然Map本身的操作是受保护的,但向DataFrame切片追加数据的操作并未受保护。每个哈希每晚可能会有20-30个文件引用被加入切片。过去两年的客户数据很可能因此存在合并错误,我的任务就是修复这个问题。在使用sync.Map之前,团队曾使用带RWMutex的Map,但同样未对切片操作做保护。
疑问与尝试
- 存储切片的Map是否是合适的数据结构?
- 我尝试过创建基于RWMutex的切片处理逻辑,但又想知道:是否可以让Map存储
chan DataFrame,在索引客户文件时将数据发送到通道中,之后在合并步骤中通过len(chanx)确定数据量并转换为数组?
注:我主要来自Java背景,可能存在术语混淆,敬请谅解。
内容的提问来源于stack exchange,提问作者Alicia Wentworth
相关产品推荐
相关产品推荐

