更高的可用性
正如Chris所提到的,您的API服务器是布局中的单点故障。您正在设置的是消息队列基础结构,这是很多人以前实现的。
继续走同样的路
您提到在API服务器上接收请求,然后将作业插入在每台服务器上运行的MySQL DB中。如果您想继续使用此方法,建议您删除API服务器层,并设计Workers以直接接受您的API用户的命令。您可以使用轮询DNS这样的简单方法将每个API用户连接直接分配到可用的工作节点之一(如果连接不成功,则重试)。
使用消息队列服务器
更健壮的消息排队基础结构使用为此目的而设计的软件,例如ActiveMQ。您可以使用ActiveMQ的RESTful API接受来自API用户的POST请求,而空闲的工作程序可以获取队列中的下一条消息。但是,这可能对于您的需求来说是过大的-它设计用于等待时间,速度和每秒数百万条消息。
使用Zookeeper
作为中间立场,您可能想看看Zookeeper,即使它不是专门用于消息队列的服务器。我们将$ work用于此确切目的。我们有一组三个服务器(类似于您的API服务器),它们运行Zookeeper服务器软件,并具有用于处理来自用户和应用程序的请求的Web前端。Web前端以及与工作人员的Zookeeper后端连接都具有负载平衡器,以确保即使服务器停机进行维护,我们也可以继续处理队列。工作完成后,工作人员会告诉Zookeeper集群该工作已完成。如果工人死亡,该工作将被发送到另一项工作中完成。
其他问题
- 确保工作完成,以防工人没有响应
- API如何知道作业已完成,以及如何从工作人员的数据库中检索出来?
- 尝试降低复杂性。您是否需要在每个工作程序节点上使用独立的MySQL服务器,或者它们可以与API服务器上的MySQL服务器(或复制的MySQL群集)进行通信?
- 安全。有人可以提交工作吗?有认证吗?
- 哪个工人应该下一份工作?您没有提及任务预计需要10毫秒还是1个小时。如果速度很快,则应删除图层以降低延迟。如果它们很慢,则应非常小心,以确保较短的请求不会滞后于一些长时间运行的请求。