如何应对系统热点的挑战

简介: 如何应对系统热点的挑战

背景

假设单个有状态实例支撑 1 W QPS,如果有 500 个实例,你可能会期望它们能够支撑 500 * 1W = 500W QPS 的流量。然而,实际情况可能会更为复杂。在实际系统中,添加多个实例并不总是线性地提高性能。

数据通常按照键进行分片。当你将数据分布在多个实例上时,不同的键可能被映射到不同的实例。如果你的访问模式导致某些键频繁被访问,而其他键很少被访问,那么可能会导致某些实例负载过高,而其他实例相对空闲。例如,如果某些热点键(hot keys)集中在同一实例,该实例可能会成为瓶颈。最终超过系统的承载能力,导致系统崩溃或性能下降。

处理热点数据是分布式系统中的常见挑战之一,如果预先知道某些键可能成为热点,可以将这些键手动分片到不同的实例。这样可以避免多个热点集中在同一个实例,实现负载均衡。

当然,也有一些通用的解决方案,包括:

  1. 缓存:将热点缓存到无状态服务中,减轻对热点集中的实例负载,提高系统性能。
  2. 动态分片:根据实时的负载情况,采用动态分片策略。如果某个键的访问频率增加,可以将其重新分片到其他实例,以实现负载均衡。
  3. 数据复制:特别重要的热点,可以将其复制到多个实例,将负载分散到多个实例。

此三者的第一步是一致的,首先要识别哪些数据是热点。

哈希表

如果你希望知道系统中哪些数据是频繁访问的,哈希表是一种有效的数据结构。你可以使用数据作为键,将访问次数作为值存储在哈希表中。每次访问数据项时,增加对应键的值。通过统计访问次数,你可以识别出热点数据。

当系统中的数据量很大时,哈希表的内存占用可能会成为一个问题。如果数据集非常庞大,可能需要考虑使用分布式存储或其他高效的数据结构来处理统计信息。

LRU

数据集庞大的场景,另外一个容易想到替代哈希表的选择是 LRU 缓存算法。

首先,LRU 算法因为是基于访问时间的顺序来进行缓存数据的淘汰,会相对较少淘汰热点数据,从而一定程度上减轻了 Hotkey 的影响。它没有识别出有效的热点数据,因此无法有效将热点数据均匀分散到多个实例。

其次,在缓存大小一定的前提下,LRU 算法的效果受数据集大小的影响。访问的数据集越大,效果越差。

最后,在极端要求的场景下,未优化的引入 LRU 会潜在带来延迟和性能方面的影响。

  • 内存释放顺序导致的延迟增加

LRU 前:

请求到达——分配内存——返回结果——释放内存

LRU 后:

请求到达——分配内存——【缓存结果/淘汰内存】——返回结果

  • 离散读写导致的锁冲突。

即使利用分片降低锁粒度,相比批量定时更新缓存,离线读写导致的锁冲突的概率仍然跟读写请求量正相关。当离散的将数据加入缓存,写入线程持有写锁时,其他线程无法获取读锁或者写锁,需要等待写锁释放,导致线程阻塞和上下文切换。

Heavy hitter

在大数据处理中,此类问题称之为:”Heavy hitter problem(Top K problem)”。类似的问题还有。在网络流量分析中,找出最常见的IP地址或协议可以帮助我们识别潜在的攻击或瓶颈。在广告领域,识别最热门的广告内容可以帮助优化广告投放和资源分配。

常见的解决 “heavy hitter” 问题的算法包括:

  • Misra-Gries:实现较为简单,节省空间,但精度稍低。
  • Count-Min Sketch(CMS):团队同事力推的一个算法, CDN 识别热点,主动下推。但。采用类似 Bloom filter 的思想,牺牲了一定的准确度。见于缓存组件: Caffeineristretto
  • Space-saving(SS):精度高,复杂度也更高一些。

三个算法的 Golang 版本实现 对比来看:CMS 算法使用哈希算法,如果数据不够离散,准确度下降的厉害(CDN 场景哈希文件名是由 MD5 生成,自然不成问题);SS 算法相对来说更为稳定,虽然性能稍差,但可通过采样降低数据处理的量来降低性能的损耗。

本文作者 : cyningsun

本文地址https://www.cyningsun.com/06-13-2023/heavy-hitter.html

版权声明 :本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 CN 许可协议。转载请注明出处!

# 缓存

  1. 缓存(4) —— 结构化缓存
  2. 缓存(3) —— 一致性
  3. 缓存(2) —— 命中率
  4. 缓存(1) —— 总述:分级存储
目录
相关文章
|
30天前
|
安全 物联网 5G
5G技术对软件开发的影响及应对策略
【10月更文挑战第11天】5G技术的商用化正迅速推进,其高速度、低延迟和高可靠性将深刻影响软件开发。本文探讨了5G技术的特点及其对移动应用、物联网、后端服务和安全性的具体影响,并提出了开发者应采取的优化策略,包括提升移动应用体验、扩展物联网应用、强化后端服务和加强安全性。通过这些策略,开发者可以充分利用5G技术,为用户提供更好的服务。
|
3月前
|
SQL 安全 网络安全
网络安全的现代挑战与应对策略
【8月更文挑战第29天】在数字化时代,网络安全已成为保护个人隐私、企业数据和国家安全的关键。本文将深入探讨网络安全漏洞的成因,加密技术的应用,以及提升安全意识的重要性。通过分析网络攻击的常见手段,我们将揭示如何通过教育和正确的工具来防范风险,确保信息安全。
|
3月前
|
存储 缓存 负载均衡
高并发系统架构的设计挑战与应对策略
【8月更文挑战第18天】高并发系统架构设计是一项复杂而重要的任务。面对性能瓶颈、稳定性与可靠性、并发控制和可扩展性等挑战,开发人员需要采取一系列有效的策略和技术手段来应对。通过负载均衡、缓存技术、数据库优化、异步处理、并发控制、弹性设计及监控与调优等手段,可以设计出高性能、高可用和高可扩展性的高并发系统架构,为用户提供优质的服务体验。
|
6月前
|
自然语言处理 监控 安全
如何应对大模型带来的安全性挑战
如何应对大模型带来的安全性挑战
113 1
如何应对大模型带来的安全性挑战
|
6月前
|
存储 缓存 人工智能
未来发展趋势下的后端技术挑战与应对策略
21世纪是信息化快速发展的时代,后端技术作为支撑整个系统架构的重要组成部分,面临着诸多挑战和机遇。本文将探讨未来发展趋势下后端技术的挑战,并提出相应的应对策略,旨在引领读者深入思考如何更好地应对技术发展带来的变革。
91 1
|
6月前
|
安全 Cloud Native 大数据
未来发展趋势下的后端技术挑战与应对
【2月更文挑战第5天】随着科技的不断进步,后端开发在未来将面临更多挑战与机遇。本文将探讨未来发展趋势下后端技术的变化与应对策略,为广大开发者提供思路与启示。
92 4
|
消息中间件 存储 负载均衡
如何应对三高系统
如何应对三高系统
|
程序员 API
应对变化
之前对SOLID做了一个总结 《SOLID》总结[1] 这些原则是前辈们经过无数实践提炼出来的,百炼成刚,那是不是成了放之四海皆准的道理呢?某种程度上讲,还真就是准的,常被人耳提面命写的代码要遵守这些原则,想想code review时,是不是代码常常对比这些原则,被人指出没有遵循哪个原则 总结篇中画了这幅图,SOLID也的确是我们达到高内聚低耦合很重要的手段
238 0
应对变化
网络舆情应对策略建议
在舆情应对工作过程中,或多或少地会暴露出一些不足和存在的问题,那么针对这些问题应该如何解决呢?下面小编为大家整理了一些舆情策略建议,可供参考。
|
自然语言处理 数据可视化 算法
大数据可视化技术面临的挑战及应对措施
本文从大数据本身的特点及其应用需求出发,结合数据可视化的研究现状,介绍了适用于大数据的数据可视化技术;分析在大数据条件下数据可视化所要解决的8个关键问题;讨论了针对大数据可视化应用需求自主研发的交互式可视化设计平台AutoVis及其应用。