Amazon web services 运行RabbitMQ+;芹菜与生产环境位于同一服务器中

Amazon web services 运行RabbitMQ+;芹菜与生产环境位于同一服务器中,amazon-web-services,amazon-ec2,rabbitmq,celery,django-celery,Amazon Web Services,Amazon Ec2,Rabbitmq,Celery,Django Celery,我正在EC2实例中运行一个Django应用程序,它使用RabbitMQ+Cellery进行任务队列。从与我的生产应用程序相同的EC2实例运行我的RabbitMQ节点是否有任何缺点?如果我们将EC2实例从这个问题中排除,它将变成: 在与我的产品应用程序相同的服务器上运行RabbitMQ节点是否存在任何缺点 我想说,这取决于各种因素,比如工作负载的种类及其组成、工作负载的复杂性、您是否期望使用量的增长等等 如果您的工作负载表现良好,并且服务器足够大(应用程序+任务q),那么为什么不呢,因为只有一台服

我正在EC2实例中运行一个Django应用程序,它使用RabbitMQ+Cellery进行任务队列。从与我的生产应用程序相同的EC2实例运行我的RabbitMQ节点是否有任何缺点?

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

在与我的产品应用程序相同的服务器上运行RabbitMQ节点是否存在任何缺点

我想说,这取决于各种因素,比如工作负载的种类及其组成、工作负载的复杂性、您是否期望使用量的增长等等

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

如果您的流量表现不好,那么您可能需要多个服务器。在这种情况下,使用专用服务器更好(分离关注点),因为您必须管理多个服务器


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

此问题的答案实际上取决于应用程序的上下文

当你面对情景时,你应该经常考虑一些事情。 关注点分离 这里,我们要确保其中一个系统不负责其他系统的运行。这包括

  • 如果运行所有内容的ec2实例停止运行,队列中剩余的任务是否会继续运行

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

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

通过让rabbit和django(提供某种服务、wsgi、gunicorn、waitress等)都放在一个盒子上,你就失去了很多资源应急

尽管RAM和CPU可能很丰富,但IO、磁盘写入、网络写入等都有限制。这意味着,如果出于某种原因,您的写入功能很重,那么所有其他系统都可能因此受到影响。如果您有大量的写入RAM功能,同样适用

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

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

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

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

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

  • 当应用程序需要更多资源,并减少停机时间时,会遇到许多麻烦

  • 大量的web流量会降低任务运行速度

  • 大量的任务运行会降低web请求的速度

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

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

这里有一些文章供参考


    • TLDR;如果您可以在一个EC2上运行,那么您现在应该可以轻松地进行扩展

      Joshnidhin和Giannis都介绍了RAM、IO和CPU方面的内容

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

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