首页 > 解决方案 > 使用 docker swarm 在多节点 Python celery 应用程序中使用 Redis 队列

问题描述

所以这是一个或多或少的理论问题。

假设我们有一个由 3 个节点组成的多节点 Swarm 设置。现在我们已经安装了一个使用 Celery 和 Redis 作为消息代理的 Python 服务。所以基本上还有一个 3 节点副本 redis 服务作为应用程序的一部分。

现在,如果我们只使用服务名称在我的 Python 应用程序中进行 DNS 解析,那么由于这个 Redis 服务充当消息代理,那么 docker swarm 或我的应用程序如何知道哪个 redis 节点将拥有我放置在队列中的任务?

我的意思是,路由网格只会在具有该服务的任何一个节点上引导特定服务的流量。现在我的 Python 应用程序已经异步启动了一个任务,并将其放在 redis 队列中。因此,一旦完成,我希望我的应用程序查询 redis 以获取结果。但是它怎么知道哪个节点有结果。

这有点像粘性会话吗?如果有任何不清楚的地方,请告诉我。

标签: rediscelerydocker-swarm

解决方案


我们通常使用位于 redis 集群前面的 redis sentinel 来处理这个用例,以启用自动故障转移,并将 celery 指向 redis-sentinel 作为代理(在 celery 4.2.0 中相当简单)。如果您对在集群中执行和处理手动 redis 故障转移感到满意,那么您只需将 celery 指向 redis 服务。


推荐阅读