我正在考虑在 DynamoDB 之上编写一个排队系统。这与 SQS 或后台处理不同。这是员工需要处理的事情的有序列表。在更大的系统中,存在包含其他对象 ID 的命名队列。系统的这一部分仅代表队列方面。
商业模式是这样运作的。一个对象进入系统并被添加到给定的队列中。一名员工从队列中挑选一些东西。这会将给定的项目移动到工作集中指定的时间。如果员工在指定时间之前创建任务,则任务完成并从系统中删除。如果不是,则将其从工作集中删除并重新添加到主队列中。有多名员工一次将事情从队列中拉出来。这发生在真实的人类时代。系统还需要支持高性能大小的操作。这样,总作业可以显示在 UI 中。
我正在考虑 DynamoDB,因为这是公司中最关键的流程。DynamoDB 保证了性能和可扩展性。我们现在有一个基础设施问题,因为独立系统不是建立在满足他们需求的基础设施之上。所以我到了这里。
我以前玩过 DyanmoDB,但只玩过玩具。这是实打实的。我无法弄清楚如何采用这种业务模型并将其映射到 DynamoDB。天真的方法是采用这样的文件:
{
"queue": "high",
"jobs": [1,2,3,4,5,6]
}
只需将其保存在工作表中即可。我说天真是因为这会浪费 DynamoDB 的性能能力,因为所有的吞吐量都必须通过几个键(实际上有大约 3 个队列)来进行所有读取和写入。不幸的是,我无法提出完整的解决方案。
我的想法是使用复合散列键和一张表来存储所有排队的任务。范围键的queue
哈希和工作位置。所以是这样的:
Hash Range Job Task
high 1 55 328
low 2 15 23871
medium 1 12 38173
等等。这将在整个表中分配读取。获取队列中的第一个项目将执行查询queue
并排序,range
然后拉出第一个项目。计数以类似的方式工作。
我认为工作集将以类似的方式工作,除了哈希将类似于queue.job
. 通过这种方式,get
可以向表发出请求以挑选单个项目。该jobs
表实际上可能具有相同的要求。
我关心的是保持工作表中的所有内容。插入新项目将count + 1
用于范围键。我不确定这将如何在实践中发挥作用。当队列大小波动时,我看到了一个问题。作业在开始时也必须是可重新排队的。如果他们没有及时从工作集中移除,他们必须排在一般队列的前面。这可以通过使用0
范围来完成。
有没有人在 DynamoDB 之上实现了类似的东西,或者我的想法是彻底的洗白?如果是这样,请告诉我。我有机会更新一个关键业务系统,并希望让这件事变得稳定和快速,因为我们现在有很多问题。