持续集成与部署(五):发布策略

简介: 持续集成与部署(五):发布策略

1. 前端发布策略

前端发布的本质,其实是静态资源的发布,一般是 jscss,而不包括动态渲染出来的html模版。

野生状态下的前端资源

  1. 有一个HTML
  2. HTML中引入一个CSS
  3. CSS和HTML模版都有服务器反向代理

这时候他们的网络时序图会如下图所示,htmlcss会依此加载:

image.png

这种情况下我们可能会想到一些优化手段。

比如说能否用HTTP的缓存提高资源的加载速度呢?

我们知道HTTP的缓存有两种

  1. 协商缓存

    使用协商缓存的话,浏览器去请求资源,服务器会告诉浏览器这个资源已经多久没有改变过了,浏览器发现这个时间内自己请求过这个资源,于是就把缓存的资源拿出来直接使用。

![image.png](https://yejiwei.com/static/img/455d457aecb19c383816b03f6ed65d46.image.png)

这种方式省去了重新下载整个资源的时间,但是仍然需要一次协商缓存的过程。
  1. 本地缓存

    另一种是本地缓存,在这种方式下,浏览器在发起请求之前,会对比请求的url,如果发现和之前一致的话,就从硬盘或是内存中,找到对应的缓存,直接使用。

    image.png

显然本地缓存对加载速度更好,但是本地缓存带来了新的问题,如果资源更新了怎么办?用户一直使用老的缓存,即使发布了新的版本,用户不是也用不上吗?

有人想到了一个办法,既然本地缓存更请求的url有关,那么我们在请求资源的后面多加个版本的参数不就好了么,每次更新资源的时候也同步的更新参数。比如说:所有的资源都加上一个v.x.x.x的版本号,在下次更新的时候修改版本号,让用户的缓存失效。

image.png

但是在实际情况中,我们还发现了新的问题,对于一个大型网站来说,静态资源可能非常非常多,每天都会有新的前端代码被修改,如果其中每一个资源被修改了,我们就全量修改所有的版本号的话。那缓存的意义也就不大了。

image.png

针对这个问题,我们可以用hash来解决。

hash是一串字符串,它像是文件的一种特质,只和文件的内容有关,如果一个文件的内容变了,那么它的hash值也会变化。

利用hash的特性,我们可以把上一步的版本号改为hash值,这样的话只有被我们改动过的静态资源的缓存才会失效。

image.png

看起来这是一种比较完美的解决方案。

不过,对于大公司来说,为了进一步提升网站性能,一般都会把静态资源和动态网页分集群部署,静态资源会被部署到CDN节点上,网页中引用的资源也会变成对应的部署路径:

image.png

好了,当我要更新静态资源的时候,同时也会更新html中的引用吧,就好像这样:

image.png

页面和静态资源不在同一个机器上,我们就要面临一个问题,他们两者的部署,就必然会有一个时间差,那么是先上线页面呢,还是先上线静态资源呢?

  1. 先部署页面,再部署资源:在二者部署的时间间隔内,如果有用户访问页面,就会在新的页面结构中加载旧的资源,并且把这个旧版本的资源当做新版本缓存起来,其结果就是:用户访问到了一个样式错乱的页面,除非手动刷新,否则在资源缓存过期之前,页面会一直执行错误。
  2. 先部署资源,再部署页面:在部署时间间隔之内,有旧版本资源本地缓存的用户访问网站,由于请求的页面是旧版本的,资源引用没有改变,浏览器将直接使用本地缓存,这种情况下页面展现正常;但没有本地缓存或者缓存过期的用户访问网站,就会出现旧版本页面加载新版本资源的情况,导致页面执行错误,但当页面完成部署,这部分用户再次访问页面又会恢复正常了。

好想都不太好...

最终方案:非覆盖式发布

image.png

之前的方案之所以有问题,是因为在CDN上同名的文件只能有一份,它要么是老的要么是新的,不能同时存在,这种方式叫做覆盖式发布。非覆盖式发布就是指我们不通过url参数带hash的方法解决缓存问题,而是直接将hash写入到静态资源的文件名中,这样的话不同版本的同一资源,文件名也不会重复,我们在发布时,将新的资源推送到CDN之后并不会覆盖老的资源,它们两者在CDN上同时存在,这个时候访问新页面的用户加载新的资源,访问老的页面的用户加载老的资源,各不冲突,这样就可以完美的解决资源更新的问题了。

2. 后端发布策略

后端发布的本质是后端服务再多台服务器上的分发。

对于大公司,往往不可能用单机承载所有的流量,而是有一个服务器集群,分摊高并发服务的成本,也挺高了服务的可用性。

后端发布关心的问题

  1. 如何减少用户感知上的新旧版本不一致
  2. 如何让发布过程中的服务尽可能的稳定
  3. 如何保证发布的结果最终一致性

下面介绍后端的集中部署方式

  • 滚动部署

    滚动更新的发布过程,是让应用的新版本逐步替换旧版本。在此期间,新旧版本会共存。

    下图显示了该更新策略:旧版本显示为蓝色,新版本显示为绿色,它们部署在集群中的每一台服务器上。
    三台服务器一开始都是老版本,然后在state 1, state 2阶段开始逐渐替换到新版本,最终完全替换成功,这个过程服务不会中断,一个请求可能会落在老版本中,也可能会落在新版本中。

    image.png

    这种部署方式的特点:

    • 节约资源(不需要额外服务器资源)
    • 流量冲击小(应用逐步的被替换,过程是渐进式的,每台服务器承受的压力理论上是相同的)
    • 回滚不及时
    • 存在中间状态,可能会导致不一致
  • 蓝绿部署

    不停止老版本,部署新版本并进行测试,确认OK后,将流量切到新版本。

    image.png

    这种部署方式的特点:

    • 风险小,新的版本有问题不会影响线上
    • 便于快速回滚
    • 切换流量要妥善处理未完成请求
    • 整体切换流量冲击较大
  • 灰度发布/金丝雀发布

    灰度发布是滚动发布的改良,在原有软件生产版本可用的情况下,同时部署一个新的版本,两个版本同时存在于线上,为新版本分配少量流量,线上验证完毕后再将新版本推广。

    image.png

    这种部署方式的特点

    • 渐进式,风险较小
    • 需配合复杂的路由策略

参考文章:
大公司里怎样开发和部署前端代码?
部署策略对比:蓝绿部署、金丝雀发布及其他

相关文章
|
5月前
|
存储 文字识别 自然语言处理
通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
本文深入探讨了通义大模型在文档自动化处理中的应用,重点解决传统OCR识别精度低、效率瓶颈等问题。通过多模态编码与跨模态融合技术,通义大模型实现了高精度的文本检测与版面分析。文章详细介绍了OCR集成流程、批量处理优化策略及实战案例,展示了动态批处理和分布式架构带来的性能提升。实验结果表明,优化后系统处理速度可达210页/分钟,准确率达96.8%,单文档延迟降至0.3秒,为文档处理领域提供了高效解决方案。
661 1
|
7月前
|
弹性计算 机器人 应用服务中间件
一键部署开源Qwen3并集成到钉钉、企业微信
Qwen3系列模型现已正式发布并开源,包含8款“混合推理模型”,其中涵盖两款MoE模型(Qwen3-235B-A22B与Qwen3-30B-A3B)及六个Dense模型。阿里云计算巢已支持Qwen3-235B-A22B和Qwen3-32B的私有化部署,用户可通过计算巢轻松完成部署,并借助AppFlow集成至钉钉机器人或企业微信。文档详细介绍了从模型部署、创建应用到配置机器人的全流程,帮助用户快速实现智能助手的接入与使用。
611 19
一键部署开源Qwen3并集成到钉钉、企业微信
|
6月前
|
JSON 缓存 并行计算
NVIDIA 实现通义千问 Qwen3 的生产级应用集成和部署
阿里巴巴近期开源了通义千问Qwen3大语言模型(LLM),包含两款混合专家模型(MoE)235B-A22B与30B-A3B,以及六款稠密模型(Dense)从0.6B到32B不等。开发者可基于NVIDIA GPU使用TensorRT-LLM、Ollama、SGLang、vLLM等框架高效部署Qwen3系列模型,实现快速词元生成和生产级应用开发。
|
9月前
|
人工智能 Kubernetes jenkins
容器化AI模型的持续集成与持续交付(CI/CD):自动化模型更新与部署
在前几篇文章中,我们探讨了容器化AI模型的部署、监控、弹性伸缩及安全防护。为加速模型迭代以适应新数据和业务需求,需实现容器化AI模型的持续集成与持续交付(CI/CD)。CI/CD通过自动化构建、测试和部署流程,提高模型更新速度和质量,降低部署风险,增强团队协作。使用Jenkins和Kubernetes可构建高效CI/CD流水线,自动化模型开发和部署,确保环境一致性并提升整体效率。
|
4月前
|
物联网 Linux 开发者
快速部署自己私有MQTT-Broker-下载安装到运行不到一分钟,快速简单且易于集成到自己项目中
本文给物联网开发的朋友推荐的是GMQT,让物联网开发者快速拥有合适自己的MQTT-Broker,本文从下载程序到安装部署手把手教大家安装用上私有化MQTT服务器。
1326 5
|
6月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
448 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
12月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
727 3
|
6月前
|
JSON 前端开发 算法
掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
429 23
|
9月前
|
弹性计算 人工智能 应用服务中间件
一键部署开源DeepSeek并集成到企业微信
DeepSeek近期发布了两款先进AI模型V3和R1,分别适用于通用应用和推理任务。由于官方API流量过大,建议通过阿里云的计算巢进行私有化部署,以确保稳定使用。用户无需编写代码即可完成部署,并可通过AppFlow轻松集成到钉钉、企业微信等渠道。具体步骤包括选择适合的机器资源、配置安全组、创建企业微信应用及连接流,最后完成API接收消息配置和测试应用。整个过程简单快捷,帮助用户快速搭建专属AI服务。
1754 7
一键部署开源DeepSeek并集成到企业微信
|
9月前
|
人工智能 自然语言处理 机器人
一键部署开源DeepSeek并集成到钉钉
DeepSeek发布了两款先进AI模型V3和R1,分别适用于对话AI、内容生成及推理任务。由于官方API流量限制,阿里云推出了私有化部署方案,无需编写代码即可完成部署,并通过计算巢AppFlow集成到钉钉等渠道。用户可独享资源,避免服务不可用问题。部署步骤包括选择机器资源、配置安全组、创建应用与连接流,最终发布应用版本,实现稳定高效的AI服务。
768 4
一键部署开源DeepSeek并集成到钉钉

热门文章

最新文章

下一篇
oss云网关配置