(在清楚地描述情况的同时,我会尽量保持这个问题的简短。如果有任何遗漏,请发表评论。)
情况
- 我在同一个数据中心运行一个包含三台服务器的集群
- 为了简化部署,每台服务器运行完全相同的应用程序代码
目标
- 由单个服务器每分钟运行一个任务(称为Task X )。
在这些条件下
- 集群保持分布式和高可用性
- 每台服务器都在运行相同的应用程序代码。换句话说,不存在“将代码 A 部署到主服务器并将代码 B 部署到所有辅助服务器”这样的事情。
我不想区分服务器类型的原因是为了保持高可用性(避免所谓的主服务器宕机时出现问题)、冗余(分配负载),以及避免创建需要部署不同服务器的复杂部署过程应用到不同类型的服务器。
为什么这么难?如果我要添加每 5 分钟执行一次此任务的代码,那么每个服务器都会执行它,因为每个服务器运行相同的应用程序代码。因此,他们需要能够协调在每个滴答期间哪个服务器将运行相同。
我能够使用分布式消息传递机制,例如Apache Kafka
或Redis
。如果使用这样的机制来协调这样的任务,那么这样的“算法”将如何工作?
我向其他人提出了这个问题,他的回答是使用任务队列。然而,这似乎并没有解决问题,因为问题仍然存在:哪个服务器将任务添加到任务队列?如果所有服务器都将任务添加到队列中,则会导致重复条目。此外,哪个服务器将执行队列中的下一个任务?所有这些都需要通过集群内部的协调来决定,而不需要区分不同类型的服务器。