Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS Lambda-队列的存储状态_Amazon Web Services_Amazon S3_Aws Lambda_Amazon Dynamodb_State - Fatal编程技术网

Amazon web services AWS Lambda-队列的存储状态

Amazon web services AWS Lambda-队列的存储状态,amazon-web-services,amazon-s3,aws-lambda,amazon-dynamodb,state,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Dynamodb,State,我目前的任务是为政府机构和公民之间的通信构建一个无服务器架构,其中一个主要组件是某种形式的队列,它包含指向每个公民请求的某种形式的对象/指针,按优先级排序。然后,政府工作人员可以处理可用的元素。由于Lambda是无状态的,我需要以某种方式将队列保存在外部 为了保存我收集到的状态,您可以使用DynamoDB或S3 bucket,并使用事件触发器调用相关的Lambda方法。有些人还建议使用参数存储来保存一些状态变量。全局存储也出现了,尽管您不能保证Lambda不会终止,但这似乎不是一个好主意 最后,

我目前的任务是为政府机构和公民之间的通信构建一个无服务器架构,其中一个主要组件是某种形式的队列,它包含指向每个公民请求的某种形式的对象/指针,按优先级排序。然后,政府工作人员可以处理可用的元素。由于Lambda是无状态的,我需要以某种方式将队列保存在外部

为了保存我收集到的状态,您可以使用DynamoDB或S3 bucket,并使用事件触发器调用相关的Lambda方法。有些人还建议使用参数存储来保存一些状态变量。全局存储也出现了,尽管您不能保证Lambda不会终止,但这似乎不是一个好主意

最后,我还读了一些关于SQS的内容,尽管我不知道它是否适用于这种情况


以这种方式使用Lambda时,最佳实践/建议方法是什么?由于事件触发,我倾向于使用S3存储桶,而不是使用DynamoDB作为我们的DB。

如果您需要存储消息,那么SQS不是这里最好的工具,因为您的Lambda函数将需要处理消息并最终将其存储在某个地方,从而使SQS成为一个代理

考虑到您可以将文件(消息)存储在S3存储桶中,然后让一个Lambda使用它的事件,S3方法提供了您所需要的开箱即用。然后,Lambda将处理此事件,文件在S3上将保持安全


如果此消息最终需要多个使用者,那么您可以将S3事件发送给SNS,最后您可以向给定的SNS主题订阅N个Lambda函数。

如果您需要存储消息,那么SQS不是这里的最佳工具,因为您的Lambda函数随后需要处理消息并最终将其存储在某个地方,从而使SQS成为一个代理

考虑到您可以将文件(消息)存储在S3存储桶中,然后让一个Lambda使用它的事件,S3方法提供了您所需要的开箱即用。然后,Lambda将处理此事件,文件在S3上将保持安全

如果此消息最终需要多个使用者,则可以将S3事件发送到SNS,最后可以向给定SNS主题订阅N个Lambda函数

全局存储也出现了,尽管您不能保证Lambda不会终止,但这似乎不是一个好主意

正确--这根本不可行。请注意,当您说“Lambda”时,实际上指的是容器内的进程。。。任何时候,当Lambda函数同时处理多个调用时,都可以保证它们不会在同一个容器中运行——因此“全局”变量只对优化有用,而不是对状态有用。同一函数的任意两个并发调用都有两个完全不同的全局环境

暂时忘记Lambda的一切——我不是说不要使用Lambda;我的意思是,无论您是否使用Lambda,都与下面所写的内容无关——我建议,一般来说,并行/并发操作可能是许多开发人员在尝试设计您所描述的东西时往往忽略的最重要的因素之一

如何从这个工作中分配工作“排队”是非常重要的考虑。您不能只是“查找下一项”并将其显示给工作人员

你必须有办法做到所有这些:

  • 查找下一个似乎可用的项目
  • 确认它确实可用
  • 将其分配给特定的工作者
  • 将其标记为不可分配
不仅如此,你还必须能够以原子的方式做所有这些事情——作为一个单一的逻辑动作——并且没有冲突

一个幼稚的实现可能会将同一个工作项分配给两个或更多的人,第一个任务会被几乎同时发生的后续任务盲目地、无声地覆盖

DynamoDB允许——当且仅当某个条件为真时才更新记录。这是解决方案需要适应的一项关键功能——例如,当且仅当项x当前未分配时,才将工作项x分配给用户y。如果条件在更新发生的那一刻不是真的,那么条件更新将失败,并且不会改变任何东西,这就是功能的强大之处

S3不支持有条件的更新,因为与DynamoDB不同,S3在大多数情况下只在上运行。更新或删除S3中的对象后,无法保证下一个对S3的请求将返回最新版本,或者S3不会返回最近删除的项。这不是S3中的缺陷——这是一种优化——但它使S3不适合“工作队列”方面

跳过这一考虑,您将拥有一个似乎可以正常工作的系统,并且大部分时间都可以正常工作。。。但在其他时候,它的行为“神秘地”是错误的

当然,如果您的工作项附带有文档(扫描图像、PDF等),那么将它们存储在S3中是非常正确的。。。但是S3是存储“状态”的错误工具。SSM参数存储是错误的工具,出于同样的原因——当两个操作都需要同时修改“状态”时,它们无法协同工作

“事件触发器”当然很有用,但从您的描述来看,最值得注意的“事件”不是来自数据或工作项的创建,而是当工作人员说“我准备好了下一个工作项”时当执行上述步骤以选择一个项目并将其分配给一个工作人员时,就是在这一点上(由网站/应用程序代码触发)。(在实践中,这可能是浏览器→ API网关→ 拉姆达)。