Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aws lambda 基于时间的过期/操作记录/事件/消息的生成_Aws Lambda_Amazon Dynamodb_Message Queue_Amazon Dynamodb Streams_Amazon Dynamodb Index - Fatal编程技术网

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

Aws lambda 基于时间的过期/操作记录/事件/消息的生成,aws-lambda,amazon-dynamodb,message-queue,amazon-dynamodb-streams,amazon-dynamodb-index,Aws Lambda,Amazon Dynamodb,Message Queue,Amazon Dynamodb Streams,Amazon Dynamodb Index,我正在为分配给多个用户的任务创建脚本。任务已分配给用户,如果在接下来的30分钟内未被接受,我需要重新分配给另一个用户 实际上,我使用了DynamoDB,其中每个任务分配都在30分钟后附加到TTL。当TTL过期时,我通过流处理并检查它是否被接受。如果没有,我将在表中重新分配并创建一个新条目,时间为30分钟TTL 我忽略了TTL的一个概念,即它不是实时过期项目,可能需要48小时 有没有其他聪明的方法来处理这样的用例,目前我实现如下- 添加一个索引,TTL作为排序键,event_type=Task作

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

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

我忽略了TTL的一个概念,即它不是实时过期项目,可能需要48小时

有没有其他聪明的方法来处理这样的用例,目前我实现如下-

  • 添加一个索引,TTL作为排序键,event_type=Task作为分区键
  • 每分钟查询TTL小于当前历元的所有记录,并批量删除这些记录
这里有两个挑战-

  • 首先,由于整个表中的事件类型都是常量,所以所有数据都会到达索引的一个分区,这对于大容量来说是不好的
  • 这是一种投票机制,我实际上需要扫描所有记录,这也不是一个可扩展的解决方案

我正在探索我们是否可以通过推动机制巧妙地做到这一点。解决这个用例有什么建议或帮助吗?

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

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

考虑使用。它允许直接在代码中建模业务逻辑。下面是如何在Java中完成的:

@WorkflowInterface
公共接口任务分配{
@工作流程法
无效分配任务();
@信号法
void reportAccepted(字符串userId);
}
@活动接口
公共接口任务分配活动{
字符串pickAvailableUser();
void assignTask(字符串userId);
}
公共类TaskAssignmentImpl实现TaskAssignment{
私有静态最终持续时间任务分配超时=持续时间(1);
私有静态最终整数最大赋值次数=10;
私人活动选项=
ActivityOptions.newBuilder().setStartToCloseTimeout(持续时间为秒(10)).build();
私人最终任务分配活动=
Workflow.newActivityStub(TaskAssignmentActivities.class,选项);
私有字符串用户标识;
@凌驾
公共任务(){
对于(int i=0;iuserId.equals(this.userId));
if(userId.equals(this.userId)){
打破
}
}
}
@凌驾
已接受公共void报告(字符串userId){
this.userId=userId;
}
}

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

只需投影做出此决定所需的属性,以尽可能保持GSI的小型化和廉价化。是的,我现在也在这样做。每分钟运行一次Lambda以查询小于当前历元的记录。由于不能在分区键查询中使用<或>运算符,因此将它们放入排序键中。我可以将过期时间作为分区键,但将其屏蔽到分钟级别并查询以进一步优化和扩展它。我在看我们是否能在秒级上,用一种更聪明的方式来做。如果你需要这样的精确度,我会选择阶跃函数。燕翠为此写了一篇很棒的文章