确保在消费者应用程序停机时可靠恢复丢失的 Redis 排序集

问题描述 投票:0回答:1

我的系统有两个应用程序:

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 分钟键唯一。 如有必要,我愿意使用其他工具或机制。

redis consistency data-consistency
1个回答
0
投票

您可以使用 Scan 命令,即使出于安全原因处理器应用程序没有停机,我也愿意使用该命令,除非您有大量使用,您可以负担得起资源。

不要根据当前时间精确拉取 1

SortedSet
,而是迭代缓存服务器并拉取所有密钥,然后对您拉取的密钥执行操作。

如果您也有不同类型的钥匙,或者您有一些钥匙您出于任何原因不想删除 - 请使用

MATCH
选项。
比方说,如果某一天足够安全满足您的需求,请使用
MATCH=2024-09-26*
扫描,然后使用
MATCH=2024-09-25*
扫描,那么您将获得今天和昨天的所有钥匙。
您还可以指定
TYPE=SortedSet
,这样您就只能从类型排序集中获取键。 \ 请注意 —
SCAN
只返回键,而不返回值。聚合密钥后,使用它们来提取值。

© www.soinside.com 2019 - 2024. All rights reserved.