我的服务器安装了大量使用的API

我很快就会为一个即将推出的应用程序购买一堆服务器,但是我担心我的设置。 我感谢我得到的任何反馈。

我有一个应用程序将使用我写的API。 其他用户/开发者也将使用这个API。 API服务器将接收请求并将其中继到工作服务器。 该API将只保存一个MySQL数据库的日志logging,身份validation和速率限制的请求。

每个工作服务器做一个不同的工作,并在未来的规模,我会增加更多的工作服务器,以提供工作。 APIconfiguration文件将被编辑,以logging新的工作服务器。 工作服务器将执行一些处理,一些将保存一个到本地数据库的映像的path,以便以后通过API检索以在我的应用程序上查看,一些将返回进程结果的string并将其保存到本地数据库。

这个设置看起来对你有效吗? 有没有更好的方法来重组呢? 我应该考虑哪些问题? 请看下面的图片,我希望它能帮助理解。 在这里输入图像描述

    更高的可用性

    正如克里斯提到的,你的API服务器是布局中的单点故障。 你设置的是一个消息队列基础设施,这是许多人以前实现的。

    继续沿着同样的道路走

    您提到API服务器上的接收请求,并将作业插入到每个服务器上运行的MySQL数据库中。 如果你想继续这个path,我build议删除API服务器层,并devise工人直接从你的API用户接受命令。 您可以像循环DNS那样使用简单的东西,将每个API用户连接直接分发给其中一个可用的工作节点(如果连接不成功,则重试)。

    使用消息队列服务器

    更强大的消息队列基础设施使用为此目的devise的软件,如ActiveMQ 。 您可以使用ActiveMQ的RESTful API接受来自API用户的POST请求,空闲的工作人员可以获取队列中的下一条消息。 然而,这可能是为了满足您的需求而devise的 – 它专门devise用于延迟,速度和每秒数百万条消息。

    使用Zookeeper

    作为一个中间立场,你可能想看看Zookeeper ,即使它不是一个专门的消息队列服务器。 我们在$ work中使用这个确切的目的。 我们有一套运行Zookeeper服务器软件的三台服务器(类似于你的API服务器),并有一个Web前端用于处理用户和应用程序的请求。 Web前端以及Zookeeper后端与工作人员的连接都有一个负载平衡器,以确保我们继续处理队列,即使服务器已closures以进行维护。 工作完成后,工作人员通知Zookeeper集群工作已完成。 如果一个工人死了,那个工作将被送到另一个工作来完成。

    其他问题

    • 如果工作人员没有回应,请确保工作完成
    • API如何知道工作已完成,并从工作人员的数据库中检索?
    • 尽量减less复杂性。 你需要在每个工作节点上使用一个独立的MySQL服务器,还是可以在API服务器上与MySQL服务器(或复制的MySQL簇)交谈?
    • 安全。 任何人都可以提交工作吗? 有authentication吗?
    • 哪位工作人员应该得到下一份工作? 你没有提到任务是否预计需要10毫秒或1小时。 如果速度很快,则应删除图层以保持延迟。 如果速度缓慢,你应该非常小心,以确保较短的请求不会卡在几个长期运行的请求之后。

    我看到的最大的问题是缺乏故障转移计划。

    您的API服务器是一个很大的单点故障。 如果发生故障,则即使您的工作服务器仍然正常工作,也不会有任何效果。 此外,如果工作服务器停机,则服务器提供的服务不再可用。

    我build议你看一下Linux虚拟服务器项目( http://www.linuxvirtualserver.org/ ),以了解负载均衡和故障转移如何工作,并了解这些如何使您的devise受益。

    有很多方法来构build你的系统。 哪种方式更好是最好的回答你的主观意见。 我build议你做一些研究; 权衡不同方法的权衡。 如果您需要了解植入方法的信息,请提交一个新问题。