我正在尝试扩展按以下步骤工作的导出系统:
到目前为止,所有这些都发生在一个单片python脚本中,它开始显示它的年龄。由于一次导出的记录数量增加了大约10倍,因此脚本占用大量内存,整个导出过程很慢,因为所有步骤都是阻塞和顺序的。
为了加快流程并使其可扩展,我希望将工作分配到一系列SQS队列中。前4个步骤非常简单:
export_id
和record_id
在验证者队列中为每个人创建一个msg。export_id
和record_id
export_id
和record_id
export_id
和record_id
。到目前为止,这一切都很好,花花公子。工作是并行化的,我们可以添加更多的工人到最需要他们的步骤。
我对如何添加流程的最后一步感到难过?
直到现在所有的队列都已经(适当地)愚蠢。他们获得一个消息,执行一个动作并传递它。在当前脚本中,当我们到达最后一步时,程序可以确定所有记录的所有先前步骤都已完成,并且是时候转储信息了。我应该如何在分布式案例中复制这个?
以下是我能想到的选项:
转储器队列只是将它的传入消息保存在数据库表中,直到它获得一个标记为“FINAL”的消息,然后它转储所有如果同时处理多个导出,则无法保证msgs的顺序,因此决定哪个msg是最终的很容易失败。export_id
的消息。这使得最终的msg成为单点故障。
在每个步骤中传递expected_total
和count
,并且转储器队列等待,直到获得足够的消息。这将导致转储程序队列被阻塞,其他导出将不得不等待,直到收到先前启动的导出的所有消息。如果消息丢失,还必须以某种方式处理可能无限的等待时间。
上述选项似乎都不够好。我还有其他选择吗?
在高级别,一致性比此问题中的可用性更重要。因此导出的文件可能会迟到,但它们应该是正确的。
消息延迟原因
如评论中所述:
答案 0 :(得分:0)
看起来您可以执行以下操作:
Assigner
Dumper读取批量并以批量形式将其转储到数据库
答案 1 :(得分:0)
您可能应该使用缓存而不是队列。