云计算的概念已经提出将近二十年。早期人们讨论"什么是云计算",如今这已经不是一个需要定义的问题——它已经像电力一样,成为现代IT基础设施的默认选项。
但"用上云"和"用好云"之间,存在着一条需要深入理解的鸿沟。这篇文章想聊的,是云计算从"资源"到"能力"的演进逻辑,以及在云上构建系统时那些值得深思的设计原则。
云计算最经典的划分是三层架构:
这个三层架构在理论上是清晰的,但在实践中边界越来越模糊。AWS不仅提供EC2(IaaS),还提供RDS(托管数据库,接近PaaS)、Lambda(函数计算,属于FaaS)。"IaaS+PaaS"混合体已经成为云厂商的主流形态。
但不论层次如何变化,核心逻辑没变:云计算让资源从"资本支出"变为"运营支出",从"提前采购"变为"按需使用"。
这个转变的意义不仅仅是财务层面的。更重要的是,它改变了工程决策的时间尺度:你可以今天试一个想法,不行就关掉,几乎零成本。这种"实验友好"的特性,催生了大量的创新。
云计算的基础是虚拟化技术。最早的虚拟化是硬件级的——在一台物理机上运行多个虚拟机,每个虚拟机有独立的操作系统和内核。
虚拟机的优势是强隔离性,但代价是资源开销大:每个虚拟机都要运行完整的操作系统,启动需要几十秒甚至几分钟。
容器的出现改变了这个格局。容器共享宿主机的内核,只隔离进程空间和文件系统,启动时间以毫秒计,资源开销远小于虚拟机。
# 一个简单的容器定义(Docker Compose片段)
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
build: .
environment:
- DB_HOST=database
depends_on:
- database
database:
image: postgres:13
volumes:
- db_data:/var/lib/postgresql/data容器不仅仅是一种打包技术,它带来的更重要的变化是"开发环境即生产环境"——你在笔记本上构建的容器镜像,可以直接部署到云上,消除了"在我机器上能跑"的问题。
Kubernetes进一步扩展了容器的能力:它提供了服务发现、负载均衡、自动扩缩容、滚动更新等能力,让容器从"单个进程的管理"变成了"整个应用集群的管理"。
云计算的演进,有一条清晰的轨迹:抽象层次不断提高,用户需要关心的东西越来越少。
# 一个简单的云函数(AWS Lambda风格)
import json
def lambda_handler(event, context):
name = event.get('name', 'World')
return {
'statusCode': 200,
'body': json.dumps(f'Hello, {name}!')
}函数计算代表了"极致抽象"的方向:开发者只关心业务逻辑,所有基础设施层面的问题都由平台解决。但这不意味着FaaS是万能的——冷启动延迟、执行时间限制、状态管理等问题,决定了它适合事件驱动、短时执行的场景,而不适合长时间运行的有状态服务。
云上的数据服务种类繁多,但可以归纳为几个核心类别:
对象存储(如AWS S3、阿里云OSS):存储任意类型的文件,通过HTTP API访问。适合存储图片、视频、备份、静态网站。设计上强调持久性和可用性,但弱一致性是需要注意的特性。
关系型数据库(如AWS RDS、阿里云RDS):云厂商托管的MySQL、PostgreSQL等。自动处理备份、故障切换、版本升级。但"托管"不等于"免运维"——你仍然需要关注查询性能、索引设计、连接池配置。
NoSQL数据库(如AWS DynamoDB、阿里云TableStore):键值或文档存储,水平扩展能力强,适合高吞吐、低延迟的场景。代价是需要牺牲一些查询灵活性。
数据仓库(如AWS Redshift、Google BigQuery):面向分析场景的列式存储,适合大规模数据的聚合查询。
在云上做数据架构,有一个值得记住的原则:不要把对象存储当数据库用。对象存储不适合频繁更新的小文件,也不支持事务。用错了场景,性能和成本都会出问题。
"云原生"这个词已经被用滥了。但它的核心内容值得认真对待:
微服务:把应用拆分为一组小的、独立部署的服务。云环境让这种拆分变得容易——每个服务可以独立扩缩容、独立发布、使用不同的技术栈。但微服务带来的分布式复杂性(网络延迟、数据一致性、链路追踪)需要认真应对。
弹性设计:云环境的一个基本事实是"东西会挂"。虚拟机可能被回收、网络可能抖动、依赖服务可能限流。好的云上系统不是"避免故障",而是"优雅地应对故障"。
实现弹性的一些常见模式:
# 指数退避重试(伪代码)
def call_with_retry(func, max_retries=5):
for i in range(max_retries):
try:
return func()
except TransientError:
wait = 2 ** i # 1s, 2s, 4s, 8s, 16s
sleep(wait)
raise PermanentError()熔断器:当下游服务响应变慢或错误率升高时,主动切断请求,防止级联故障。
超时控制:每个外部调用都设置超时,避免请求被"卡死"导致资源耗尽。
云计算的优势之一是"按需付费",但如果使用不当,"按需付费"可能变成"按需浪费"。
成本优化是一个需要持续关注的话题,常见的方向包括:
成本优化的核心原则是:不要让"默认配置"成为"最终配置"。云厂商的默认选项往往偏向性能和可用性,而不是成本。主动审视和调整,是工程团队的日常功课。
云安全有一个基础模型:共享责任模型。
这意味着:即使你的应用跑在AWS上,你仍然需要操心安全补丁、防火墙规则、加密配置、访问控制。
一些值得关注的安全实践:
云计算还在快速演进。几个值得关注的方向:
边缘计算:把计算能力推到离用户更近的地方,降低延迟、减少带宽成本。适合IoT、自动驾驶、实时音视频等场景。
Serverless的深化:不仅仅是函数计算,还包括Serverless数据库、Serverless消息队列。用户完全不需要关心"实例"的概念。
AI与云计算的融合:云平台提供GPU计算、AI模型训练平台、推理服务。AI能力成为云的"内置功能",而不是需要独立建设的系统。
多云与混合云:不把所有鸡蛋放在一个篮子里,在多个云厂商之间分配工作负载,或在自有数据中心和公有云之间形成混合架构。
云计算不是一种技术,而是一套关于"如何获取和释放计算能力"的新模式。它改变了成本结构、改变了团队组织方式、改变了软件的交付节奏。
但最重要的改变可能是:它让"试错"变得便宜,让"实验"成为常态。在云上,你可以用很低成本启动一个新项目、测试一个新想法、验证一个新架构。如果不行,关掉就好了。
这种"低成本的实验能力",或许才是云计算带来的最根本的变化。它让工程师从"担心做错"中解放出来,把精力放在"找到对的"上——这是任何工程活动最本质的追求。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。