微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于时间的到期/记录/事件/操作消息的生成

如何解决基于时间的到期/记录/事件/操作消息的生成

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

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

我错过了TTL的一个概念,即它不会实时过期商品,并且可能最多需要48小时。

还有其他智能方式来处理此类用例吗?目前,我将其实现为-

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

这里有两个挑战-

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

我正在研究是否可以通过推送机制巧妙地做到这一点。有解决此用例的指针或帮助吗?

解决方法

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

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

,

请考虑使用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作业。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。