使用DynamoDB作为计算器

2020-05-03 04:19:22

在最近的一次AWS成本优化问答中,Corey Quinn谈到了他使用DynamoDB的实验:

我在迪纳摩潜水的深度比我预想的要深。令人惊讶的是,这真是太棒了。我对数据库了解不多,但我正在看它,现在我在想:“迪纳摩太棒了,我能把它误用成什么呢?”S3是我最喜欢的消息队列,路由53是我最喜欢的数据库,但我不能完全确定到目前为止发生了什么。至于其他创造性的用途,我可以滥用的东西。也许使用迪纳摩作为一种计算机服务-我打赌我可以教它下棋。

DynamoDB是亚马逊托管的NoSQL服务-基本上是一个数据库。它是用于保存大量非结构化数据的键值存储。我们在工作中使用DynamoDB来存储数据,所以我对使用它略知一二,而且我喜欢采纳糟糕透顶的好主意,并将它们拨到11。

当你学习编程时,一项常见的任务是构建计算器:加法、减法、乘法和除法。这将是测试Amazon最不受欢迎的计算平台的好方法-我们可以在DynamoDB之上构建计算器吗?事实证明我们可以做到,这就是我在这篇文章中要经历的。(将这个实验扩展到国际象棋,留给读者作为练习。)。

为了避免怀疑:这是一个坏主意™。请勿在生产中使用此代码,也不要在生产环境的十英里半径内使用此代码。这是一篇讽刺文章,不是严肃的节目。

DynamoDB支持多种编程语言,包括Java、.NET和Python。我将在这篇文章中使用Python,因为这是我所熟悉的,但是这些想法也可以在其他语言中使用。

在DynamoDB中,我们所有的计算都在Table中运行。在表中,操作在行内运行。让我们编写一些代码来为我们创建表,并分配可以用来跟踪单个计算的行ID:

导入contextlib导入UUID导入boto3 DynamoDB=boto3。资源(";DynamoDB";)类DynamoCalculator:";";";使用DynamoDB进行计算的整数计算器。";";";def__enter__(Self):table_name=f";计算器-{uuid.uuid4()}";DynamoDB。CREATE_TABLE(AttributeDefinitions=[{";AttributeName";:";Calculation_id";,";:";S";,}],TableName=TABLE_NAME,KeySchema=[{";AttributeName";:";Calculation_id";.。

上下文管理器为我们处理创建和清理-它不仅为我们创建表,还会在之后删除它。在您可以进行第一次计算之前,这确实会造成一些延迟,但这意味着我们的帐户中没有闲置的表。

记住:云的昂贵部分不是您使用的,而是您忘记关闭的部分。此API确保我们永远不会忘记关闭我们的表!

重要提示:如果您创建的资源具有应该始终运行的清理,则上下文管理器是在Python API中强制执行此操作的好方法。例如套接字或文件,您应该在完成后始终关闭它们。

在其他语言中,您可以使用Try…。除了…。最后,但是调用者必须记得做清理。Python使用WITH语句向调用者隐藏这种复杂性。您可能已经使用过一个-使用OPEN(…)。,它总是在您使用完文件后将其关闭,无论您的代码返回还是抛出异常。

如果您不使用它们,它们是一个强大的功能,值得学习。

DynamoDB支持将数字作为一级类型,我们可以分别使用GetItem和PutItem API读取和写入数字值。PutItem API完全替换了行的内容,这在某些情况下很有用并且易于批处理,但它并不总是适合这项工作的工具。

假设我们使用DynamoDB来存储计数器。我们希望递增计数器的值,但不从表中读取现有值-如果另一个进程在读取和写入之间更新计数器,我们将丢失数据。为此,我们可以使用UpdateItem API,它可以根据行的现有值修改行。

类发电机计算器:.。def add(self,x:int,y:int)->;int:";";";将两个整数相加并返回结果。";";";";与自己。row_id()AS CALCULATION_ID:Self。桌子。put_item(Item={";Calculation_id";:Calculation_id,";sum";:x})自身。桌子。UPDATE_ITEM(Key={";Calculation_id";:Calculation_id},UpdateExpression=";Set#sum=#sum+:Y";,ExpressionAttributeNames={";#sum";:";sum";},ExpressionAttributeValues.。

在这里,我们使用PutItem将第一个数字(X)写入到表中。然后,我们执行一个UpdateItem,将第二个数字(Y)添加到现有值中。最后,我们调用GetItem来检索总和。

事实证明,我们可以将这三个API调用合并为一个。UpdateItem API c