当前位置: 首页 > news >正文

无服务器学习01:基本概念+优点+面临的挑战

无服务器学习01

基本概念

什么是无服务器?

在我们开始之前,让我们一起来了解一下无服务器到底是什么。你会看到一些无服务器的定义,说它根据需要提供计算资源。虽然这是一个纯粹的定义,但更常用的更广泛的定义是:它是以一种不需要您考虑管理服务器的方式提供计算资源的方式。

Serverless有以下几种形式

无服务器容器

Heroku、Netlify、AWS ECS/EKS Fargate、Google Kubernetes Engine 和 Azure Kubernetes Service 等无服务器容器服务为您提供了一个环境,您可以在其中构建容器并将其推送到管理容器部署和执行的服务中。您不必担心运行托管您的控制服务器、节点服务器等资源如何组合为集群,您只需推送一个包含一些元数据的容器,其余的运维任务交给服务商平台处理。

无服务器函数

AWS Lambda、Google Cloud Functions 或 Azure Functions 等无服务器函数是提供软件运行环境的服务,您可以在其中推送具有特定接口的代码块,然后再调用该代码。

无服务器vs虚拟机

许多人不认为无服务器容器是真正的无服务器,因为当您构建和推送容器时,您实际上是将整个服务器捆绑在一个漂亮的软件包中。虽然我倾向于同意它们不是「真正的」无服务器,但与运行完整的虚拟机相比,它们绝对具有巨大的优势,并且在某些情况下与无服务器功能相比具有明显的优势。

无服务器容器的优点

与传统服务器相比,无服务器容器有很多优势。这里有几个:

  • 很少的服务器管理 —— 无需管理、修补或排除故障的服务器。您仍然在容器内有一个操作系统,但这可能是一个非常小的安装,并且需要你亲自管理的系统依赖对比(虚拟)服务器要小得多。
  • 通常是无状态的 —— 在构建为容器设计的应用程序时,您通常会构建一个「12 要素应用程序」或遵循类似的模式。你的容器是牛,不是宠物。如果您的容器崩溃,则会自动启动一个新容器。
  • 轻松的水平可扩展性 —— 虚拟机本身在可扩展性方面没有任何限制,但容器将您推向一个方向,允许无服务器容器服务根据需要轻松扩展您的软件。根据负载、时间和请求计数等因素,无服务器容器服务可以运行一个容器实例或 10,000 个容器实例,同时透明地处理存储分配、负载平衡、路由等。
  • 安全性 —— 安装在容器中的操作系统通常是短暂的、非常小的,有时是只读的。因此,与典型的通用和长期服务器环境相比,它的可进行网络攻击的总面积要小得多。
  • 源代码控制环境 —— 您的容器定义在可以放入源代码控制的文件中进行描述。虽然这在当今几乎任何情况下都是最佳实践,但与传统的服务器环境相比,它仍然是一个明显的优势,在传统服务器环境中,别人时不时还可以登录进入并更改服务器配置导致意外的配置不一致。
  • 应用程序和环境捆绑 —— 您将应用程序与其运行的环境结合起来,并将其部署为一个单元。这样,如果您的软件的新版本使用更新的库、操作系统版本或新的语言版本,它都可以作为一个单元进行部署和回滚。
  • 成本 —— 您可以轻松地向上和向下扩展工作负载。虽然运行无服务器容器可能会贵一些,但通过一些服务平台工具协助,您可以在灵活性上获得弥补。与传统的虚拟机选项相比,无服务器容器通常为您提供更大的灵活性,可以将资源分割成更小的单元。例如,一个 EC2 T3 nano 实例提供 2 个 vCPU,但您可以请求一个只有 0.25 个 vCPU 的容器。

无服务器函数云的优点

无服务器函数云计算具有无服务器容器的所有优点,但将其提升到另一个层次。

  • 几乎零管理 —— 在大多数情况下,您根本不需要考虑操作系统。您可以将代码向上推送,然后运行它。在操作系统级别没有什么需要修补,也没有什么需要维护 —— 只需推送并忘记它。
  • 默认情况下是无状态的 —— 无服务器函数迫使你以无状态的方式编写代码,因为你不能依赖不同的调用之间留下的任何东西。这使得它们可以轻松扩展,因为您的函数可以在任何服务器上启动,而无需依赖于本地状态。
  • 几乎完美的水平可扩展性 —— 某些东西会调用你的函数,然后它就会运行。如果它被调用一次,那么它运行一次。如果它被调用 100,000 次,那么它会运行 100,000 次。当然,有一些平台限制可能会发挥作用,但这些通常是防止您意外花费 10,000 美元的保障措施,而不是平台的限制。
  • 成本 —— 无服务器函数计算仅在执行时才会计费和扣费。因此,如果您的功能很少执行或者非常突发,您可以节省大量云计算费用。

无服务器容器与无服务器函数

无服务器容器的优势

  • 轻松迁移 —— 如果你有一个现有的应用程序,它可能需要运行一些计算任务,但你可以让它在容器内运行。
    稳定的工作负载且更便宜 —— 如果你有一个一致的工作负载,那么无服务器容器可能会比无服务器函数的等效调用更便宜。
  • 灵活性 —— 您的操作系统、二进制文件、语言、版本等没有任何限制。您可以控制整个容器。无服务器函数服务将限制您使用特定的运行时和版本。一些无服务器函数服务允许自定义运行时,但您仍将被锁定在操作系统中。
  • 故障排除 —— 容器让您可以轻松进入并排除实时环境中发生的问题。它们还允许您在本地运行大部分环境,从而更容易调试正在发生的事情。
  • 长时间运行的任务 —— 无服务器容器是始终运行的,最适合长时间运行计算任务。大多数无服务器函数都会对函数的执行时间有限制。例如,在撰写本文时,AWS Lambda 有 15 分钟的限制。

无服务器函数的优势

  • 降低突发工作负载的成本 —— 无服务器函数是按调用付费的,这意味着您只需在代码实际执行时付费。这意味着对于不经常运行的工作负载,与典型的服务器或容器相比,它们可以便宜得多。
  • 快速扩展 —— 无服务器函数服务可以创建一个新的函数实例,并在几秒钟内(有时只需几分之一秒)就可以为流量提供服务。这有一定的限制,您可以在下面的「扩展无服务器函数」部分中看到有关这些限制的更多讨论。
  • 细粒度的可扩展性 —— 假设你有一个由几十个不同的无服务器函数组成的应用程序,其中一个函数的调用次数是其它函数的 1000 倍。该功能将独立于您的其它功能进行缩放,您甚至不必考虑它。

无服务器容器的缺点

  • 更重的部署 —— 无服务器容器通常需要一个大的构建步骤,然后您必须将数百兆字节的容器推送到您在云端的存储库。然后你必须在你的集群中部署你的容器,如果你有大型部署,这可能需要一段时间。这个周转时间比推动单个云函数并在几秒钟内启动并开始服务请求要长得多。
  • 粗略的可扩展性 —— 当你部署一个无服务器函数时,你实际上只是部署了一个函数。该函数可以执行多项任务,但通常您正在部署一个单一用途的函数,该函数可以独立于所有其它函数进行扩展。当您部署无服务器容器时,您通常会部署整个应用程序或微服务。该应用程序或微服务中的所有功能都将部署到单个容器中,因此为了扩展它,您必须启动该容器的更多实例。这意味着整个软件模块都可以作为一个单元进行扩展。如果您的部分应用程序突然出现大量访问,那么您必须扩展整个模块以增加您可以服务的流量。

无服务器函数云的缺点

  • 缺乏控制 —— 有人管理你的代码运行的服务器。您的代码在操作系统中运行,而不是您可以控制的操作系统。
  • 专有的 —— 无服务器函数没有任何真正的行业标准。因此,您通常使用特定服务商的工具和接口来编写无服务器应用程序。使用 AWS step 函数之类的工具可以与服务商建立强大的联系,因为跨无服务器函数的编排现在根本不是标准的。这可以让您更深入地了解特定服务商的生态系统,并使其更难切换。
  • 重写 —— 使用现有应用程序并使其在无服务器功能中运行通常是不可能的。您几乎总是必须从头开始编写应用程序才能利用无服务器功能。
  • 可追溯性 —— 无服务器功能与微服务具有相同的挑战,但被带到了极端。在您的系统中跟踪单个请求可能涉及数十个无服务器函数。您需要确保使用 AWS X-ray、Google Cloud Trace 或 Azure 中的 Distributed Tracking 等工具。
  • 调试/测试 —— 您可以使用无服务器、Google Function Framework 或 AWS SAM 等工具在本地计算机上相当轻松地运行云函数,但获得真实的调用和反馈可能是一个挑战,因为云函数通常以自动化和专有的方式与云生态系统集成。此外,AWS step 函数等服务在 lambda 之间引入了一个编排层,这会使调试实时环境中发生的情况变得更加困难。
  • 部署 —— 无服务器函数的部署可能是一个挑战,但主要是因为它们提供了鼓励不良行为的工具(如 IDE)。使用无服务器框架可以使您的部署自动化和可管理,但您需要确保您努力维护好代码设置并保持其井井有条,否则版本控制和维护数十或数百个函数将成为真正的痛苦。

无服务器计算的终极理想

无服务器计算的终极理想是真正的「普适计算」。当我需要它们时,我的所有资源都可用,因为我需要它们。能够上传一大段代码(无论是单个函数还是整个应用程序)以及一些元数据,并让它以允许无限扩展的方式运行(有一些安全限制)。根本不必考虑它需要多少内存、存储或计算,它只是自动计算出来。无服务器函数实际上比无服务器容器更接近这一理想,但由于上述原因,它们仍然没有达到这个终极理想。

相关文章:

  • C#实验二
  • 熟悉c语言结构体
  • uboot源码分析(基于S5PV210)之启动第二阶段
  • 【分布式】分布式系统、Redis中间件 、Cache穿透、击穿、雪崩
  • Rust基础语法
  • 电子知识学习网站
  • 全站最简单 “数据滚动可视化大屏” 【JS基础拿来即用】
  • Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(开发导航栏及公共部分)
  • ScalableViT网络模型
  • Nginx配置流数据转发指导
  • 【单细胞高级绘图】10.KEGG富集结果的圆圈图
  • 怎样在应用中实现自助报表功能?
  • 生成指定位数的随机验证码
  • 线性布局和相对布局
  • 高级数据结构——红黑树
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Angular 响应式表单之下拉框
  • Apache的80端口被占用以及访问时报错403
  • canvas 五子棋游戏
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux CTF 逆向入门
  • Travix是如何部署应用程序到Kubernetes上的
  • Windows Containers 大冒险: 容器网络
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 高度不固定时垂直居中
  • 规范化安全开发 KOA 手脚架
  • 后端_ThinkPHP5
  • 解析带emoji和链接的聊天系统消息
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 以太坊客户端Geth命令参数详解
  • Python 之网络式编程
  • ​Spring Boot 分片上传文件
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (理论篇)httpmoudle和httphandler一览
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)mysql_MYSQL(三)
  • (十一)图像的罗伯特梯度锐化
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)kafka实战——kafka源码编译启动
  • (译)2019年前端性能优化清单 — 下篇
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .gitignore文件设置了忽略但不生效
  • .NET 事件模型教程(二)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net的C#语言取月份数值对应的MonthName值
  • @Autowired和@Resource装配
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [20190401]关于semtimedop函数调用.txt
  • [cb]UIGrid+UIStretch的自适应
  • [CISCN2019 华东南赛区]Web11