如何解决基于时间的到期/记录/事件/操作消息的生成
我正在创建一个任务分配给多个用户的脚本。任务已分配给一个用户,如果在接下来的30分钟内不接受该任务,则需要重新分配给另一个用户。
实际上,我为此使用了DynamoDB,其中每个任务分配都在30分钟后附加到TTL。当TTL过期时,我通过Stream处理并检查它是否被接受。如果没有,我将重新分配并在表中创建一个具有30分钟TTL的新条目。
我错过了TTL的一个概念,即它不会实时过期商品,并且可能最多需要48小时。
还有其他智能方式来处理此类用例吗?目前,我将其实现为-
这里有两个挑战-
我正在研究是否可以通过推送机制巧妙地做到这一点。有解决此用例的指针或帮助吗?
解决方法
我认为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 举报,一经查实,本站将立刻删除。