具有多个域(博客,应用程序)的 Django 应用程序 - 一个服务器实例还是多个服务器实例更好?

具有多个域(博客,应用程序)的 Django 应用程序 - 一个服务器实例还是多个服务器实例更好?

我正在 Django 框架中开发多个简单的应用程序(你可以将它们想象成具有各种功能的更复杂的博客)。所有应用程序都具有许多类似的功能 - 主要是定制的 CMS。我可以在 Django 中将它们创建为一个项目,并使用多主机中间件来处理来自各个域的请求。预期的应用程序数量为 10-1000 个,应用程序的预期命中率为每天 100/10k。

我的想法是在 AWS 或 GCP 上运行这个项目(所有应用程序)。

Django 非常灵活,我可以使用我现在使用的设置 - 多主机中间件,或者我可以为每个应用程序稍微自定义设置 - 因此所有应用程序相同的代码将集中在一个地方,但每个应用程序都有自己的实例。 这两个选项都是可行的,从编码的角度来看,它们的难度级别相似。

所以我的问题是,我应该:

  1. 使用所有应用程序创建一个项目实例(主应用程序将检测域并处理请求),
  2. 或者我应该为每个应用程序创建一个实例并在“Apache 级别”处理域重定向,
  3. 或者我应该为每个应用程序创建新的“托管”实例(虚拟机?不管他们怎么称呼它)?

什么更具可扩展性?什么更安全?什么更便宜?什么通常更好?

答案1

就可扩展性而言,问题归结为单个应用程序是否可以水平扩展。如果 Django 应用程序不保留任何需要在请求之间保留的状态,那么您可以根据需要创建尽可能多的 VM 副本来为用户提供服务。

如果您的 Django 应用程序均未在应用程序内部保持此类状态,那么您可以通过添加更多 VM 来扩展规模,无论 VM 本身是否托管一个或多个应用程序。

如果任何应用程序确实需要跨请求的数据,并且无法轻松地跨多个 VM 进行水平扩展,那么您最初可以做的最好的事情就是为每个应用程序配置一个 VM。这样它们就不会危及其他应用程序的可扩展性。

您的某些 Django 应用程序可能使用数据库作为存储数据的后端,在这种情况下,同样的问题也适用于数据库。数据库层的水平扩展将更加困难,因为在数据库层,您肯定有需要跨实例复制的持久数据。

我建议每个应用程序都使用一个单独的数据库,除非您需要在应用程序之间共享某些特定数据。您还应该调查云提供商是否提供满足您需求的数据库服务,这样您就不必管理自己的数据库。

从安全性方面来看,通常认为隔离性越高越好。因此从这个角度来看,您应该为每个应用程序选择单独的虚拟机。

在灵活性方面,为每个应用程序单独设置虚拟机也具有优势。也许您会发现需要为虚拟机设置特定的配置来支持其中一个应用程序,并为另一个应用程序设置另一种配置。如果您使用单独的虚拟机,则可以根据需要灵活地执行此操作。

因此,到目前为止,所有论点都支持为每个应用程序单独设置虚拟机。现在让我们看看它的成本是多少。

为了实现冗余,我建议每个池至少有 3 个虚拟机。如果为 1000 个应用程序各设置一个池,则总共有 3000 个虚拟机。除此之外,您还需要为实际接收足够流量的应用程序配置足够的虚拟机,因为这些应用程序需要多个虚拟机来处理所有流量。

如果您为所有应用程序使用单个池,那么您只需要配置足够的虚拟机来处理所有流量,再加上少量的虚拟机用于冗余。

这意味着您将为上述好处支付 2000-3000 台额外虚拟机的费用。这是否是合理的价格由您决定。在做出决定之前,我建议您首先测试一下您将处理多少台虚拟机的负载。无论这个数字是 100 还是 10000,都会对您是否愿意再花 3000 台虚拟机产生很大的影响。

相关内容