我的系统有两个应用程序:
infraApp: 使用sortedSet每2分钟将数据写入Redis。每个sortedSet键都基于当前日期和时间,格式为yyyy-MM-dd-HH:MM,例如2024-09-26-15:12。
processorrApp:从Redis读取sortedSet数据,将其发送到队列进行处理,然后删除sortedSet。但是,这个processorApp是一个可执行文件。 cronjob 不断崩溃并运行此可执行文件。processorrApp 是一个 node.js 应用程序。再说一遍,这是一个可执行程序
问题: 如果processorApp出现故障,infraApp会继续将数据写入Redis。当processorrApp重新上线时,我希望它能够一致地处理在停机期间丢失的数据,然后从中断的地方继续处理。
限制:
我需要确保没有数据丢失,并且每个排序集都被处理一次。 infraApp 不得受到processorApp 停机的影响。 问题: 设计该系统以确保在 handlerrApp 重新上线时对丢失数据进行一致处理的最佳方法是什么?有适合这种场景的特定 Redis 模式或队列机制吗?
其他详细信息: Redis用于处理数据之前的临时存储。 用作sortedSet 键的日期时间格式可确保每2 分钟键唯一。 如有必要,我愿意使用其他工具或机制。
您可以使用 Scan 命令,即使出于安全原因处理器应用程序没有停机,我也愿意使用该命令,除非您有大量使用,您可以负担得起资源。
不要根据当前时间精确拉取 1
SortedSet
,而是迭代缓存服务器并拉取所有密钥,然后对您拉取的密钥执行操作。
如果您也有不同类型的钥匙,或者您有一些钥匙您出于任何原因不想删除 - 请使用
MATCH
选项。 MATCH=2024-09-26*
扫描,然后使用 MATCH=2024-09-25*
扫描,那么您将获得今天和昨天的所有钥匙。 TYPE=SortedSet
,这样您就只能从类型排序集中获取键。 \
请注意 — SCAN
只返回键,而不返回值。聚合密钥后,使用它们来提取值。