运行 RabbitMQ+Celery 与生产环境同台服务器

Running RabbitMQ+Celery in the same server as production environment

我是 运行 EC2 实例中的 Django 应用程序,它使用 RabbitMQ + Celery 进行任务排队。来自与生产应用程序相同的 EC2 实例的 运行 我的 RabbitMQ 节点有什么缺点吗?

如果我们从这个问题中取出 EC2 实例,它将变成:

与我的产品应用程序位于同一服务器上的 运行 RabbitMQ 节点有什么缺点吗?

我想说这取决于各种因素,例如工作负载的种类及其组成、工作负载的复杂性、您预计使用量会增长等。

如果您的工作负载表现良好并且服务器足够大(应用程序 + 任务 q)那么为什么不呢,因为只有一台服务器需要管理。确保通过限制它们的系统资源使用来保护这 2 个进程。

如果您的流量表现不佳,那么您可能需要一台服务器。在这种情况下,拥有专用服务器会更好(关注点分离),因为您将不得不管理不止一台服务器。

现在回到 EC2,以上所有内容仍然适用。 EC2 使应用程序的水平扩展变得更容易,因此如果您将它们放在单独的实例上,那么您可以单独地且经济高效地扩展它们。否则在扩展时会浪费资源。

这个问题的答案实际上取决于您的应用程序的上下文。

当您面对场景时,您应该始终考虑一些事情。

关注点分离 在这里,我们要确保其中一个系统不对其他系统的 运行 负责。这包括

  • 如果ec2实例运行所有的东西都挂了,队列中剩余的任务会继续吗运行

  • 如果我的 RAM 已满,所有系统是否仍能正常运行

  • 我可以只扩展我的应用程序的一部分而不必重新设计基础架构吗?

通过将 rabbit 和 django(带有某种服务、wsgi、gunicorn、waitress 等)全部放在一个盒子上,您会失去很多资源的偶然性。

虽然 RAM 和 CPU 可能很充裕,但 IO、磁盘写入、网络写入等是有限的。这意味着如果由于某种原因你的写入功能很重,所有其他系统可能会受到影响因此。如果您有大量写入 RAM 的功能,同样适用。

因此,从您的问题和我自己的经验中可以看出,将事物保存在一个系统中的真正缺点如下。

  • 多个故障点。如果您的一个 rabbit 实例失败,您的队列和任务将停止工作。

  • 如果您的应用开始产生大流量,其他系统就会开始争夺资源。

  • 如果任何组件出现故障,则可能意味着其他服务的其他停机时间。

  • 系统停机意味着所有组件完全停机。

  • 当您的应用程序需要更多资源且停机时间最短时,会带来很多麻烦。

  • 大量网络流量会减慢任务速度运行

  • 大量任务 运行 会减慢网络请求速度

  • 大量 IO 会降低所有速度

我通常遵循的经验法则是让单点故障彼此远离 - 这样您只需要管理那些组件。一个很好的用例是为您的应用程序使用一个 EC2 实例,另一个用于您的工作人员,另一个用于您的兔子。这样,如果需要,您可以只为那些组件应用 smaller/bigger 实例。您甚至可以创建 AMI 并创建自动缩放组 - 如果这是您的用例。

这里有一些文章可以参考

TLDR;如果您可以 运行 在一个 EC2 上,您应该在今天轻松扩展。

Joshnidhin 和 Giannis 都涵盖了 RAM、IO 和 CPU 方面。

我在单个实例中有 运行 个生产应用程序,并且可以安心地睡觉,如果明天突然有很多人想要我构建的东西,我可以通过在不同的实例上部署这些容器来快速扩展而不是一个实例。

Docker 允许您限制每个容器的 CPU 消耗和内存使用,因此您也可以确保它们不会相互干扰。