0

我正在考虑在 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 之上实现了类似的东西,或者我的想法是彻底的洗白?如果是这样,请告诉我。我有机会更新一个关键业务系统,并希望让这件事变得稳定和快速,因为我们现在有很多问题。

4

1 回答 1

0

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

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

  1. Job Details:Hash(jobid/UUID),job details(其他属性)
  2. 作业队列:Hash(employee/owner id), Hash("high/low"), {jobid1, jobid2...}(这是一个字符串 JSON)。

您不能将 SET 用于作业订单,因为它再次未订购。

于 2014-03-04T14:01:57.123 回答