Serverless无服务

news2024/11/18 21:28:47

软件工程的本质复杂度和次要复杂度

本质:如何从抽象的问题,发展出具体的概念上的解决方案(业务问题)

次要:指实现它的过程(技术手段)

过去解决了的次要复杂度(提升研发效率)

高级语言

分时系统

开发环境(ide)

什么是云的原生编程模型?怎么样做到在云上的应用开发效率得到10倍的提升?

我想并行处理n个文件该怎么做?

  1. 编写处理文件的代码

  2. 创建包含工作队列的线程池,提交任务

本质复杂度:

  1. 实现文件处理程序

次要复杂度;

  1. 实现线程池

  2. 高性能的工作队列

  3. 线程池资源管理

  4. 操作系统调度

扩展这个问题,让这个处理程序是分布式的,应该怎么做?

问题:

  1. 需要多少台server

  2. 如何处理宕机

  3. 文件的大小不同如何实现负载均衡

  4. 怎么确保不同机器上的任务被可靠地执行

  5. ....

本质复杂度:

  1. 实现文件处理程序

次要复杂度:

  1. server相关的操作(类似自己实现线程池的这类问题)

对于分布式应用来说,这个程序的复杂度和汇编语言类似,次要复杂度>>本质复杂度

如何减少次要复杂度?

  1. 使用消息队列、函数等更高抽象原语设计解决方案

  2. 使用serverless计算服务,自动启动、调度实例

  3. 使用全托管对象存储服务,用于存储

  4. 上传代码包/镜像,调用任务,查看结果,查看日志,暂停/终止服务

去除掉server概念

云计算和Serverless

云计算的发展史就是serverless的兴起史

物理机时代=>虚拟机时代=>容器时代=>serverless时代

物理机时代

物理机时代面临的最大的问题是服务器硬件问题、维护问题、人力问题

虚拟机时代

iaas解决了物理机时代的硬件问题,paas解决了维护问题,单机应用也升级成了群体应用,服务器负责计算,paas中间件负责存储、调度等功能,同时也出现了新的问题,多台机器下环境的一致性

容器时代

容器时代解决了统一运行环境的问题,同时又出现了新的问题,需要规划节点pod中cpu、内存、磁盘的资源,需要编写复杂的yaml去部署pod,需要学习专业的运维知识。

serverless时代

serverless指构建和运行不要服务器管理的一种概念

前面三种架构都是属于serverful,就像第一节中提到的,需要处理各种次要复杂度,像是用汇编语言进行编程。而serverless架构就像用python等高级语言进行编程

目前serverless的实现 faas + baas

faas: 提供运行函数代码的能力,并具有自动弹性伸缩

baas: 将后端能力封装成服务,并以接口的形式提供服务

serverless的出现让我们可以不再关心传统的运维工作,专注解决业务实现,以更快的速度更低的成本完成应用的开发迭代,进而创造出更大的价值,

Faas、Baas

特点:

  1. 不用运维

  2. 事件驱动

  3. 按量付费

  4. 弹性伸缩

  5. 无状态

云原生指的是原生为云的设计架构模式,serverless是云原生的一种实现,k8s是云原生的另一种实现。

serverless的缺点:

  1. 云厂商绑定

  2. 底层硬件多样性(看你的代码是否依赖底层硬件)

  3. 冷启动有时间

  4. 函数通信效率低

  5. 开发调试较复杂

尝试第一个云函数

这里尝试的是阿里云的云函数,使用的是阿里云牵头的serverless-devs框架来部署。对比腾讯云的serverless-cli,erverless-devs号称是更具有通用性,无云厂商绑定。但其实所有的兼容都是有代价的,serverless-devs就依赖对其他云厂商组件的兼容,腾讯云的代码上次更新还是21年,自家的最近更新是今年,懂得都懂。

serverless-devs提供了整个云函数的生命周期方法,部署镜像时会先build再push到你的镜像仓库,还是非常方便的。同时也提供的CI/CD的配置。(说是通用,但非常依赖他的组件代码,若想在腾讯云上实现自动推镜像拉取部署,建议还是用腾讯云的serverless-cli)

文档 - Serverless Devs - Serverless 应用全生命周期管理工具 / Serverless 中文社区

# ------------------------------------
#   If you need English case, you can refer to [s_en.yaml] file
# ------------------------------------
#   欢迎您使用阿里云函数计算 FC 组件进行项目开发
#   组件仓库地址:https://github.com/devsapp/fc
#   组件帮助文档:https://www.serverless-devs.com/fc/readme
#   Yaml参考文档:https://www.serverless-devs.com/fc/yaml/readme
#   关于:
#      - Serverless Devs和FC组件的关系、如何声明/部署多个函数、超过50M的代码包如何部署
#      - 关于.fcignore使用方法、工具中.s目录是做什么、函数进行build操作之后如何处理build的产物
#   等问题,可以参考文档:https://www.serverless-devs.com/fc/tips
#   关于如何做CICD等问题,可以参考:https://www.serverless-devs.com/serverless-devs/cicd
#   关于如何进行环境划分等问题,可以参考:https://www.serverless-devs.com/serverless-devs/extend
#   更多函数计算案例,可参考:https://github.com/devsapp/awesome/
#   有问题快来钉钉群问一下吧:33947367
# ------------------------------------
edition: 1.0.0
name: hello-world-app
# access 是当前应用所需要的密钥信息配置:
# 密钥配置可以参考:https://www.serverless-devs.com/serverless-devs/command/config
# 密钥使用顺序可以参考:https://www.serverless-devs.com/serverless-devs/tool#密钥使用顺序与规范
access: "yaods-aliyun-fc"

vars: # 全局变量
  region: "cn-hangzhou"
  service:
    name: "widget-api"
    description: 'hello world by serverless devs'

services:
  widget: # 业务名称/模块名称
    # 如果只想针对 helloworld 下面的业务进行相关操作,可以在命令行中加上 helloworld,例如:
    # 只对helloworld进行构建:s helloworld build
    # 如果不带有 helloworld ,而是直接执行 s build,工具则会对当前Yaml下,所有和 helloworld 平级的业务模块(如有其他平级的模块,例如下面注释的next-function),按照一定顺序进行 build 操作
    component: fc # 组件名称,Serverless Devs 工具本身类似于一种游戏机,不具备具体的业务能力,组件类似于游戏卡,用户通过向游戏机中插入不同的游戏卡实现不同的功能,即通过使用不同的组件实现不同的具体业务能力
    actions: # 自定义执行逻辑,关于actions 的使用,可以参考:https://www.serverless-devs.com/serverless-devs/yaml#行为描述
      pre-deploy: # 在deploy之前运行
        - component: fc build --use-docker --dockerfile ./code/Dockerfile # 要运行的组件,格式为【component: 组件名 命令 参数】(可以通过s cli registry search --type Component 获取组件列表)
    #        - run: docker build xxx          # 要执行的系统命令,类似于一种钩子的形式
    #          path: ./src                    # 执行系统命令/钩子的路径
    #        - plugin: myplugin               # 与运行的插件 (可以通过s cli registry search --type Plugin 获取组件列表)
    #          args:                          # 插件的参数信息
    #            testKey: testValue
    #      post-deploy: # 在deploy之后运行
    #        - component: fc versions publish # 要运行的命令行
    props:
      region: ${vars.region} # 关于变量的使用方法,可以参考:https://www.serverless-devs.com/serverless-devs/yaml#变量赋值
      service: ${vars.service}
      function:
        name: "custom-python39-event-function"
        description: 'hello world by serverless devs'
        caPort: 9000
        memorySize: 128
        timeout: 60
        runtime: custom-container
        customContainerConfig:
          image: "registry.cn-hangzhou.aliyuncs.com/yaods/widget:latest"
        codeUri: ./code
      triggers:
        - name: httpTrigger
          type: http
          config:
            authType: anonymous
            methods:
              - GET
      customDomains:
        - domainName: auto
          protocol: HTTP
          routeConfigs:
            - path: /*
              methods:
                - GET
                - POST

#  next-function: # 第二个函数的案例,仅供参考
#    # 如果在当前项目下执行 s deploy,会同时部署模块:
#    #   helloworld:服务widget-api,函数cpp-event-function
#    #   next-function:服务widget-api,函数next-function-example
#    # 如果想单独部署当前服务与函数,可以执行 s + 模块名/业务名 + deploy,例如:s next-function deploy
#    # 如果想单独部署当前函数,可以执行 s + 模块名/业务名 + deploy function,例如:s next-function deploy function
#    # 更多命令可参考:https://www.serverless-devs.com/fc/readme#文档相关
#    component: fc
#    props:
#      region: ${vars.region}
#      service: ${vars.service} # 应用整体的服务配置
#      function: # 定义一个新的函数
#        name: next-function-example
#        description: 'hello world by serverless devs'

思考

无论是serverless还是最近的人工智能,对于实现本质问题的效率会越来越高,成本越来越低,你会用这些去做什么呢?

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

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

相关文章

代币中的decimal精度代表了什么

精度的意义在于允许发送小数的代币。举例,一个CAT代币合约的精度为6。那么 你拥有1个CAT就意味着合约中的balance 1 * 10^6 , 转账 0.1CAT出去的话,就需要输入 0.1*10^6 10^5。 也就时在涉及代币时,查询到的余额、转账的代币数量 都和 代币…

用通俗易懂的方式讲解大模型分布式训练并行技术:MOE并行

前面的文章中讲述了数据并行、流水线并行、张量并行、序列并行、自动并行等多种并行技术。但现在的模型越来越大,训练样本越来越多,每个样本都需要经过模型的全部计算,这就导致了训练成本的平方级增长。 而当我们希望在牺牲极少的计算效率的…

使用numpy处理图片——90度旋转

在《使用numpy处理图片——镜像翻转和旋转》一文中,我们介绍了如何将图片旋转的方法。本文将使用更简单的方法旋转图片90度。 左旋转90度 import numpy as np import PIL.Image as Imagedata np.array(Image.open(the_starry_night.jpg))# left 90 rot90LeftWith…

电子学会C/C++编程等级考试2020年12月(二级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导 文章目录 鸿蒙HarmonyOS兼容JS的类Web开发-开发指导常用组件开发指导list开发指导创建list组件添加滚动条添加侧边索引栏实现列表折叠和展开场景示例 dialog开发指导创建dialog组件设置弹窗响应场景示例 form开发指导创建form组件实现…

一个完整的流程表单流转

1.写在前面 一个完整的流程表单审批&#xff08;起表单-->各环节审批-->回退-->重新审批-->完成&#xff09;&#xff0c;前端由Vue2jsElement UI升级为Vue3tsElement Plus&#xff0c;后端流程框架使用Flowable&#xff0c;项目参考了ruoyi-vue-pro(https://gite…

使用python读取yaml文件数据

使用python读取yaml文件&#xff1a; yaml文件数据&#xff1a;data.yaml login_data:url: http://www.baidu.comcase1:user1: password1: 12345errorText: 请输入用户名case2:user2: adminpassword2: errorText: 请输入密码case3:user3: adminpassword3: 123456errorText: 登…

视频监控设备通过onvif协议接入到视频监控平台

目 录 一、什么是onvif规范 1、onvif的定义 2、onvif的优势 二、AS-V1000监控平台对onvif的支持程度 二、通过onvif接入视频监控设备 1、onvif维护主页面 2、设备发现 3、设备验证 4、设备录入系统 5、通道配置 6、权限分配 三、对onvif设备进行…

【设计模式-6】建造者模式的实现与框架中的应用

建造者模式又被成为生成器模式&#xff0c;是一种使用频率比较低&#xff0c;相对复杂的创建型模式&#xff0c;在很多源码框架中可以看到建造者的使用场景&#xff0c;稍后我们会在本文末尾展示几个框架的使用案例。  建造者模式所构造的对象通常是比较复杂而且庞大的&#x…

C++ n皇后问题 || 深度优先搜索模版题

n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n 。 …

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码 HttpClient、HttpURLConnection、OkHttpClient区别切换HttpClient 源码分析总结切换HttpClient源码验证切换是否成功okHttpClient 切换源码分析总结 okHttpClient 切换源码同时开启 okHttp 与httpClient 会…

【数字人】8、EAT | 为数字人引入情感表情(ICCV2023)

论文&#xff1a;Efficient Emotional Adaptation for Audio-Driven Talking-Head Generation 代码&#xff1a;https://yuangan.github.io/eat/ 出处&#xff1a;ICCV2023 特点&#xff1a;能引入表情&#xff0c;但无法眨眼&#xff0c;需要 音频 pose 图片 同时作为输入…

Java文件自动生成文档

说明 此文章根据Gemini Pro 生成资料整理。 生成文档 javadoc -d mydoc -author -version HelloWorld.java javadoc -d mydoc -author -version HelloWorld.java 命令用于生成 Java 源文件的javadoc文档&#xff0c;并将javadoc文档输出到 mydoc 目录中。 javadoc&#xf…

Linux学习之网络编程2(socket,简单C/S模型)

写在前面 Linux网络编程我是看视频学的&#xff0c;Linux网络编程&#xff0c;看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 网络字节序 小端法&#xff1a;pc本地存储&#xff0c;高位存高地址&#xff0c;低位存低地…

AI技术已经发现了一种新材料,可以在电池制造中减少对锂的需求

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Docker 安装:在linux系统CentOS7 版本 安装Docker

目录 一&#xff0c;Docker介绍&#xff1a; 1.1Docker是什么&#xff1f; 1.2Docker组成 二&#xff0c;Docker安装&#xff1a; 三&#xff0c;Docker基本使用 3.1服务 3.2镜像 3.3容器 &#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&am…

UniApp调试支付宝沙箱(安卓)

先看下这里完整的交互的图&#xff1a;小程序文档 - 支付宝文档中心 一、打包 不管怎样&#xff0c;先打个包先。可以直接使用云端证书、云端打包&#xff0c;只需要指定包名即可。 二、在支付宝开放平台创建应用 这个参考官方的过程就可以了&#xff0c;只要有刚才打的包&…

【REST2SQL】08 日志重构增加输出到文件log.txt

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 原来…

解决:ModuleNotFoundError: No module named ‘pymysql’

解决&#xff1a;ModuleNotFoundError: No module named ‘pymysql’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named pymysql背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&#xff0c;…

php多小区智慧物业管理系统源码带文字安装教程

多小区智慧物业管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 统计分析以小区为单位&#xff0c;统计如下数据&#xff1a;小区总栋数、小区总户数、小区总人数、 小区租户数量、小区每月收费金额统计、小区车位统计、小…