编程思想之分片
分片
定义
“分片”本质上是一种把大数据、大任务拆成小块并行或分布式处理的策略。分片后的“片”,可以在同一个系统中分别处理,也可以丢给不同机器执行,从而增强系统的效率和可维护性。
原则
- 关注单一职责:每个“片”只负责一小部分内容。
- 增强可并发性:每片可以单独运行,利于并行处理。
- 提高扩展性:将来想扩展或优化,只需修改部分片。
- 错误隔离:某片出错不影响整体
注意事项
- 分片粒度控制:
- 片太小 → 任务切换开销大;
- 片太大 → 并行度低,性能没提升。
- 一致性问题:
- 多片操作可能带来数据不一致风险,需设计好事务/锁机制。
- 路由策略:
- 通过代理和,集成hash取模、范围划分、标签划分等策略实现路由机制。
- 合并结果:
- 分片执行完后,可能考虑结果整合(数据统计)。
实例
-
数据库分片(水平分库分表)
- 场景:用户数据太多,单库扛不住。
- 做法:按用户ID对10取模,把数据分到10个数据库中。
-
负载均衡中的任务分片
- 请求被分发到多个服务器(节点)上,其实就是对处理能力的分片。
-
分布式缓存
- Redis 的分片集群把键值对按哈希槽分片,每个节点负责一部分哈希槽,读写数据时key经过CRC16校验后,对哈希槽数量进行一个取模运算(保证不超过哈希槽总量),根据结果分配到对应的节点中。
-
前端分页显示(逻辑分片)
- 用户数据列表一次性加载10000条不现实,前端分页就是分片的一种,按页分批请求。
-
MapReduce:任务分片
-
Map 阶段将数据分片并并行处理;
-
Reduce 阶段汇总处理后的结果。
-
-
多线程文件下载
- 把大文件按 byte 分片,每个线程下载一段,再合并。
-
CDN 内容分片传输
- 大视频文件会被分成多个小片段传输(HLS、DASH等),并存在不同CDN节点中。
-
大型游戏服务器架构
- 游戏地图被划分为多个区域(shard/zone),每个区域由不同服务器承载,玩家的行为只影响其所在分片。
-
爬虫中的任务分片
- 一台机器爬不完,就给多个爬虫分发不同的URL段。
优势
-
高性能:分片可并行处理,速度更快。
-
可扩展:需要更多资源?加节点即可。
-
容错性强:一个分片挂了,其它还能顶上。
-
内存/存储均衡:避免单点瓶颈。
潜在问题
- 分片路由逻辑复杂。
- 数据分布不均会造成“热片”(某些分片可能会因为存储或处理过多的数据请求而变得过载)。
- 跨片进行JOIN操作很麻烦。
- 分片规则的选择(时间 、ID),业务需求的变化可能会使最初的分片策略不再适用。