使用DynamoDB排序的任务列表

时间:2014-03-03 19:48:51

标签: amazon-dynamodb was

我正在考虑在上面写一个排队系统 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

等等。这将在表中分发读取。入门 队列中的第一项将在queuerange上进行查询 按queue.job排序然后拉出第一项。计数工作在 类似的方式。

我认为工作集除了哈希之外还会以类似的方式工作 会是get之类的东西。这样就是jobs请求 可以在桌子上挑选出一个单独的项目。 count + 1 表实际上可能有相同的要求。

我担心的是在作业表中保留所有订单。插入 新项目将使用0作为范围键。我不确定 这将如何在实践中发挥作用。我发现队列大小有问题 波动。工作必须在开始时重新加入 同样。如果他们没有及时从工作组中移除他们必须 转到一般队列的前面。这可以通过使用{{1}}来完成 范围。

有没有人在DynamoDB上实现过类似的东西,或者是 我的想法完全是猪洗吗?如果是这样,请告诉我。我有机会 更新业务关键系统并希望做到这一点 稳定的因为我们现在遇到很多问题,所以快到了。

1 个答案:

答案 0 :(得分:0)

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

另一种可能性是有两个表 - 一个用于工作细节,另一个用于订单

  1. 作业详细信息:哈希(jobid / UUID),作业详细信息(其他属性)
  2. 作业队列:哈希(员工/所有者ID),哈希(“高/低”),{jobid1,jobid2 ...}(这是一个字符串JSON)。
  3. 您无法使用SET作为作业单,因为它再次未被订购。