FaaS 或者说serverless是一种云计算模型,其主要特点是用户根本不需要租用任何虚拟机ーー从启动虚拟机,执行代码,返回结果和停止虚拟机这些由云提供商处理的整个过程。这比其他云计算实现更具成本效益。它还使开发人员能够更加专注于开发业务逻辑,因为应用程序的某些部分由云提供程序处理。

要启动执行代码的整个过程,必须触发它。触发器可以是一个特定的事件,也可以是对API 管理系统的请求,然后将该代码作为API 端点公开。

最流行的serverless服务之一是 AWS Lambda,它可以与AWS API 网关集成,创建一个serverless的RESTAPI。

REST API配置


API的配置将由AWS API 网关处理。这包括创建路由、处理输入和输出格式、身份验证等等,而实际代码将由Lambda 管理。

当开启 API 网关仪表板时,为您的网站创建一个新的API。然后,单击操作创建资源在API 中创建一个新的URL 路径。每个资源都可以支持一个或多个方法(GET,POST,put/ patch,DELETE) ,这些方法通过Actions > Create Method来添加。

例如,我们可以创建一个名为"post"的资源,它的路径是"/posts",它有两种方法:

  • GET —      fetch all posts 把所有的帖子都拿来

  • POST —      create a new post 创建一个新的帖子

在这一点上,屏幕应该是这样的:

还需要处理显示一个单一的帖子,更新一个帖子和删除一个帖子。这些操作在REST API 中会有一个不同的路径,这意味着需要创建一个新的资源。由于这个资源的路径是"/posts / { post id }",因此它将作为一个子资源创建。要做到这一点,首先单击"posts"资源,然后去操作创建资源。这个资源将在路径(post的 ID)中有一个参数,可以通过将参数名包装为"/posts / { post ID }"的括号来实现。创建资源后,将GET、 PUT 和DELETE 方法添加到其中。

API 现在看起来是这样的:

每个方法将执行相应的AWS Lambda 函数。先创建这些函数,然后将它们映射到适当的API 方法。

创建 Lambda 函数


点击AWS Lambda,点击"Create a Lambdafunction"。下一个屏幕允许选择编程语言(Node.js或 Python)和预定义的模板之一。选择microservice-http-endpoint,然后在下面的页面中选择API 名称。也可以选择空白函数,并且不用任何预先编写的代码来编写它。

最后,在可以插入代码的页面。可以直接在页面上写这个函数,或者将它作为压缩存档上传(如果它包含自定义库,则需要)。当我们使用预定义模板时,函数是自动生成的,看起来是这样的:

from __future__ importprint_function

import boto3

import json

print('Loading function')

def respond(err,res=None):

return {

'statusCode': '400' if err else '200',

'body': err.message if err elsejson.dumps(res),

'headers': {

'Content-Type': 'application/json',

},

}

def lambda_handler(event,context):

'''Demonstrates a simple HTTP endpointusing API Gateway. You have full

access to the request and response payload,including headers and

status code.

To scan a DynamoDB table, make a GETrequest with the TableName as a

query string parameter. To put, update, ordelete an item, make a POST,

PUT, or DELETE request respectively,passing in the payload to the

DynamoDB API as a JSON body.

'''

#print("Received event: " +json.dumps(event, indent=2))

operations = {

'DELETE': lambda dynamo, x:dynamo.delete_item(**x),

'GET': lambda dynamo, x:dynamo.scan(**x),

'POST': lambda dynamo, x:dynamo.put_item(**x),

'PUT': lambda dynamo, x:dynamo.update_item(**x),

}

operation = event['httpMethod']

if operation in operations:

payload = event['queryStringParameters']if operation == 'GET' else json.loads(event['body'])

dynamo =boto3.resource('dynamodb').Table(payload['TableName'])

return respond(None,operations[operation](dynamo, payload))

else:

returnrespond(ValueError('Unsupported method "{}"'.format(operation)))

虽然大多数情况下不需要很多代码(许多人会使用关系数据库而不是NoSQL DynamoDB 数据库) ,但它为如何访问HTTP 请求参数和如何输出响应设置了一个很好的例子。

在创建Lambda 函数时需要注意的另一件事是handler字段。它告诉Lambda 要执行哪个函数,以及函数所在的文件。例如,如果main.py 文件中有一个名为"myfunction"的函数,那么处理程序的值将是"main.myfunction"。在创建函数之后,它们可以映射到相应的API 端点。



要使API 调用 Lambda 函数,请单击一个API 方法,然后进入集成请求。在该页上,将集成类型设置为Lambda 函数,并输入您的亚马逊区域和所需函数的名称。对于所有的API 方法都这样做。

在部署之前,可以测试API。每个API 方法都有一个测试按钮,它将执行它并显示输出。

一旦一切准备就绪,去action Deploy API 部署你的REST API。第一次,需要创造一个新的阶段(例如,它可以被称为prod 或生产),就像一个部署环境。可以有多个阶段,不同的阶段有不同的基础url 和配置。可以在屏幕左侧的Mywebsite API Stages 下找到各个阶段。点击该阶段的名称以获取API 的公共 URL,以及其他配置选项,如缓存和节流。

这里展示了一个基本的例子,一个serverless的REST API,使用AWS API 网关和Lambda 构建。它展示了如何在不需要开发常见的API 管理特性的情况下轻松地创建REST API,比如认证、路由、缓存和速率限制等。

更进一步, 物联网的快速采用受到正在通过技术创新改变其业务的公司的支持; 制造商正在提供低成本和高端的设备和物联网平台,使设备集成和管理成为可能。物联网应该转向灵活、可靠和高成本效益的平台,而在基础设施、软件、知识和员工方面投入最少。

IoT的无服务架构

如何从零开始构建一个物联网解决方案,它的基础设施和维护成本为零,只需要很少的营运成本。为了实现这个概念,可以使用AWS的云功能。 例如,创建实时报告遥测数据的设备模拟器,并通过 API 实时访问这些信息。

AWS IoT 平台是一个强大的物联网框架。 它支持 MQTT 协议,MQTT 协议是应用最广泛的通信协议之一。 选择支持持久化和处理数据的服务也是基于其定价和维护成本。

AWS中所使用的组件列表如下:

  • AWS IoT : 用于数据收集和设备管理,

  • DynamoDB: 文档存储以持久化数据读数,

  • AWS Lambda : 无服务器数据处理,

  • S3:用作静态网站托管的块存储,

  • Gateway API :REST 访问数据

总体数据流是以下方式工作的:

  1. 设备向 AWS IoT 发送小量数据(每5秒) ,

  2. 物联网将数据存储到 DynamoDB 表中*

  3. Lambda函数每分钟和每小时被触发去做数据分析并将结果存储回 DynamoDB,

  4. API Gateway 通过 REST API 将 DynamoDB 的数据公开

  5. 静态 HTML 网站托管在 S3上,并使用 RESTAPI 来显示实时数据图表和分析

第二点乍看起来可能有点傻,因为可能会认为 DynamoDB 不是存储原始时间序列数据的最佳选择。 然而,这里是为了演示的目的。可以考虑使用 Firehose 作为从物联网到 S3/reshift 和 EMR 集群的传输流来进行数据处理,但对于这个简单实践而言,这里只是一个临时的做法。

架构设置了以下关键参数:

  • 免费,如果没有设备报告任何数据。 另外,通过亚马逊的免费版,可以免费获得少量的资源

  • 由于每个选定组件的性质,高度可扩展且可以从AWS中获取

  • 启动只需的最基本知识,只需要定义规则和用一种非常流行的语言编写逻辑: JavaScript,Python 或者 Java

IoT无服务架构的成本分析

假设后端操作每分钟只需要处理几个请求,这意味着大部分时间您的 CPU 处于空闲状态。 假设不想为空闲时间买单。 因此,这里提出了无服务器架构。

假设有10000个设备每15分钟报告一小部分数据,这就导致每月平均730个小时,每月约有2920万个请求。AWS物联网每100万个请求花费5美元,DynamoDB 每秒花费0.0065美元,每秒需要花费50次。

通过 AWS IoT,每月将付出146美元左右的,14美元用于在 DynamoDB 中运行的最小存储容量,总共有160美元,相当于每台设备每月0.02美元或者每次0.000005美元。 尽管这没有考虑到 lambda、存储器和 API 网关的使用,但它们实际上只是这些数字的一小部分,因此可以省略。

这是令人印象深刻的。物联网解决方案与数以千计的设备连接,这将花费不到200美元每月。 然而,让我们想象一下,如果一个企业的设备每秒钟都在报告关键数据(而不是每隔15分钟) ,而且有成千上万的数据。 还愿意为FaaS付多少钱呢?

如果一万台设备每秒发送一条消息,月付款将超过1.36万美元。如果是10万台设备, 每月每台设备的费用增加到13.61美元,还是挺贵的。

无服务架构IoT方案的优缺点

所有这些数字意味着优化的请求率将会立即和几乎线性地导致月度费用减少。这就带来了必须考虑的第二个重要结论,即所有权的总成本。 有一个虚拟的门槛值,超过这个阈值,无关紧要的方法就会变得非常昂贵,而且可能不会有效。

例如,传统的体系结构实现成本可能不是很大程度上取决于设备的数量或每秒请求的数量,而是取决于额外的运营费用,使用开源解决方案也可以降低成本。

毫无疑问,无服务架构有许多优点:

  • 它将资本支出转化为经营支出,并通常降低经营成本;

  • 不必考虑内部系统管理流程;

  • 它减少了开发和部署成本和时间框架(更快的上市时间) ;

  • 它具有可扩展性和容错性

要考虑的第一个因素是为项目的需求, 如果不关心云锁定,而且是一家创业公司,需要快速验证想法,或者有一个很短的时间去营销,或者解决方案不需要频繁地将数据从设备传输到云,因此可以将每台设备的成本保持在相对较低的水平。

另一方面,如果正在构建一个与云无关的、高度可定制的解决方案,并且使用实时数据进行操作,可以考虑使用自定义或开源物联网解决方案。

「本文编译自:

http://www.devx.com/enterprise/creating-a-serverless-api-using-api-gateway-and-lambda.html

https://www.dataart.com/downloads/dataart_white_paper_art_of_low_cost_iot_solution.pdf」

FaaS 的简单实践相关推荐

  1. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  2. Dubbo入门(2) - 简单实践

    作者:不洗碗工作室 - Marklux 出处:Dubbo入门(2) - 简单实践 版权归作者所有,转载请注明出处 在了解什么是分布式框架之后,我们需要上手实践一下,来了解整个系统是如何运作起来的. 本 ...

  3. Redis的简单实践

    Redis的简单实践 文章目录 Redis的简单实践 前言 Redis简介 Redis基本操作命令 Java使用Redis 使用IDEA搭建Redis项目 使用Jedis进行简单增删改查 使用Jedi ...

  4. 深度学习——RNN原理与TensorFlow2下的IMDB简单实践

    在深度学习中,RNN是处理序列数据的有效方法之一,也是深度的一种很好的体现,本文将简单介绍RNN的工作方式,以及针对IMDB数据集的简单实践 RNN简介 RNN(Recurrent Neural Ne ...

  5. Spring 学习二-----AOP的原理与简单实践

    一.Spring  AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...

  6. C++(11)--编程实践1-经典养成类游戏简单实践

    经典养成类游戏简单实践-小公主养成记 <老九学堂C++课程>学习笔记.<老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> ------------ ...

  7. MachineLearning(8)-PCA,LDA基础+sklearn 简单实践

    PCA,LDA基础+sklearn 简单实践 1.PCA+sklearn.decomposition.PCA 1.PCA理论基础 2.sklearn.decomposition.PCA简单实践 2.L ...

  8. MachineLearning(7)-决策树基础+sklearn.DecisionTreeClassifier简单实践

    sklearn.DecisionTreeClassifier决策树简单使用 1.决策树算法基础 2.sklearn.DecisionTreeClassifier简单实践 2.1 决策树类 2.3 决策 ...

  9. 【区块链】以太坊truffle+web3+ganache简单实践

    以太坊truffle+web3+ganache简单实践 安装 帮助文档 结构 代码 solidity代码 html 注意 安装 下载最新版nodejs npm install -g truffle 下 ...

最新文章

  1. Setting the Reply-To Header in an Email using CDONTS.NewMail Object and CDO Message
  2. 关于如何解决解决The SDK platform-tools version ((25.0.3)) is too old to check APIs compiled with API 26...
  3. Forefront Security For Exchange文件传送限制测试
  4. (数据结构与算法)单链表与双链表增删改查的实现。
  5. s7 200 java_java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
  6. rsync+lsyncd实现(本地以及远程)文件实时同步
  7. java iterator_Java ArrayDeque iterator()方法与示例
  8. C/C++函数指针与回调函数总结(函数指针数组)
  9. 系统10网络找不到别人的计算机,分享Win10在局域网中找不到其他电脑的解决步骤...
  10. FastReport的动态页面设置
  11. 如何使用InetAddress在Java中获取IP地址
  12. 车间调度建模系列8|扩展析取图之基于时间片段的赋时三维析取图模型
  13. BMFONT制作位图字体并在CocosCreator中使用
  14. WIFI无线网络技术详细分析
  15. VBR与CBR的区别是什么?
  16. 禁止浏览器自动填充用户名和密码
  17. QT:为图片加当前系统时间水印
  18. PHP 可以利用的危险的函数
  19. 上次被 ArrayList 锤了一拳后,LinkedList 很不服气,做出最后一击
  20. linux ssh 终端退格键,退格键,Tab,Del和箭头键在终端中不起作用(使用ssh)

热门文章

  1. Python 精美俄罗斯方块开源项目
  2. python银行账户资金交易管理_Python实现信用卡系统(支持购物、转账、存取钱)
  3. 在大城市工作,在小城市生活
  4. elastic beats 开发
  5. 听君一席话,如听一席话
  6. 写一个项目的具体流程
  7. PaperType----报告单纸张类型
  8. 常用元器件使用方法8:二选一模拟开关芯片TS5A3154DCUR的使用方法
  9. Nginx下完美解决WordPress伪静态后台404 Not Found nginx
  10. docker容器重启