python 函数式 项目

阅读: 评论:0

python 函数式 项目

python 函数式 项目

Python部落(python.freelycode)组织翻译,禁止转载,欢迎转发。

Formation是Python的一个通用型函数式中间件架构。

使用Formation,你可以构建生产级软件——无论你是想要构建有弹性的、具有断路器的、可操作的HTTP客户端、HTTP服务,还是想轻松地将最佳实践和标准应用于其他类型的软件,使其具有灵活性、可组合性和可维护性。

虽然它没有依赖一个web服务框架,但是它从Ruby的Rack中间件和Node的连接中获得了灵感。在Python的上下文中,你可以把它看作是一个更高级别的抽象,或者“任何东西之上的WSGI”。

管道抽象和函数

数码相机中的图形管道通常有助于实现这些功能(摄影鉴赏家可能会注意到,它既不是一套完整的步骤,也不是一组精确的步骤,但它有助于阐明一个观点):白平衡

颜色优化

锐化

裁剪

白平衡是指找出照片中有多少白色,这样相机就可以优化我们所关心的东西(比如肤色),而不是我们不关心的东西(比如来自大海的阳光)。

在拍摄之前和之后,我可以从几种白平衡设置中进行选择,而不用考虑其他步骤。我像外科手术般更换一个部件,所有其他部件包括管道本身都会继续运行。

管道抽象的概念是组织和执行一组行为相似且可互换的构建块。这意味着:

通过一个成功的设计,我们可以将不同的构建块放入管道中,也可以从其他地方借用构建块。我们或其他人的管道设计都不应该有任何特定的限制这种重用性的东西。

我们可以组合、排序和启用或禁用构建块,而管道应该允许它变得简单和不足为奇。

从头创建新块应该很简单,没有不必要的仪式。

这里是一个具有传统的面向对象设计的临时管道:

这里是一个进入上述管道的示例块:

认出这个接口的人会意识到它实际上是一个函数的接口!这里有一个更简单的管道和块:

远离类(通过这样做,远离面向对象的设计),我们得到了什么?我们得到了自由的可组合性,因为编程中的函数,如果是纯函数,就像数学中的函数一样,也是可组合的:

组合函数对编码来说是很正常,机械的——枯燥的编码工作是伟大的;它很容易使自己变得抽象和枯燥。

考虑到这一点,这里我们使用toolz来进行组合,toolz是Python的一个函数式编程库:

但是,先回到面向对象设计和函数类,我们如何用一个#execute方法来组合一个类呢?我们借助于设计模式。

我们通过让每个块接受另一个块来打破我们第一个版本的执行接口,并且我们引入状态,因为必须对它进行存储:

无论我们以何种方式看待它,或以何种方式试图理解它——可悲的结果是,我们用更多的抽象来修补一个非自然抽象,直到它变得有意义为止。

生产就绪服务

使用concern包装我们的请求逻辑

下面是Web服务的一些常见关注点(代表性集合,但绝不是一个覆盖集合)。你甚至可以更进一步,声称这些是加强你公司的服务的标准。

内容缓存和电子标签——在将内容放置到TCP连接之前,对其进行摘要、缓存,或者更一般地执行内容明智的操作,将有助于接收端缓存它并保存字节以便用于将来的其他调用。

异常处理——当发生故障时,我们不想发送一个堆栈跟踪或服务内部的任何部分。我们总是可以检测到它,把它封装在一些用户友好的东西中,比如一些故障诊断建议,或重试建议。

压缩——如今,随着硬件计算能力的提高,对所有传入和传出服务的内容进行Gzip压缩几乎已成为标准。在Apache和Nginx等应用服务器中,这是一个简单的标志。

节流——如今,服务很容易不堪重负,尤其是随着无服务器用户的激增,其规模和并发性几乎是无止境的。我们在这里要做的是设置一个模块来阻止任何超过某个阈值的用户。

Header aesthetics_ ——通过隐匿来实现安全性,虽然不是安全性,但对某些类型的攻击仍然有效。如果我们不说我们正在使用Apache,攻击者可能会认为我们不是一个好的ROI(感兴趣区域),并转移到下一个目标。还有许多其他“喋喋不休”的HTTP头,它们向任何公共用户显示不必要的信息。

断路机制——当一项服务发生故障时,可能是它停机了,或者是以降级模式运行。为了方便不同级别的操作功能和容错,我们使用了断路器。有一些变体可以用来构建断路器,最著名的是Netflix的Hysterix。

我的观点?这一切对于客户来说也是存在的

我们已经讨论了一个Web服务或一个API。我们可以将所有这些需求推送给客户端——用户——你会惊奇地发现,它们在那里也是有效的。

从历史上看,让Web服务完成所有这些繁重的工作有助于为客户端提供一种更浅显的方法——如果后端处理了这些,那么客户端就不需要处理这些问题。

随着向微服务的转移,权重也在发生变化——由于服务网格具有复杂的服务间通信来执行一个给定的请求,因此现在在客户端和服务器端促进这些功能无疑是同样重要的。

例如,如果我在离开的时候清理我的header(头部),这样做会带来更好的安全性。如果我在我的内容到达服务器之前对它进行压缩,那么我就是在启用更快,更好的流量整形。最后,如果我在将字节置于连接上之前避免阻塞一个后端,并短时停止,那我是正在推广一个更健康的后端服务器,其中唯一能造成流量阻塞的事件现在就变成了异常,而不是norm(常态)。

中间件:一个蓝图

这两个故事就引除了我们的重点: 中间件、函数和客户端中间件。下面是一些用于web服务和API的流行的中间件库的例子:

Python的 WSGI

Ruby的 Rack

Node的连接

所有这些都在后端环境中运行,在某种程度上充当请求处理程序。它们都以不同的接口接受并服务于同一个三元组抽象数据类型,即状态代码、头部和主体。这个简单的设计可以追溯到CGI。

如果我们看一下Node的连接,你就会发现其中已经有一大堆中间件可供你选择。你使用的每一个中间件都是一段你不需要在处理程序中编写的代码,同时也是一个标准,你可以设置它来让其他人知道他们也不需要再编写该代码。

客户端中的中间件

现在我们来关注HTTP客户端。已经有一个很流行的非常棒的HTTP客户端的例子,它支持Ruby中的中间件: Faraday。

有了Ruby精心设计的DSL功能,Faraday允许你用中间件组合新的客户端,它会将这些客户端转换成高级且健壮的HTTP客户端,看起来就像散文一样:

直到现在,Python还没有这样的东西。

Formation简介

Formation是Python的一个通用中间件基础结构,以及用于Python的高级HTTP客户端构建基础结构—Faraday以同样的方式使这一切在Ruby中可用。

这里是一个简单的Formation HTTP客户端:

这里有一段简单的代码,我们想在其中注入中间件的魔力,先忽略HTTP和客户端:

最后,这里是我们如何构建一个新的中间件,就像这样:

中间件应简单易用

中间件应该易于添加。

什么是简单?一个纯函数,没有基类,没有导入,没有专门的编程语言知识,也没有关于主机框架的先验知识。

一个请求的知识——响应交互和上下文概念是必需的,但这并不是一种专门的知识。

这里是一个中间件:

它应该就是一个简单的函数,有一个上下文做参数--上下文可能是任何东西,可能就是一个字典。它处理完之后要么调用下一个函数处理,要么结束整个流程。

从这里,我们就可以用一句话来提取整个中间件API:

中间件是一个普通的函数,它接受当前上下文和下一个中间件,并负责返回一个新的上下文。

装饰器

Formation是固执的。“应该简单”的定义排除了装饰器:首先,它们是特定于语言的,需要先验知识,其次,更重要的是,它们不灵活。

函数,假设它们是一个语言中的一等公民,它们天生就适合于对函数进行组合和高级操作。

一流的可操作性

以下是可操作性的定义:

可操作性是指根据预先定义的操作要求,使设备、系统或整个工业装置处于安全可靠的运行状态的能力。

在我们这个更为温和的软件世界里,我将可操作性定义为:

通过对故障有效和精确地了解,一个组织将生产软件从故障状态快速、可靠和精确地转移到运行状态的能力。

为了支持可操作的软件,Formation中间件做了以下几件事:

context——该上下文中间件收集有关正在运行的主机的信息,以便在发生故障时进行操作。回答像“此服务部署的Git版本是什么?”,以及“这两个线程运行在同一个进程上吗?”这类问题的信息。

logger——一个结构化的请求日志记录器,它将所有信息打包到结构化日志中。阅读这里,了解为什么结构化日志记录比普通的文本日志更能提升软件的可操作性。

还有更多。

透明化的弹性

弹性在Formation中以两个概念的形式提出:

circuit_breaker——我们不想连续访问一个宕机的服务,因为它已不堪重负。

retry——在请求失败的情况下,透明地重试它,而不影响用户代码。对于片状网络,你甚至不会注意到Formation正在为你进行重试。

内置内容处理

Formation可以创建一个只理解特定内容类型的客户端,从而简化你的编程体验。例如,如果一个API只支持JSON(现在这是一件合理的事情),那么你就不需要通过内容嗅探代码来理解刚刚在响应体中得到的内容,也不需要手动将文本解析为JSON。

下面是一个客户端示例,我们显式地选择json_response作为这个客户端接收到的内容:

令开发者高兴的结构化查询

Formation理解Python中最流行的数据类库attrs。有了Formation的姐妹项目attrs-serde,我们就可以在Formation客户端进行完全结构化的查询,像这样:

现在,谷歌客户端接受一个Query对象。我们可以创建参数层次结构,取出一个公共page和size参数,并将其应用于所有查询,这样我们就可以使用代码补全和类型更正功能。

总结

Formation是一个Python的通用功能型中间件基础结构。使用它,你可以组合一个中间件堆栈,其中的每个中间件都有一个很小的API、一个共享上下文以及取消或继续使用下一个中间件的能力。

在很多方面,它类似于Ruby的Rack中间件和Node的连接——适用于任何东西,而不仅仅是服务器端。在Python的上下文中,它是一个基于WSGI的高级抽象。Formation不是Pythonic的,也不符合Python之禅;在合适的地方,它会消除这些问题,并进行优化来令开发人员高兴。

请随意浏览Formation的文档并尝试一下!英文原文:/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE3/python-functional-middleware.pdf

译者:好酒不上头

本文发布于:2024-01-28 04:33:06,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063875924802.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   项目   python
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23