当前位置:网站首页>【翻译】关于扩容一个百万级别用户系统的六个课程
【翻译】关于扩容一个百万级别用户系统的六个课程
2022-08-03 15:58:00 【sean.liu】
翻译自: Six Lessons Learned The Hard Way About Scaling A Million User System
每个人都会到一个点,那时,你觉得你学习的东西足够去分享你的经验,并希望帮助那些和你走相似的路的人?这就是为什么 Martin Kleppmann精心编写了 Six things I wish we had known about scaling,一个值得你花费时间的文章。
这不是一个扩展Twitter的建议,而是构架一个百万级用户系统,这是一个大量项目中的甜点。它的结论听起来像是真的。
建立一个可伸缩系统并不总是有趣的,这是大量的管道和多如牛毛的细节。很多黑客工具必然存在了很久,但是很多开源解决方案太糟糕了(你的最终也失败了,但是它至少能解决你的问题)。
这是一个注释,关于六个课程(附带赠送一个)
- 实际负载测试是困难的。测试一个大型分布式系统并不像一个科学实验,它能在理想的条件下进行。这是一个很难接受的科学思想。了解实际访问模式是很困难的。测试所需的合成数据集合大于你需要的,这是很困难的。对比新的和老的系统的正确性是艰难的。所以随时准备滚回,如果新的代码在实践中不工作。
- 数据演变是困难的。你的数据到处都是,在你的数据库,日志,以及二进制数据块。随着它们改变更新数据格式是一个巨大的时间开销。大公司往往在自动化以及编排流程上更有优势。
- 数据库连接是一个真正的限制。数据库链接增长令人惊讶,它几乎随着系统在服务和节点的数量一起。每个链接吃掉的资源包括你的机器以及你的开发人员,因他他们必须找出如何他们的方法。是用链接池,或者写一个数据存取层包装数据库,通过后面的一个API。
- 阅读副本是一个痛苦的操作。阅读副本,从主分支卸载数据库入口是一个常见的扩展策略。它还需要很多工作去设置以及维护这些系统。故障处理是一个常有的问题来源。
- 考虑内存效率。延迟的峰值往往是由内存引起的。有效的使用内存是困难的,因为很难找出内存是如何被使用的。很多性能问题通过购买更多的内存来解决。有可能的话在内存中建立合式的索引,使用hash索引,而不是采用字符串本身。
- 改变的捕捉是被低估的。像系统中的数据改变,它必然伴随着很多服务,像数据库,搜索索引,图表,索引,读取副本,缓存失效等。你可以使用应用程序写入到多个位置,当更新时,但是这个从来都没有付诸实践。你可以让应用读取数据库日志,但是这不可能实现在所有的系统上。一个好的方案是使用变化捕捉系统,接受并存储所有的数据,写入数据库。应用程序可以实时接收这些更新,随着历史的变化流淌。这个变化捕捉系统成为所有应用程序的数据正确性的单一来源。一个大的优势关于这个途径就是数据的产生和消费是分离的,它提供了“你可以自由的实验,而不担心拖累主站”的承诺。
- 缓存和缓存失效。这是一个额外课程来自mysteriousllama对这篇文章的一个评论,没有适当的缓存以及好的缓存失效的策略 ,你的数据库会崩溃。使用redis和memcache去缓存一切可能。不要经常链接数据库除非你必须这样。确保你可以轻松的使任何缓存条目失效,并且保持原子性,因此你不能在竞争条件下运行。使用锁来确保当缓存到期,数据库不会因为多个相同的查询拷贝而得到大量的dog-pile。你需要考虑查询还存,在你的数据库中选择可能依然有效的。但是请相信我,这并不是结束。你还是可以缓存高水平对象,而不仅仅是简单的查询。 根据你的可靠性要求,你甚至可以考虑处理你的缓存,作为回显,以及在后台进行数据库的批量写入。这些通常会比因各种因素产生的个别写入要高效得多。我工作在诺干排名前200的站点,这一直是首选的扩展策略。数据库的麻烦-避免查询它们。
边栏推荐
- [Unity Getting Started Plan] Basic Concepts (8) - Tile Map TileMap 02
- [QT] Qt project demo: data is displayed on the ui interface, double-click the mouse to display specific information in a pop-up window
- js中的基础知识点 —— 事件
- 出海季,互联网出海锦囊之本地化
- 泰山OFFICE技术讲座:段落边框的绘制难点在哪里?
- 泰山OFFICE技术讲座:文字边框高度研究
- Not to be ignored!Features and advantages of outdoor LED display
- 2021年数据泄露成本报告解读
- 人脸识别损失函数的汇总 | Pytorch版本实现
- 使用Make/CMake编译ARM裸机程序(基于HT32F52352 Cortex-M0+)
猜你喜欢
Analysis of ffplay video playback principle
瞌睡检测系统介绍
带你了解什么是 Web3.0
语音识别新一轮竞争打响,自然对话会是下一个制高点吗?
【Unity入门计划】基本概念(8)-瓦片地图 TileMap 01
leetcode:899. 有序队列【思维题】
Optimal Power Flow (OPF) for High Voltage Direct Current (HVDC) (Matlab code implementation)
如何启动 NFT 集合
To participate in sweepstakes, incoming new programmers magazine welfare!
想进阿里?先来搞懂一下分布式事务
随机推荐
一文看懂推荐系统:概要02:推荐系统的链路,从召回粗排,到精排,到重排,最终推荐展示给用户
如何分析周活跃率?
简易网络传输方法
Spark entry learning-2
我在滴滴做开源
CopyOnWriteArrayList details
Why do I strongly recommend using smart async?
证实了,百度没有快照了
攻防世界----bug
MATLAB gcf图窗保存图像,黑色背景/透明背景
如何启动 NFT 集合
AI也有健忘症?英国41岁教授专访:解决灾难性遗忘
移动应用出海,你的“网络优化”拖后腿了吗?
devops-2:Jenkins的使用及Pipeline语法讲解
JS basics--judgment
基于牛顿方法在直流微电网潮流研究(Matlab代码实现)
Difference and performance comparison between HAL and LL library of STM32
leetcode:899. 有序队列【思维题】
基于DMS的数仓智能运维服务,知多少?
I am doing open source in Didi