亮网络解锁器,解锁网络数据的无限可能 了解详情
写点什么

提升可伸缩性的八项最佳实践

  • 2009-05-19
  • 本文字数:925 字

    阅读完需:约 3 分钟

Wille Faler 提出了八项提升系统可伸缩性和性能的最佳实践,其中包括减少数据库操作、使用缓存、减少网络通信等实践。

1. 减少数据库操作 - 尽可能远离数据库。如无必要,就不要打开数据库连接或者启动事务。

2. 缓存带来的显著变化 - 缓存能极大地减低数据库的负担,特别是当系统通过只读方式访问数据库的时候。内存缓存优于磁盘缓存,而磁盘缓存又优于远程缓存和关系型数据库。

3. 尽可能缓存粗粒度对象 - 缓存粗粒度对象“可以省去遍历 n 个缓存单元的 CPU 开销和时间。而且,获得完整的对象关系图也省去了对象关系图的装配时间。”

4. 不要永久性保存瞬态信息 - 避免在数据库里面存储瞬态数据,比如登录的会话信息。

“状态怪物”是一只非常危险的怪兽。根据一般的规律,在持久性存储设施(数据库、磁盘等)里面只需要保存真实的、必要的、关键的,以及需要备录的业务数据,其他的都不在此列。

5. 位置、位置 - 把东西放在靠近需要使用它们的地方。相对于负载均衡器、Web 服务器、应用服务器和数据库多个环节,直接经过负载均衡器和 Web 服务器从 CDN 获取数据要快一些,开销也更小。

6. 约束对有限资源的并发访问 - 如果多个请求需要访问同样的资源,执行同样的计算,最好是只处理首个请求,让其他的请求等待计算完成后直接使用最终结果。让所有的线程去访问同一个资源只会减缓处理的速度。

7. 分阶段地、异步地处理

根据处理过程的异步性,把该过程分散成单独的步骤,通过队列来隔离;每个步骤使用有限数量的工人线程进行处理:这样经常会给可伸缩性和性能同时带来奇迹般的变化。

8. 使网络延迟最小 - 尽可能使应用系统不去做远程访问,因为网络通信要明显慢于内存访问。在 Faler 这篇文章的评论里面, Steve M. Ciske 对减少数据库操作的做法表示了忧虑:

对于减少数据库操作的做法,我持谨慎态度。我见多了人们走向另一个极端,把所有的东西都放在应用层。

Paweł Stradomski 认为远程内存缓存要快于本地磁盘缓存,Faler 也表示了同意:

远程主机(通过网络连接)缓存可能会快于本地磁盘缓存。如果不考虑网络查找的时间,从磁盘顺序读取数据比从远程主机的内存里面读取数据要慢三倍。

延伸阅读:Simon Brown 的文章“可伸缩性原则”。

查看英文原文 8 Best Practices to Improve Scalability

2009-05-19 20:322761
用户头像

发布了 76 篇内容, 共 23.4 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

八月未央,早睡早起

escray

读书笔记 8月日更

01 设计模式之单例模式

陈皮的JavaLib

设计模式 单例模式 8月日更

架构师实战营 模块九作业(设计电商秒杀系统)

代廉洁

架构实战营

菜鸡学习python

Augus

8月日更

【LeetCode】矩阵中战斗力最弱的 K 行Java题解

Albert

算法 LeetCode 8月日更

gopher成长之路(二):听万俊峰老师演讲有感

非晓为骁

学习 个人成长 gopher

【前端 · 面试 】HTTP 总结(一)—— HTTP 概述

编程三昧

面试 大前端 HTTP 8月日更

毕业设计-秒杀业务

白发青年

架构实战营

架构实战营毕业总结

白发青年

#架构实战营

「SQL数据分析系列」13. 索引和约束

数据与智能

sql 索引 位图

做行业的底层架构者 为区块链+提供更多可能

CECBC

架构实战营-毕业设计

泄矢的呼啦圈

架构实战营

Convolutional Neural Network (CNN)

毛显新

神经网络 深度学习 tensorflow 图像识别

网络攻防学习笔记 Day92

穿过生命散发芬芳

网络攻防 8月日更

服装生产流程管理在明道云的实现

明道云

Git的基本操作

卢卡多多

git flow git reset 8月日更

01-架构的定义

Lane

docker个人理解与安装

小鲍侃java

8月日更

李运华老师(前阿里P9)架构实战营 毕业总结

代廉洁

架构实战营

聊聊实时数仓架构设计

水滴

实时数仓 数仓架构 8月日更 数仓建设思路

非典型开发者的形象三变

脑极体

手把手撸二叉树之叶子相似的树

HelloWorld杰少

面试 大前端 二叉树 数据结构与算法 8月日更

Java 代理模式

gin

Java 代理 Proxy

架构训练营模块 2 作业 - 学生信息管理系统的架构文档 - 江哲

江哲

带你全面了解 Git 系列 02 - 常用 Git 技巧

淼💦 淼

git GitHub

Python OpenCV 图像处理之傅里叶变换,取经之旅第 52 篇

梦想橡皮擦

8月日更

Discourse 图片上传的更新

HoneyMoose

Java中的JVM是如何实现多线程的?

程序员阿杜

Java JVM 多线程 8月日更

架构师实战营 模块九总结

代廉洁

架构实战营

现代分布式架构设计原则-可靠性

余朋飞

稳定性 可用性 弹性 可靠性

pyinstaller 打包

橙橙橙橙汁丶

提升可伸缩性的八项最佳实践_最佳实践_Abel Avram_InfoQ精选文章