在Amazon的DynamoDB中编写分布式队列

ens*_*are 10 python amazon-web-services amazon-dynamodb

我正在寻找使用Python将大型高分辨率图像目录(数百万)转换为缩略图.我有一个DynamoDB表,用于存储S3中每个图像的位置.

我不想在一个EC2实例上处理所有这些图像(需要数周时间),而是想使用一堆实例编写分布式应用程序.

我可以使用哪些技术编写一个队列,允许节点从数据库中"检出"图像,调整大小,并使用生成的缩略图的新维度更新数据库?

具体来说,我担心原子性和并发性 - 如何防止两个节点同时使用DynamoDB检出同一个作业?

nst*_*ehr 11

您可以采用的一种方法是将Amazon的简单队列服务(SQS)与DynamoDB结合使用.因此,您可以做的是将消息写入队列,其中包含类似DynamoDB中图像条目的哈希键的内容.每个实例都会定期检查队列并关闭消息.当一个实例从队列中获取一条消息时,它会在给定的时间内对其他实例不可见.然后,您可以查找并处理图像并从队列中删除该消息.如果由于某种原因处理图像出现问题,则不会删除该消息,并且其他实例可以抓取该消息.

另一种可能更复杂的方法是使用DynamoDB的条件更新机制来实现锁定方案.例如,您可以向数据模型添加"beingProcessed"属性,即0或1.实例可以做的第一件事是对此列执行条件更新,如果初始值为0,则将值更改为1这里可能还有更多的事情可以让它成为一个合适/强大的锁定机制....

  • 被警告。SQS 有许多缺点和极端情况,让我很痛苦。如果您使用 fifio 并且每秒处理 300 个事务的限制(不太可扩展..),即使删除消息后,重复数据删除仍然处于活动状态。如果您尝试使用标准队列,SQS 有一个令人讨厌的习惯,即在没有警告的情况下随机丢弃已发送的消息和复制消息。遗憾的是,基于 DynamoDb 的队列更加稳定且可扩展。另外,你可以扫描队列中发生的事情:) 对于像我这样的控制狂来说+1 (2认同)