我需要创建一个滑动计时器
我需要能够
我的问题是如何可靠地做到这一点。应用程序服务器可能会或可能不会在给定时间对归零计时器进行操作,但需要能够在它们重新上线时进行操作。所有计时器(或时间信息)必须存储在应用程序服务器外部。给定时间最多可以有 10k 个计时器。
我可以使用 Redis/Elasticache TTL 来解决这个问题
但是,数据存储不可靠,因此对底层 Elasticache 的更新会丢失所有记录,或者应用程序服务器的可用性可能会导致错过计时器。此外,redis 服务器不会在 60 分钟后可靠地发出事件;它可以根据 Redis 服务器正在处理的缓存上的项目数量进行延迟。
正在寻找几个选项来可靠地存储表中的计时器并对其做出反应,但陷入停滞
scan
表来获取所有记录并确定是否发生到期时间(lastUpdatedTime > 60 分钟)。不能使用 query
,因为 ID 可能包含多个计时器,并且 PK/SK 无法更改值(无需删除旧密钥并添加新密钥)如果您选择 Redis 路线,您可以使用 MemoryDB,它是具有持久数据存储的 Redis。
DynamoDB TTL 不会为您提供所需的粒度。
EventBridge 计划可能是实现它的好方法,您可以使用 DynamoDB 作为前端数据存储,并使用流和 Lambda 在事件 B 发生时更新计划。
使用 EventBridge 时间表,您可以获得 1 分钟的事件粒度。您可以将事件推送到应用程序可以从中提取的 SQS 队列中。当您的应用程序恢复时,您将在队列中看到所有错过的事件。
唯一需要注意的是,如果事件清零并进入队列,然后事件 B 也在您的应用程序关闭时尝试更新它,您可能会获得该事件两次。