redis - 使用 docker swarm 在多节点 Python celery 应用程序中使用 Redis 队列
问题描述
所以这是一个或多或少的理论问题。
假设我们有一个由 3 个节点组成的多节点 Swarm 设置。现在我们已经安装了一个使用 Celery 和 Redis 作为消息代理的 Python 服务。所以基本上还有一个 3 节点副本 redis 服务作为应用程序的一部分。
现在,如果我们只使用服务名称在我的 Python 应用程序中进行 DNS 解析,那么由于这个 Redis 服务充当消息代理,那么 docker swarm 或我的应用程序如何知道哪个 redis 节点将拥有我放置在队列中的任务?
我的意思是,路由网格只会在具有该服务的任何一个节点上引导特定服务的流量。现在我的 Python 应用程序已经异步启动了一个任务,并将其放在 redis 队列中。因此,一旦完成,我希望我的应用程序查询 redis 以获取结果。但是它怎么知道哪个节点有结果。
这有点像粘性会话吗?如果有任何不清楚的地方,请告诉我。
解决方案
我们通常使用位于 redis 集群前面的 redis sentinel 来处理这个用例,以启用自动故障转移,并将 celery 指向 redis-sentinel 作为代理(在 celery 4.2.0 中相当简单)。如果您对在集群中执行和处理手动 redis 故障转移感到满意,那么您只需将 celery 指向 redis 服务。
推荐阅读
- spring-boot - 如何在 Spring Boot 响应控制中删除 Object 的某些字段?
- akka-stream - 使用 Alpakka 的无限 AMQP 消费者
- python - 向 json 字典 python 添加新的键/值
- node.js - 如何在没有 create-react-app 的情况下手动配置 React 的最小设置?
- php - Laravel:下载一个新的 excel 文件
- git - 创建新分支不会为 IntelliJ 中的所有模块创建分支
- reactjs - 如何路由到另一个组件并替换当前组件?
- python - Discord 机器人无法播放音乐
- c++ - 指定初始化程序中参数列表的大括号数
- typescript - 鸭子在 Typescript 中输入一个 Promise