我正在寻找使用 Python 将大量高分辨率图像(数百万)目录转换为缩略图。我有一个 DynamoDB 表,用于存储 S3 中每个图像的位置。
与其在一个 EC2 实例上处理所有这些图像(需要数周时间),不如使用一组实例编写一个分布式应用程序。
我可以使用什么技术来编写一个队列,允许节点从数据库中“ check out ”图像、调整图像大小,并使用生成的缩略图的新尺寸更新数据库?
具体来说,我担心原子性和并发性——如何使用 DynamoDB 防止两个节点同时 check out 同一个作业?
最佳答案
您可以采用的一种方法是使用 Amazon's Simple Queue Service(SQS)与 DynamoDB 结合使用。所以你可以做的是将消息写入队列,其中包含类似于 DynamoDB 中图像条目的哈希键的内容。每个实例都会定期检查队列并抓取消息。当一个实例从队列中抓取一条消息时,它会在给定的时间内对其他实例不可见。然后,您可以查找并处理图像并将消息从队列中删除。如果由于某种原因在处理图像时出现问题,消息将不会被删除,并且它会变得可见以供其他实例抓取。
另一种可能更复杂的方法是使用 DynamoDB 的 conditional update mechanism实现锁定方案。例如,您可以向数据模型添加一个“beingProcessed”属性,即 0 或 1。实例可以做的第一件事是对该列执行条件更新,将值更改为 1,前提是初始值为0. 围绕使它成为一个适当的/稳健的锁定机制,这里可能还有更多工作要做....
关于python - 在 Amazon 的 DynamoDB 中编写分布式队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12228056/