Serverless和EDA是绝配,亚马逊云科技CTO Werner表示需要用开放心态来重新审视架构

前一段有个很火的博客,讲的是一家全球流媒体企业的监测系统从Serverless+微服务改成了单体,成本居然降低了90%!这一下子可在网上炸锅了,特别是一些看不惯微服务的、单体应用的拥趸,更是坐不住了。但这并不像吃瓜群众看到的那样,仅仅是“回归”单体应用,或者说大家的关注点都盯着那个成本降低了90%。

大部分人忽略了两件事情:

(1)架构的演进

(2)Serverless First

 

架构的演进

视频监控系统最早版本确实选择了分布式的架构,主要包含三个组件:

1. 媒体转换服务:把视频转换成“帧”,保存在Amazon S3中。

2. 缺陷检测服务:分析Amazon S3中的视频“帧”,检查是否有缺陷。

3. 通知服务:发现了视频缺陷,发送实时通知。

9914dc8da64e45abb20f4a3c26a858ff.png

 

这个架构的好处是:充分利用了亚马逊云科技的基础设施。Amazon S3帮助进行数据在多个服务之间进行中转,Amazon Step Functions帮助对多个服务进行组合和协调。在Serverless的加持下,每个组件都可以根据流量独立地、自动地扩展。

这个架构非常简单,但简单的架构不一定是单体架构,也可能是Serverless架构,因为亚马逊云科技把复杂的细节都给封装起来了,程序员可以专注业务的开发,可以快速实现,快速进入市场。

但是当流量大了以后,这个架构暴露出了两个问题:

(1) 服务粒度拆分得太细,使用Amazon Step Functions组合起来以后,导致状态迁移次数过多,收费自然就高了。

(2) 使用Amazon S3来暂存视频帧,对数据的存取需要一定的费用,当视频流数量很大时,费用也就相应上升了。

很明显,原有的微服务架构已经不满足需求了,必须进行演进。团队的选择是:把所有的服务都放到一个进程中,部署到一个Amazon ECS中,数据的通信不再使用Amazon S3,而是直接用Amazon ECS的内存。既然在一个进程中,Amazon Step Functions也就不需要了,状态转换带来的费用也就没有了。

当一个Amazon ECS不够用,需要扩展的时候,可以部署多个Amazon ECS。用这种方式,成本降低了90%。

但是很多人没意识到的是,这里只是运行成本降低了90%,开发成本并没有算进去。原来系统用的是Amazon Step Functions,在把微服务架构转换成单体的过程中,自然是不用了,但是Amazon Step Functions承担的协调功能怎么办呢?它内置的重试功能、异常捕获功能怎么办呢?如果出现未处理的异常、运行超时、Socket超时等问题该怎么办呢?

这些问题都需要程序员手工来重新编码实现!

此外使用单体架构,失去了原来Serverless自然拥有的横向扩展的能力,想根据流量对特定微服务进行扩展是不可能了,现在扩展的最小单位变成了AmazonECS,并且团队不得不自己去估算流量,编程实现请求在多个Amazon ECS之间的转发。

架构设计本质上是一种权衡(Trade-Off),不可能存在一种面面俱到的完美架构,一劳永逸地解决问题,架构师的工作就是不断地取舍,根据需求不断演进架构,找到最适合自己的。

这个监控系统的架构就是一个演进的过程,从微服务+Serverless开始,最后由于基于成本的考虑,转换为单体,自己实现扩展,自己管理基础设施,自己开发部分代码。亚马逊的CTO Werner说:构建可演进的软件系统是一种策略,必须用开放的心态来重新审视你的架构。

 

Serverless First

综上所述,Prime Video监控系统这个案例,实际上就是架构演进的自然结果。现在如果你要构建一个新的应用,不要做某种架构的狂热信徒,不能说这个就好,那个就不好,一切都视情况而定,先保持简单,然后再慢慢演进。但是建议大家:一定要有Serverless First的心态。

原因非常简单,使用Serverless,可以抛弃基础设施维护的负担,把注意力集中在业务实现上,在几天或者几周内快速构建一个系统,推向市场并且获得收益。Serverless是真正地按价值付费,用户使用了你开发的产品,才会产生费用,如果没有流量,根本不会产生费用。

当业务取得成功,有持续稳定的流量,对云上成本很敏感,愿意自己维护基础设施,可以接受增加部分开发工作,这个时候可以考虑进行一些架构调整,比如将工作负载转向容器。这是一种市场导向,业务导向的方法,也是一种更加敏捷的方法。如果在设置虚拟机,容器,软件等方面花费太多的金钱和精力,最后发现产品不是市场所需要的,那将是一种巨大的浪费。

Serverless和EDA(事件驱动架构)是绝配,当你采用它们的时候,会迫使你不断思考,把整个系统变成松耦合的状态,让系统中每个组件都更加独立,互不影响。这也是良好的设计要达到的目标之一。

即使将来要“回归”到单体,或者整个系统一部分用微服务,一部分用单体,之前绝大部分组件代码都可以重用,就像视频监控系统那样,你要做的只是把这些组件放入到一个进程,一个Container中,然后手工编码补充完善那些本来由Serverless内置提供的能力。如果反过来,一开始系统不是松耦合的,再想变成微服务和Serverless,那拆分的代价将会非常之高。

 

总结

视频监控系统这个案例的讨论是很有价值的,它给我们敲响了警钟,并不是微服务不行,Serverless不行,而是要在合适的时间点,选择合适的架构。

现代应用的架构设计要有Serverless First的心态,不要过多考虑基础设施,而是把注意力集中在业务实现上,迅速推出产品和服务,然后再根据实际需求进行调整,从而实现业务价值的最大化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0基础学C#笔记01:数组复制

文章目录 前言一、错误的复制方式二、正确的复制方式1.复制方式 一2.复制方式 二3.复制方式 三4.复制方式 四三、验证总结前言 C# 数组复制的四种方式,简单明了实用 我们先创建一个数组: string[] names = {"张三", "李四",

【ECharts系列】ECharts 图表渲染问题解决方案

1 问题描述 echats 渲染,第一次的时候只出现Y轴数值,不出现X轴数值,切换下页面,X轴数值就能出现。 2 原因分析 如果在使用ECharts渲染时,X轴数值只在切换页面后才出现,可能是因为ECharts在初始化时没有正确…

光速吟唱,Clibor ,批量多次复制依次粘贴工具 快捷输入软件教程

批量多次复制依次粘贴工具 批量复制粘贴工具0.81.exe https://www.aliyundrive.com/s/3sbBaGmHkb8 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。 青县solidworks钣金设计培训 …

Redis进阶 - Redis哨兵

原文首更地址,阅读效果更佳! Redis进阶 - Redis哨兵 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-sentinel.html 思考 slave 节点宕机恢复以后可以找 master 节点同步数据,那么 master 节点宕机怎么办&am…

MFC 利用多态的特性实现子窗口同时存在一个

多个子窗口的类都继承同一父类 CDialogEx 于是在主窗口我声明一个CDialogEx指针 通过判断该指针是否为空 不为空则视为有一子窗口存在 注意这里介绍的是 非模态化窗口的关闭 你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的…

[Docker] Docker镜像管理和操作实践(二) 文末送书

前言: Docker镜像是容器化应用程序的打包和分发单元,包含了应用程序及其所有依赖项,实现了应用程序的可移植性和一致性。 文章目录 使用Dockerfile创建自定义镜像实践练手1. 创建基于ubuntu的自定义镜像,并安装nginx2. 配置Redis容…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…

【云原生】二进制k8s集群(下)部署高可用master节点

本次部署说明 在上一篇文章中,就已经完成了二进制k8s集群部署的搭建,但是单机master并不适用于企业的实际运用(因为单机master中,仅仅只有一台master作为节点服务器的调度指挥,一旦宕机。就意味着整个集群的瘫痪&#…

input.unsqueeze(0)的作用

input.unsqueeze(0) 是 PyTorch 张量(Tensor)的方法之一,用于增加张量的维度。具体来说,它会在索引为 0 的位置上插入一个维度。 假设 input 是一个形状为 (n,) 的一维张量,其中 n 是任意长度。调用 unsqueeze(0) 后&…

【Web3】 Web3JS Pay Api

Web3Network.eth.sendSignedTransaction(serializedTx) 参数: from- String|Number:发送帐户的地址。如果未指定,则使用web3.eth.defaultAccount属性。或web3.eth.accounts.wallet中本地的地址。 to- String:(可选)消息的目标地址…

宝塔Linux面板安装Composer依赖管理工具与PHP依赖包的方法

最近看见腾讯云有一个AI绘画还挺有意思,想搞来写个接口玩 但是Composer一直运行不成功 提示xdebug什么的 最后经过搜索 发现 需要删除你宝塔里所有php中禁用的putenv函数 然后重启php就可以了! 然后就可以运行这个命令了 出现这种情况 还需要删除所有…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器,它支持多种编程语言,具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…

ubuntu20.04上linux内核开发环境搭建(qemu+gdb+vscode)

qemugdbvscode环境搭建 1. 环境准备1.1 安装基础软件1.2 安装开发软件1.3 安装qemu 2. 制作rootfs2.1 buildroot制作rootfs2.2 busybox制作rootfs 3. kernel编译及运行3.1 编译内核3.2 启动内核3.3 qemu参数说明 4. vscode 图形化调试环境配置4.1 vscode配置4.2 qemu配置 1. 环…

服务器技术(三)--Nginx

Nginx介绍 Nginx是什么、适用场景 Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发,性能是其最重要的考量&#xf…

【Nginx】rewrite简单使用

前言 没有对正式的rewrite进行了解,为了能快速了解它是干嘛怎么用,找了一些有例子的博客进行简单学习了一下;由于每次看的间隔有点大,老忘记,这回专门写个超级快速理解的例子。 PS:下面的解释可能会不太对…

SMALE周报_20230714

目录标题 1. 上周回顾2. 本周计划3. 完成情况4. 存在的主要问题5. 下一步工作 1. 上周回顾 总结不确定性在神经网络中的运用。跳转链接 2. 本周计划 通过阅读论文《Semi-Supervised Deep Regression with Uncertainty Consistency and Variational Model Ensembling》&#…

LAXCUS分布式操作系统存在的意义和价值

总有一些新用户不能理解LAXCUS分布式操作系统,以及它存在的意义和价值,我这样说吧。 下图是一个图形桌面(LAXCUS的图形桌面,不是Windows、也不是Macintosh),在它后面,连着一个计算机集群&#…

Scala集合 - Map;扩展元组类型

水善利万物而不争,处众人之所恶,故几于道💦 目录 一、不可变Map集合 1. 集合创建   2. 集合遍历   3. 获取Map中的value 二、可变Map集合 1. 创建可变Map集合   2. 添加元素   3. 删除元素   4. 修改Map中的元素 三、元组 1. 元组的创…

自然语言处理-文本表示: Embedding技术

目录 I. 引言 A. 文本表示介绍 B. 引入Embedding技术的重要性和应用领域 II. 传统文本表示方法 A. One-Hot编码 B. 词袋模型 C. TF-IDF III. 什么是文本表示-Embedding A. 定义和概念 B. Embedding的目标和作用 IV. 常见Embedding技术 A. Word2Vec 1. CBOW模型 2…

数据库技术与应用——目录篇

数据库技术与应用目录 文章目录 第1章 数据库基础知识数据库技术的概念数据管理的发展数据库的体系结构数据库管理系统常用的数据库管理系统介绍 第2章 信息得三种世界与数据模型信息的三种世界及其描述数据模型 第3章 关系模型关系模型的由来关系数据库的结构关系代数关系演算…