以分布式和无服务器的方式运行项目的所有内容

moncrief的Python项目详细描述


阿尔杰农

您需要的一切都是无服务器和令人惊叹的

概述

< Buff行情>

Algernon在AWS生态系统中工作,所以如果你在其他地方,这不是为你的脸写的

阿尔杰农世界的一切都被分解为最小的工作单元,我们称之为任务。 任务具有任务名和可选回调。当你运行一个任务时,你可以为它提供任务千瓦,这将 是传递到任务代码的有效负载。

侦听器和队列

每个任务都与一个sqs队列和一个sns主题相关联。sns主题充当侦听器,向其发送消息 将传输到相应的队列进行处理。

工人

为了简化部署,一个lambda函数可以服务于多个任务。在这种情况下,您应该使用 解析出任务名并相应地路由任务。我们通常使用:

fromsome_packageimporttasksdefhandler(event,context):task_name=event['task_name']task_kwargs=event.get('task_kwargs',{})task_fn=getattr(tasks,task_name)iftask_fnisNone:raiseRuntimeError(f'task: {task_name} is not registered with the system')results=task_fn(**task_kwargs)returnresults

lambda函数订阅了sqs队列,因此当任务从侦听器推送到队列中时, 工人们会自动接他们并开始工作。

等幂

默认情况下,工作人员将以10个为一批从队列中提取消息。 如果该批中的某个任务失败,则整个批将保留在队列中, 意味着所有这些任务都将再次运行。因此,必须非常努力地使代码具有等幂性。它是否 运行一次,或者运行一百次,结果应该是相同的(包括数据库条目、存储添加等)

回调

任务运行后,可以将结果发送到另一个任务,从而创建一个链。指定下一个的名称 任务调用中回调键下的任务。

上下文

当lambda函数调用python代码时,它为处理程序提供两个位置参数event和context。 我们劫持上下文,并使用它在批处理中持久化资源。保留原始aws上下文 在"aws"键下。您可以将自己的信息存储到上下文词典中,这些信息将可用 在工作人员的一生中。

上下文的常见用途是存储数据库连接、检索到的凭据或其他您不需要的内容 当你的工人拉一批货时,要重复十次。

对象和实用程序

@queued装饰符

此函数decorator应用于辅助处理程序函数。它允许您编写处理程序,就像 它被lambda直接调用。decorator负责解析来自sqs和 发送指示的回调。

序列化程序

Algernon热爱面向对象的编程,我们早期的一个困难是试图从任务中获取对象 完成任务。为此,我们提供了一个基本对象(algobject),它有一个必需的类方法(parse_json)。 从algobject继承的对象可以在task task中通过连线发送。

要序列化和重建算法对象,可以使用此库中包含的AJSON实用程序。

fromalgernonimportajson,AlgObjectclassDatabaseCredentials(AlgObject):def__init__(self,username,password,read_url,write_url):self._username=usernameself._password=passwordself._read_url=read_urlself._write_url=write_url@classmethoddefparse_json(cls,json_dict):returncls(json_dict['username'],json_dict['password'],json_dict['read_url'],json_dict['write_url'])credentials=DatabaseCredentials('my_username','31iteP@zzW0rd','some_db_url','some_other_db_url')strung_credentials=ajson.dumps(credentials)# send them to the next taskrebuilt_credentials=ajson.loads(strung_credentials)

ajson实用程序还处理一些常见的json问题子项。

  • python datetime对象
  • 元组
  • 设置
  • 小数

重建事件函数

为了支持模块化,@queued decorator在将消息发送到 任务处理程序。此决定允许一个任务工作线程处理针对不同任务工作线程的消息, 例如在路由或重播消息时。如果尝试对包含算法对象的消息使用ajson实用程序 从另一个工作进程,并且这些算法对象未导入到工作进程处理程序中,则您的工作进程将失败。

如果您知道某些任务将只接收可以在模块中重建的消息,则可以使用 重建事件函数以还原ME中的算法对象SaGE.

fromalgernonimportqueued,rebuild_event@queueddefhandler(event,context):event=rebuild_event(event)task_name=event['task_name']task_kwargs=event['task_kwargs']db_credentials=task_kwargs['db_credentials']

@lambda_logged装饰程序

lambda函数捕获所有日志记录活动并通过cloudwatch服务存储它。帮助组织和 搜索这些日志,您可以用@lambda_logged decorator修饰您的任务或工作处理器。这样做会 清除所有现有的记录器,我们发现它解决了lambda的许多日志问题,然后设置 根日志包括时间戳、函数信息和请求信息。另外, 通过将环境变量"debug"设置为true,可以切换调试级别登录。另外, decorator将激活本地lambda连接x-ray服务。如果你设置了这个装饰,然后 运行您的worker,您可以在aws x-ray服务下查看功能的跟踪及其统计信息。

这个decorator为最常见的库(请求、sqlite等)激活日志记录。你可以自己装饰 直接帮助提高跟踪粒度的函数。

fromaws_xray_sdk.coreimportxray_recorder@xray_recorder.capturedefsome_task(**kwargs):print(f'hey, did some work with {kwargs}')

我们发现python boto库和本地x射线库倾向于在日志中产生聊天,因此 decorator将两者设置为日志级别警告。

组合装饰符

您完全可以在同一个处理程序上同时使用@queued和@lambda_记录的decorators。

存储数据

在函数之间传递信息时,如在回调期间,任务不会通过连线发送 整体。为了帮助处理大消息,函数的结果将被上传到s3并替换为指针。 当信息到达下一个任务时,信息将自动从s3中提取并放回原位。 通过设置"algernon_bucket_name"环境变量指定要向其发送信息的存储桶。通过 默认情况下,storeddata对象设置为前缀"cache"。您可以通过"缓存文件夹名"环境更改此项 变量。我们建议您在用于此目的的存储桶上设置到期生命周期规则,以降低成本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaGWT:何时使用Lazydemelement?   Java中跟踪消失线程的多线程处理   java Springboot未能配置数据源:“url”,但我没有使用数据库   java为按钮生成随机位置   math Java:包含二项式系数计算的表达式   java通过AsyncTask传递参数   从路径错误创建java文件   高流量网站的性能播放框架、Java、Apache、PostgreSQL、JPA和Hibernate   java将4D矢量转换为长矢量   arraylist Java循环在没有任何错误的情况下终止   java正在制作一个计算器应用程序,希望在第二个片段中更新历史,但无法完成   java将信息从IntentService发送到Activity   java如何在游戏中插入大量实体!工作   javascript如何在ScriptEngineforJava中从数学中获得准确的结果?