1

我正在为多个用户创建任务分配脚本。一个任务分配给一个用户,如果在接下来的 30 分钟内没有被接受,我需要重新分配给另一个用户。

实际上,我为此使用了 DynamoDB,每个任务分配都在 30 分钟后附加到 TTL。当 TTL 过期时,我通过 Stream 处理并检查它是否被接受。如果没有,我正在重新分配并在表中创建一个具有 30 分钟 TTL 的新条目。

我错过了 TTL 的一个概念,即它不会实时过期项目,可能需要长达 48 小时。

是否有任何其他智能方法来处理此类用例,目前我将其实现为 -

  • 添加以 TTL 作为排序键和 event_type = Task 作为分区键的索引
  • 每分钟查询 TTL 小于当前 epoch 的所有记录,并批量删除这些记录。

这里有两个挑战——

  • 首先,由于 event_type 在整个表中是恒定的,所有数据都在索引的一个分区上,这对于大容量是不利的
  • 这是一种轮询机制,我实际上需要扫描所有记录,这也不是一个可扩展的解决方案

我正在探索我们是否可以通过推送机制巧妙地做到这一点。解决此用例的任何指示或帮助?

4

2 回答 2

1

我认为检查数据库的 cron 作业是必须的。你不会逃避的。

您可以做的是添加带有到期日期的全球二级索引。然后您可以使用查询而不是扫描排序值。

于 2020-10-29T11:38:33.007 回答
0

考虑使用temporal.io。它允许直接在代码中建模您的业务逻辑。下面是它在 Java 中的实现方式:

@WorkflowInterface
public interface TaskAssignment {
    @WorkflowMethod
    void assignTask();

    @SignalMethod
    void reportAccepted(String userId);
}

@ActivityInterface
public interface TaskAssignmentActivities {

  String pickAvailableUser();

  void assignTask(String userId);
}

public class TaskAssignmentImpl implements TaskAssignment {

  private static final Duration TASK_ASSIGNMENT_TIMEOUT = Duration.ofHours(1);
  private static final int MAX_ASSIGNMENT_ATTEMPTS = 10;

  private ActivityOptions options =
      ActivityOptions.newBuilder().setStartToCloseTimeout(Duration.ofSeconds(10)).build();

  private final TaskAssignmentActivities activities =
      Workflow.newActivityStub(TaskAssignmentActivities.class, options);

  private String userId;

  @Override
  public void assignTask() {
    for (int i = 0; i < MAX_ASSIGNMENT_ATTEMPTS; i++) {
      String userId = activities.pickAvailableUser();
      activities.assignTask(userId);
      // Block up to TASK_ASSIGNMENT_TIMEOUT or user equality condition is satisfied.
      Workflow.await(TASK_ASSIGNMENT_TIMEOUT, () -> userId.equals(this.userId));
      if (userId.equals(this.userId)) {
        break;
      }
    }
  }

  @Override
  public void reportAccepted(String userId) {
    this.userId = userId;
  }
}

这看起来像普通代码,但 Temporal 使其完全容错。因此,如果您的进程重新启动,则计算状态将完全保留,包括局部变量和线程堆栈。因此无需与数据库或队列对话并使用 cron 作业。

于 2020-11-01T01:36:22.770 回答