redis - 使用从属 redis 队列使 redis 持久化
问题描述
也许我错过了一些东西,这似乎太简单了。是否可以通过让主 redis 节点将数据复制到从 redis 节点来使 redis 持久化?
我的情况是,我有一个 REST 端点,它在收到来自客户端的请求后,会将有效负载粘贴到 redis 队列中,然后向客户端返回成功(HTTP 200)。如果该队列在消息处理之前和 fsync 发生之前发生故障,我已经丢失了该有效负载并且没有人知道它。
我想知道,如果我可以简单地写入两个 redis 队列(在不同的区域中),一个是主队列,一个是从属队列。当我写入“主”时,redis 将自动在从属队列中写入相同的元素,然后端点才会向客户端返回 HTTP 200。
这可能吗?Redis 将 (i) 需要一种写入从属设备的方法,并且 (ii) 具有同步 API 或可等待 API,只有在确认有效负载已写入主服务器和从服务器时才会返回。这里的关键是redis让调用者知道slave已经收到了事件。
如果客户端没有收到 HTTP 200,他们知道应该再次尝试发送。感觉有一些我没有看到的警告。
谢谢
解决方案
这可能吗?
简短的回答。不,这是不可能的。
Redis 将 (i) 需要一种写入从属设备的方法
Redis 可以将数据复制到从站。但是,复制是异步的,这意味着它将在数据写入从站之前向客户端返回响应。
(ii) 有一个同步 API 或可等待的 API,只有在确认有效负载已写入主服务器和从服务器时才会返回。
从 Redis 3.0 开始,它支持WAIT
命令,该命令将阻塞客户端,直到该客户端的写操作被复制到给定数量的从站。
这可能会缓解问题,至少您可以确保写入操作已复制到服务节点。但是,您仍然可能会丢失数据。因为从服务器在将数据持久化到磁盘之前也可能已关闭。
推荐阅读
- google-apps-script - Google App 脚本:Javascript 运行时意外退出
- google-cloud-platform - 将表架构从 project-1 复制到 project-2 时面临权限问题
- algorithm - 如何将此递归函数转换为基于 dp 的解决方案?
- python - 是否可以使用 XGBoost 预测给定输入向量或一系列向量的整个输出向量?
- swift - 重新加载没有动画Swift的集合视图
- pandas - 来自元组列表的数据框列过滤器
- csv - 读取数据时出错,错误消息:CSV 表引用列位置 15,但从位置开始的行:0 仅包含 1 列
- flutter - Flutter:循环中的 Onpressed() 函数删除最后一个项目,而与单击的任何项目无关
- javascript - 检测点击任何子节点并在 JavaScript 中获取其 ID 属性
- scala - 如何从带有火花的数据框中找到最大长度的唯一行?