Serverless无服务

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

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

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

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

高级语言

分时系统

开发环境(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: 9000memorySize: 128timeout: 60runtime: custom-containercustomContainerConfig:image: "registry.cn-hangzhou.aliyuncs.com/yaods/widget:latest"codeUri: ./codetriggers:- name: httpTriggertype: httpconfig:authType: anonymousmethods:- GETcustomDomains:- domainName: autoprotocol: HTTProuteConfigs:- 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.hqwc.cn/news/343389.html

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

相关文章

力扣刷题记录(28)LeetCode:797、200、463

797. 所有可能的路径 解题思路&#xff1a;回溯算法&#xff0c;当收集到的路径的最后一个值等于n-1时&#xff0c;收集答案。 参数&#xff1a;图、当前结点 class Solution { public:vector<int> path;vector<vector<int>> ans;void dfs(vector<vector…

Spring MVC 异常处理器

异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处…

使用Linux安装Mysql Community Server 8.0.35

一、下载Mysql 官网&#xff1a;https://www.mysql.com/ 第一步&#xff1a;进入Linux官网&#xff0c;点击下载 第二步&#xff1a;点击MySQL Community (GPL) Downloads 第三步&#xff1a;进入页面&#xff0c;选择 MySQL Community Server 第四步&#xff1a;根据自己服务…

python使用pyinstaller一键打包函数源码,自用源码

文章目录 📖 介绍 📖🏡 环境 🏡📒 源码 📒⚓️ 相关链接 ⚓️📖 介绍 📖 本文记录一个python使用pyinstaller一键打包的自用函数源码,仅供个人使用!因为源码部分参数是个人项目中设定的,您可能不适用 🏡 环境 🏡 本文演示环境如下,由于测试条件有限,不…

Skywalking UI页面中操作的各种实用功能汇总

刚刚接触skywalking不久&#xff0c;在这里总结一下在UI页面中操作的各种实用功能&#xff0c;随着使用的不断深入&#xff0c;我也会对文章进行持续补充。 本文skywalking 的ui入口是官方demo &#xff0c;版本是10.0.0-SNAPSHOT-593bd05 http://demo.skywalking.apache.org…

SSM整合(实现简单查询功能)

在名为ssm的数据库内创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 创建工程 pom.xml <?xml version"1.0" encoding&quo…

持久双向通信网络协议-WebSocket-入门案例实现demo

1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接&#xff0…

Visual Studio 2019 ctrl+f 呼出查找和替换窗口

有时候 ctrlshiftf 呼出查找和替换窗口不起作用&#xff0c;可能和其它程序的快捷键冲突&#xff0c;解决方案&#xff1a; ------------英文版本------------ 依次点击VS菜单栏中的 Tools - Options - Environment - Keyboard: 1. 在右侧的 Show commands containing: 文本框输…

使用BeanShell写入内容到文件【JMeter】

一、前言 ​ 在我们日常工作中&#xff0c;可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时&#xff0c;就经常能够遇到这种情况。要想达到这种目的&#xff0c;我们一般采取BeanShell后置处理器来将内容写入到文件。 二、提取 ​ 在目前大多数的…

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

Python-动态烟花【附完整源码】

烟花代码 运行效果&#xff1a;Python动态烟花代码 import pygame from random import randint from random import uniform from random import choice import math vector pygame.math.Vector2 # 重力变量 gravity vector(0, 0.3) # 控制窗口的大小 DISPLAY_WIDTH DISP…

《BackTrader量化交易图解》第10章:Trade 交易操作

文章目录 10 Trade 交易操作10.1 量化回测分析流程10.2 Cerebro 类模块10.3 案例&#xff1a;Trade 交易10.4 实盘交易机器隐性规则10.5 Stake 交易数额和 Trade 交易执行价格 10 Trade 交易操作 10.1 量化回测分析流程 从本章开始讲解 BackTrader 的实盘操作。前面的章节讲过…