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,一经查实,立即删除!

相关文章

【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…

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

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

MySQL数据库高级查询语句

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

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

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

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

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

Linux常用命令——emacs命令

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

服务器技术(三)--Nginx

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

【Nginx】rewrite简单使用

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

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

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

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

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

Linux命令----modprobe命令详解

【原文链接】Linux命令----modprobe命令详解 一、modprobe命令的作用 加载内核模块: 使用modprobe命令可以加载指定的内核模块到运行中的内核中。加载内核模块可以在运行时添加新的功能、驱动程序或修改内核行为。 解决模块依赖关系: modprobe命令可以…

基于OpenCV的人脸对齐步骤详解及源码实现

目录 1. 前言2. 人脸对齐基本原理与步骤3. 人脸对齐代码实现 1. 前言 在做人脸识别的时候,前期的数据处理过程通常会遇到一个问题,需要将各种人脸从不同尺寸的图像中截取出来,再进行人脸对齐操作:即将人脸截取出来并将倾斜的人脸…

【图像处理】经营您的第一个U-Net以进行图像分割

一、说明 AI厨师们,今天您将学习如何准备计算机视觉中最重要的食谱之一:U-Net。本文将叙述:1语义与实例分割,2 图像分割中还使用了其他损失,例如Jaccard损失,焦点损失;3 如果2D图像分割对您来说…

spring 详解二 IOC(Bean xml配置及DI)

配置列表 Xml配置 功能描述 <bean id"" class""></bean> Bean的id&#xff0c;配置id会转为Bean名称和不配就是全限定类名 <bean name"" ></bean> Bean的别名配置&#xff0c;存储在Factory的aliasMap中通过别名也…

【SpringBoot】SpringBoot的自动配置源码解析

文章目录 1. SpringBoot的自动配置概念2. SpringBoot自动配置的原理3. EnableAutoConfiguration4. 常用的Conditional注解 1. SpringBoot的自动配置概念 SpringBoot相对于SSM来说&#xff0c;主要的优点就是简化了配置&#xff0c;不再需要像SSM哪有写一堆的XML配置&#xff0…

centos7.9修改ssh默认的端口号

多开几个ssh&#xff0c;防止配置文件错误&#xff0c;将自己关在服务器外面了 netstat -ntlp|grep ssh # ssh对应的端口号 修改sshd_config配置文件 /etc/ssh/sshd_config&#xff0c;重启sshd服务 #Port 22 Port 10011 # 端口号自己定义&#xff0c;不能超过65535&#xf…

Django系列所有漏洞复现vulhubCVE-2018-14574,CVE-2022-34265,CVE-2021-35042

文章目录 Django < 2.0.8 任意URL跳转漏洞&#xff08;CVE-2018-14574&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Trunc(kind) and Extract(lookup_name) SQL注入漏洞&#xff08;CVE-2022-34265&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Qu…

pyqt 实现计算器

1.由designer设计实现的计算器类 文件名为&#xff1a;untitled.py # -*- coding: utf-8 -*-# Form implementation generated from reading ui file untitled.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will b…