无服务器架构 - 从使用场景分析其6大特性

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

无服务器架构 - 从使用场景分析其6大特性 博客分类: 架构  

首先我应该提到,“无服务器”技术肯定有服务器涉及。 我只是使用这个术语来描述这种方法和技术,它将任务处理和调度抽象为与服务器管理无关。 在 2012 年为 ReadWrite 撰写的有关软件和应用程序未来的文章中,我将“无服务器”描述如下。

 

短语“无服务器”并不意味着服务器不再涉及。 它只是意味着开发人员不再需要对它们有太多的关注。 计算资源被用作服务,而不必管理物理容量或限制。 服务提供商越来越多地承担管理服务器,数据存储和其他基础设施资源的责任...无服务器架构允许开发人员将重点从服务器级别转移到任务级别。 无服务器解决方案允许开发人员通过消除后端基础架构的复杂性来专注于其应用程序或系统需要做什么。

 

在那篇文章的时候,“无服务器”这个术语并没有受到好评,当时在 Hacker News 的评论中也可以看到。但随着一些无服务器平台的诞生和微服务和事件驱动架构发挥越来越重要地位,这些质疑很幸运的逐渐得到了消退。

 

无服务器架构使用场景示例

 

为了更好理解这个技术,最好基于一个实际使用场景的示例来讨论,因此假设我们要使用无服务器管道来处理电子邮件以及检测垃圾邮件。 它是事件驱动的,因为当电子邮件进来时,它将产生一系列的工作或功能,旨在专门操作该电子邮件。

 

在此管道中,您可能具有执行电子邮件中的文本,图像,链接,邮件属性和其他项目或嵌入对象的解析的任务。 每个项目或元素可能具有不同的处理要求,这又要求一个或多个单独的任务以及甚至其自己的处理流水线或序列。 例如,可以跨越几个不同的处理向量来分析图像链接,以确定图像的内容和真实性。 根据消息评分和结果(是否是垃圾邮件),将采取各种行动,这可能反过来涉及其他无服务器功能。

 

(点击图片可缩放)

 

无服务器架构分析

 

无服务器环境中的基本单位是任务或作业,它是围绕特定工作负载处理的实例化和执行。 任务处理自从编程开始就存在,所以它也不是一个全新的事物。 但是考虑到这些工作负载处理的高度分布的性质和抽象的方式,因此跨过具体的实现层次,并有广泛的理解是必要的。

 

同步与异步

 

虽然处理任务的性质 - 无论是同步还是异步 - 通常是一个平台问题,但它也是在任务级别需要考虑的一个重要因素。 传统的工作和作业处理系统在很大程度上是异步的,这意味着调用进程不保持与执行任务处理组件的持久连接。 作业将排队,因此,它们可能不会立即运行。 调用函数和处理器之间唯一的特定连接将任务排队等待运行。 (注意,某些平台可以允许对任务获得状态,但是通过API调用而不是直接/持久连接)。

 

许多新的无服务器平台允许同步处理,从而保持连接并且客户端在功能正在处理时等待。 同步处理的优点是可以直接从处理平台获得结果,而在异步处理中,获得结果必须作为独立的调用来完成。 我将在平台部分讨论更多细节,虽然一般的规则是同步处理适用于轻量级函数(类似于API调用获得天气信息),而异步处理更多的涉及处理作业(音频转录或作为小批量处理作业的一组事件的处理),以及启动处理的应用/组件/功能不是处理结果的应用/组件/功能的地方。

 

无状态

 

无论处理方法如何,开发微服务和/或无服务器功能的核心原则之一是每个服务或方法应被视为无状态。(小编:无状态也反复在在高可用架构群讨论及分享中提及)。 无状态是指每个任务是一个单独且不同的处理请求,其包含足够的信息来满足该请求。 服务和方法不应存储任何唯一的软件配置或状态。 任何配置数据都应来自方法外部,通常作为任务的一部分或通过平台内的配置服务。 该方法应该仅用于其计算资源,仅用于处理单个工作负载。

 

另外,应当有明显的开始状态和结束状态,并且服务或方法应以相同的方式处理每个任务。 借用一个 principles of clean code, bad code — and bad microservices and serverless functions  [1] 一文中的观点,我们应该聚焦并使用单一责任原则(SRP)[2] 。 思考无服务器函数的一个好方法是每个函数应该有一个且只有一个维度或向量的变化。 换句话说,如果有多种方式可以扩展函数(例如,将检查多个特征的图像分析),则对于每个向量应当存在两个或更多个不同的函数。

 

在我们使用的用例中,每个电子邮件是一个单独的事件,因此每个电子邮件都有一个单独的任务序列。 每个任务将承载为相应的任务或方法提供处理的数据。

 

短生命周期

 

无服务器功能也是短暂的 - 意味着它们持续有限的一段时间。 无服务器应用程序的基础主要围绕事件处理和为这些事件服务时发生的任务处理。 强大的容器技术的出现使得任务可以在分布式环境中处理,并且决定在运行时在何处运行。

 

换句话说,任务处理基本上变成容器处理,其中容器在任务的基础上建立和移除。作为示例,电子邮件处理示例中的每个任务仅持续对特定电子邮件执行特定动作。 完成后,任务和容器应该终止。

 

可能存在需要持久或长时间运行的进程的情况,如实现应用服务器或API服务器,这些场景我们通常放在无服务器范例之外。 在大多数情况下,你觉得可能需要长时间运行的任务,很可能有办法避免这种开销。 例如,无服务器平台,消息队列或其他组件可能能够适应任何路由需求。 同样,计划任务可能能够提供定期状态检查或处理周期。这里的示例是整合和处理来自各种数量的IoT设备的流数据。 如果数据被收集在一个或多个队列或数据库中,则调度作业可以在周期性(和频繁)基础上运行,查看队列中或数据库中的数据,并启动一个或多个子任务以执行每个数据的合并和处理片。

 

(点击图片可缩放)

 

注意,在实际处理场景中,容器可能不会在每个任务之后终止,主要是出于性能原因。 容器可以从任务持续到下一个任务,但是它们的状态和存储将被擦除和重置,使得每个任务或事件处理循环被隔离并且短周期的。

 

幂等

 

幂等是构建到微服务和无服务器函数的关键属性(小编:在高可用架构群讨论及分享中,这一术语也被反复提及)。 在基本级别,能够运行重复的任务并获得相同的结果。它也能够使多个重复的请求具有与单个请求相同的效果。 这是第二个定义,对于任务以高度并发和异步方式操作时的设计至关重要。 在任何作业处理环境中,任务可能由于多种原因(服务器崩溃,资源限制,第三方服务超时,任务超时等)而无法完成。

 

在其他情况下,任务可以完成,但是可能已经调用了针对相同的重复处理请求。 这样的一个示例是注册消息的超时的队列,因为任务可能仍然在处理请求(并且因此没有及时删除或取消保留消息)。 结果,队列可能触发对该消息的另一处理请求。

 

(点击图片可缩放)

 

如果只是简单继续处理这些任务 - 将其放在队列上或将其写入数据库,可能会有不良影响,尤其是在事务情况下。 例如,会产生两个重复的订单。 这是最重要的,然后确保只有一个请求处理相同的任务。 正是由于这个原因,在无服务器平台(如大多数其他处理领域)中,开发人员需要在处理之前和/或在写入或输出结果之前,执行重复任务的检查。

 

(点击图片可缩放)

以一个开发者朋友的话来说,另一种思考方式是“想象一下,如果服务器崩溃,而任务正在中间处理并且任务被重试。 或者,如果它只是排队或安排两次。 你需要做什么,以确保你不会覆盖数据,添加重复的事务,因为它可能会多次运行。” 因此在处理周期中,在适当点检查和验证,以确保尚未执行工作。

 

多语言编程(Polyglot)

 

Polyglot是指以多种语言编程。 在无服务器编程的情况下,它指的是以多种语言编写和执行任务的能力。 虽然每个功能可能只是一种语言,正确的无服务器平台应该能够处理多种语言。 这意味着它还应该提供一个重要级别的代码独立性,使开发人员可以透明地工作,而不必关心操作系统和服务器级依赖关系。

 

多语言的优点是能够在不同的任务中使用合适的工具。 或者,为对应的团队使用适合他们使用的工具。 在实际情况中经常发生的是,如果你拥有一把锤子,你看到一切都像钉子。使用单一语言,常常会约束解决问题的方法。 开发人员可能艰难的适应那种语言的代码包来完成他们的需要,而事实上,其他语言的其他库也许可以更好地服务于目的。

 

为了计算贝叶斯统计或进行机器学习,您可能希望使用用C,C ++,Python或Java编写的包。 同样,与您合作的开发团队可能精通特定的网络爬行包,它是为特定语言编写的(例如以Ruby编写的Nokogiri)。 能够利用这种知识和经验可以消除开发周期,以及降低项目延迟或失败的风险。

 

请注意,许多较新的无服务器平台目前仅支持少数几种语言,但我希望在今年内能够快速改变。 (例如,IronWorker可以处理大多数常用语言和可执行代码。)

 

兼容性

 

无服务器任务需要考虑两个兼容性顺序。 第一个是任务之间,第二个是版本之间。 当你分解任务时候,你需要强大的服务契约和组件之间的规范。 规范的API格式可以通过常用的身份验证和传输协议解决部分问题,但是使用自定义函数和服务,开发人员仍然需要定义有意义且易于理解的输入和输出模式。

 

 

除了干净的接口,开发人员需要解决版本控制需求。 例如,假设函数X在平台内运行,并且它调用函数Y,如果函数Y已经被更新而没有让函数X知道并被正确设计,则它可能在处理时失败或者它可能产生不正确的结果(或者它导致期望原始结果的任务中的下游故障)。

 

与代码包一样,无服务器任务中的更改和更新可以通过应用程序发布。 在代码包的情况下,这些冲突可能会通过打包和编译工具早期发现。 然而,使用微服务和无服务器编程,它可能只是通过运行服务(最好在测试或仿真环境),问题才会被发现。

 

这意味着,所有这些无状态性和任务和服务独立性,团队需要注意不仅设计良好构建的接口,而且解决向后兼容性的意识。 一个帮助可以是在描述/版本化无服务器任务中使用语义版本[3] 。 它不是万能的,但随着这个版本化约定的传播,它为可能正在使用您创建的任务的其他开发人员提供了一些基础。

 

 

参考资源

 

  1. https://blog.goyello.com/2013/01/21/top-9-principles-clean-code/

  2. https://en.wikipedia.org/wiki/Single_responsibility_principle

  3. http://semver.org/

  4. 本文英文原文:http://highscalability.com/blog/2017/1/30/part-1-of-thinking-serverlesshow-new-approaches-address-mode.html

 

https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653548239&idx=1&sn=9202d4d708cfada26d9f9aa1c62aa3c2&chksm=813a7f57b64df6416b9893800a8557405a4505e77ffa5a384fa89e62080a83b131803c7b8a2e&scene=0&key=f813d0a51cab0633f0c54ce756dda54a20169aa6fd606e93640d86a028b100064a448f4d4114cce0cb46e0ac70cc14bf7271069f0f51d79a15ca426f906b70305c53acd8c19801f8c6c052a5a3595d44&ascene=7&uin=MTA4NDY0MzM2MA%3D%3D&devicetype=android-23&version=26050433&nettype=cmnet&abtest_cookie=AQABAAgAAQBGhh4AAAA%3D&pass_ticket=3i02xv%2Bfw9GaA3ePmRRfZAYo1tsLZjJdXU92%2FCpAlqLsmJd9JhrfIuAHQ5c5PDc4&wx_header=1

转载于:https://my.oschina.net/xiaominmin/blog/1599732

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

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

相关文章

Enable Authentication on MongoDB

1、Connect to the server using the mongo shell mongo mongodb://localhost:270172、Create the user administrator Change to the admin database: use admindb.createUser({user: "Admin",pwd: "Admin123",roles: [ { role: "userAdminAnyDataba…

windows驱动程序编写_如何在Windows中回滚驱动程序

windows驱动程序编写Updating a driver on your PC doesn’t always work out well. Sometimes, they introduce bugs or simply don’t run as well as the version they replaced. Luckily, Windows makes it easy to roll back to a previous driver in Windows 10. Here’s…

在Windows 7中的Windows Media Player 12中快速预览歌曲

Do you ever wish you could quickly preview a song without having to play it? Today we look at a quick and easy way to do that in Windows Media Player 12. 您是否曾经希望无需播放就可以快速预览歌曲? 今天,我们探讨一种在Windows Media Play…

Vue.js中的8种组件间的通信方式;3个组件实例是前6种通信的实例,组件直接复制粘贴即可看到运行结果

文章目录一、$children / $parent二、props / $emit三、eventBus四、ref五、provide / reject六、$attrs / $listeners七、localStorage / sessionStorage八、Vuex实例以element ui为例。例子从上往下逐渐变复杂(后面例子没有删前面的无用代码,有时间重新…

不可思议的混合模式 background-blend-mode

本文接前文:不可思议的混合模式 mix-blend-mode 。由于 mix-blend-mode 这个属性的强大,很多应用场景和动效的制作不断完善和被发掘出来,遂另起一文继续介绍一些使用 mix-blend-mode 制作的酷炫动画。 CSS3 新增了一个很有意思的属性 -- mix-…

如何更改从Outlook发送的电子邮件中的“答复”地址

If you’re sending an email on behalf of someone else, you might want people to reply to that person instead of you. Microsoft Outlook gives you the option to choose a different default Reply address to cover this situation. 如果您要代表其他人发送电子邮件&…

在Windows 7或Vista资源管理器中禁用缩略图预览

If you want to speed up browsing around in explorer, you might think about disabling thumbnail previews in folders. 如果要加快在资源管理器中的浏览速度,可以考虑禁用文件夹中的缩略图预览。 Note that this works in Windows 7 or Vista 请注意&#xf…

mysql 表数据转储_在MySQL中仅将表结构转储到文件中

mysql 表数据转储For this exercise, we will use the mysqldump utility the same as if we were backing up the entire database. 在本练习中,我们将像备份整个数据库一样使用mysqldump实用程序。 Syntax: 句法: mysqldump -d -h localhost -u root -…

lenos快速开发脚手架

2019独角兽企业重金招聘Python工程师标准>>> lenos一款快速开发模块化脚手架, lenos(p为spring boot版本扩展名)一款快速开发模块化脚手架,采用spring bootspringSpringMvcmybatisshiroswaggerehcachequartzfreemarkerlayui技术开发&#xff…

火狐ok谷歌适配_“ OK Google”在锁定手机上的安全性越来越高

火狐ok谷歌适配If you use “OK Google” to invoke the Assistant on your phone, things are about to change. Google is removing the “Unlock with Voice Match” feature, so the Assistant is going to get a lot more secure. 如果您使用“确定Google”在手机上调用助…

angular ng-zorro 用组件自身方的法来重置表单校验

官网文档的API并没有提供对应的重置表单校验函数の说明,在控制台打印this.validateForm(校验表单对象) 往往我们只关注亮色函数、属性,而这次重置函数藏在__prop__中! 激动万分的使用 this.validateForm.reset()&…

Django用户注册、登录、注销(一)

使用Django自带的用户认证系统编写认证、登录、注销基本功能 功能: 使用Django默认的User表 1)注册 判断是否已存在此用户,存在的话提示报错“用户已存在”; 判断两次输入的密码是否一致,不一致的话提示报错“密码不一…

如何在PowerPoint中自动调整图片大小

PowerPoint can automatically resize an image to fit a shape. You can also resize multiple images already in your presentation to all be the same size. Here’s how it works. PowerPoint可以自动调整图像大小以适合形状。 您还可以将演示文稿中已有的多个图像调整为…

如何在不支付Adobe Photoshop费用的情况下处理Camera Raw

You might think that you need expensive software to take advantage of Camera RAW—something like Photoshop or the more modestly priced Lightroom. Fortunately there is freeware that can help you achieve professional results without professional costs. 您可能…

eclipse 代码提示后面的百分比是什么意思?

简而言之,就是提示你其他人(开发人员)在此情形下使用该方法百分比,最常用方法百分比 见http://www.eclipse.org/recommenders/manual/#d0e32 Call Completion The Call Completion engine, for example, provides you with recomm…

travis-cli 使用

1. 添加项目登录 travis 选择对应项目即可 2. 添加持续集成文件.travis.ymllanguage: node_js node_js:- "node" before_install: - npm install -g jspm - jspm install script: - jspm bundle lib/main --inject备注:这是一个jspm 项目 3. 构建travis 是…

在Windows Media Center中收听超过100,000个广播电台

A cool feature in Windows 7 Media Center is the ability to listen to local FM radio. But what if you don’t have a tuner card that supports a connected radio antenna? The RadioTime plugin solves the problem by allowing access to thousands of online radio …

IntelliJ IDEA——数据库集成工具(Database)的使用

idea集成了一个数据库管理工具,可以可视化管理很多种类的数据库,意外的十分方便又好用。这里以oracle为例配置。 1、配置 在窗口的右边有个Database按钮,点击。 如果没有,请点击上方的View(视图)-Tool Windows(工具窗口)-Database…

代码评审会议_如何将电话会议(和访问代码)另存为联系人

代码评审会议Dialing a conference call doesn’t have to be a tedious process. Your iPhone or Android phone can automatically dial into the call and enter a confirmation code for you. You just have to create a special type of contact. 拨打电话会议不一定是一个…

使用iOS 4越狱iPhone或iPod Touch

In case you haven’t heard the news over the past couple of days, there is now an incredibly easy way to jailbreak your iPod Touch or iPhone running iOS 4. Here we will take a look at how easy the process is. 如果您在过去的几天里没有听到这个消息&#xff0c…