在与生产环境相同的服务器上运行RabbitMQ + Celery

die*_*con 11 amazon-ec2 rabbitmq amazon-web-services celery django-celery

我在EC2实例中运行Django应用,该实例使用RabbitMQ + Celery进行任务排队。从与生产应用程序相同的EC2实例运行RabbitMQ节点有任何缺点吗?

Gia*_*ini 5

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

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

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

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

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

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

通过将 rabbit 和 django(具有某种服务、wsgi、gunicorn、女服务员等)全部放在一个盒子上,您会失去很多资源应急。

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

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

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

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

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

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

  • 当您的应用程序以最少的停机时间需要更多资源时,会遇到很多麻烦。

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

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

  • 大量 IO 会减慢所有事情的速度

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

这里有一些文章供参考