2014-03-03 84 views
0

我正在考虑在 DynamoDB之上写排队系统。这不像SQS或后台处理。它是 是员工需要处理的事情的有序列表。有名为 的队列包含更大系统中其他对象的ID。该系统的 部分仅代表队列方面。有序的任务列表与DynamoDB

商业模式是这样工作的。一个对象进入系统 并将其添加到给定的队列中。一名员工从队列中挑选一些东西关掉 。将指定的项目移动到指定时间的 的工作集中。如果员工在指定时间 之前创建任务,则任务完成并从系统中删除。如果不是,则从工作集中删除 并将其添加回主队列中。 有多名员工立即将事情从队列中拉出。 这发生在真正的人类时代。该系统还需要支持 性能规格操作。通过这种方式,可以在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上实现过类似的东西,或者是 我的想法完成了猪洗?如果有,请告诉我。我有一个机会 更新业务关键系统,并希望使这件事 稳定&快地狱,因为我们现在有很多问题。

回答

0

当您需要更改作业的顺序(例如,想要将最后一个任务移动到第二个位置)时,您当前的方法会导致需要更改许多项目的问题。

另一种可能性是有两个表 - 一个用于作业的详细信息和其他订单

  1. 作业详细信息:哈希(作业ID/UUID),作业详细信息(其他属性)
  2. 作业队列:哈希(雇员/所有者ID),哈希(“高/低”),{jobid1,jobid2 ...}(这是一个字符串JSON)。

您不能使用SET作业订单,因为它再次被取消订购。

+0

表2不是针对我说的关于在小容量的密钥上创建大吞吐量的说法吗?另外,如何使用模型获取指定队列中的所有任务? 编辑:重新排序不是必需的。在我的模型中插入'0'位置就足够了。 – ahawkins

+0

由于第二个表的散列键是员工ID,访问将分布。如果你不需要重新排序,你可以考虑使用负值键。从零开始,如果在此之前需要插入,则使用-1,-2并继续。 –

+0

为什么使用employee/owner_id?你添加了什么?我不需要为特定人员检索任务,只需要在特定队列中执行任务 - 或者这是我的工作集思路的实现? – ahawkins