我正在考虑在上面写一个排队系统 DynamoDB。这不像SQS或后台处理。它 是员工需要处理的事项的有序列表。有名字 包含较大系统中其他对象的ID的队列。这个 系统的一部分仅代表队列方面。
商业模式就像这样。一个对象进入系统 并将其添加到给定队列中。一名员工选择了一些东西 队列。这会将给定项目移动到工作集中 指定时间。如果员工在指定时间之前创建任务 任务完成并从系统中删除。如果不是的话 从工作集中删除并添加回主队列。 有多名员工立刻将事情从队列中拉出来。 这发生在真正的人类时代。该系统还需要支持 高性能操作。这样就可以显示总作业 在用户界面中。
我正在考虑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
作为范围键。我不确定
这将如何在实践中发挥作用。我发现队列大小有问题
波动。工作必须在开始时重新加入
同样。如果他们没有及时从工作组中移除他们必须
转到一般队列的前面。这可以通过使用{{1}}来完成
范围。
有没有人在DynamoDB上实现过类似的东西,或者是 我的想法完全是猪洗吗?如果是这样,请告诉我。我有机会 更新业务关键系统并希望做到这一点 稳定的因为我们现在遇到很多问题,所以快到了。
答案 0 :(得分:0)
当您需要更改作业的顺序时(例如,想要将最后一个任务移动到第二个位置),您当前的方法会导致需要更改许多项目的问题。
另一种可能性是有两个表 - 一个用于工作细节,另一个用于订单
您无法使用SET作为作业单,因为它再次未被订购。