部署时扭曲和龙卷风的区别?

Abd*_*hab 3 twisted tornado

我对Tornado只有很少的了解,当涉及到部署时,最好使用Nginx作为负载平衡器和Tornado进程的数量.

扭曲怎么样?是这样的吗?

Mik*_*utz 8

如果我正确地追踪你的问题,你似乎在问:"Tornado应该是Nginx的前端,Twisted怎么样?"

如果那确实是问题所在,那么它得到了一个"它取决于"的答案,但也许是你可能没想到的. 在运行时意义上,扭曲,龙卷风和Nginx在很多方面都不是同一件事.

所有这三个系统在其核心中使用相同的编程模式.OO人称之为Reactor模式的东西,通常也称为异步I/O事件编程,以及老派unix人称之为select样式事件循环的东西.(通过select/ epoll/ kqueue/ WaitForMultipleObjects/等完成)

为了建立答案,一些背景:

  • Twisted是一个基于Reactor的框架,用于以最通用的形式编写基于python的异步I/O项目.因此,虽然它非常适合Web应用程序(通过Twisted Web子模块),但它同样适用于处理串行数据(通过SerialPort子模块)或实现完全不同的网络协议,如ssh.

扭曲擅长灵活性.如果您需要将许多IO类型粘合在一起,特别是如果您想将IO连接到Web,那就太棒了.正如remudada回答中所述,它还内置了应用工具(twistd).

作为异步I/O框架,Twisted的周数非常少.作为一个Web框架虽然(虽然它正在积极地继续发展),但与Flask这样的插件丰富的框架相比,它确实在曲线背后明显感觉,而Tornado肯定比Twisted Web有许多Web便利.

  • Torando是python中基于Reactor的框架,它被创建用于非常快速地提供网页/ webapps(基本上可以像python一样快速地提供网页).编写它的人的目标是编写一个如此之快的系统,以至于生产代码本身可能是python.

Tornado核心几乎与Twisted的核心在逻辑上相匹配.这些项目的核心非常相似,在现代版本中,您可以在Tornado中运行Twisted在Twisted中运行Tornado端口.

龙卷风一心一意专注于快速提供网页/网络应用程序.在大多数应用程序中,它比Twisted Web快20%,但远不如支持其他异步I/O使用那样灵活.它(像twisted)仍然是基于python的,所以如果给定的webapp做了太多基于CPU的工作,它的性能会很快下降.

  • Nginx是一个基于Reactor的应用程序,用于提供用C编写的网页和连接重定向.虽然Twisted和Tornado使用Reactor模式使python快速运行,但Nginx将事情转移到下一步并在C中使用该逻辑.

当人们比较Python和C时,他们经常谈论Python的速度要慢1.2到100倍.然而,在Reactor模式中(当它在操作系统中大部分时间花费时),语言效率最低化 - 只要在反应堆外没有太多逻辑发生.

我没有硬数据支持这一点,但我的期望是你会发现最简单的"Hello world"(IE服务静态测试)在Tornado上运行速度不会低于50%然后在Nginx上运行(Twisted Web为20%)比平均更慢的龙卷风).

同一件事的差异速度,这让我们离开了哪里?

你问"最好使用Nginx作为负载平衡器和Tornado进程的数量",所以要回答我需要回答问题.

您是否采用了一种先进多核的关键部署方式?

为了换取异常的IO速度,Reactor模式有一个缺点:

  • 每个Reactor只能利用一个流程核心.

正如您可能猜到的那样,该弱点的另一面是Reactor模式非常有效地使用该核心,如果您有负载,应该能够使该核心接近100%使用.

这导致了你所要求的设计类型,但是这个答案中所有背景的原因是因为这些服务的分层(在Tornado或Twisted之前的Nginx)应该只是为了利用多核机器.

如果您在单核系统(最低级别的云服务器或像Raspberry Pi这样的嵌入式平台)上运行,您不应该在反应堆前端运行.这样做会简化整个系统的速度.

如果你运行更多(负载很重的)反应堆服务然后CPU核心,你也将会对自己起作用.

所以:

  • 如果您在单核系统上部署:
    • 运行Tornado或Twisted的一个实例(如果是静态页面,则单独使用Nginx)
  • 如果你试图充分利用多个核心
    • 在应用程序端口上运行Nginx(或扭曲),为每个剩余的处理器核心运行Tornado或Twisted的一个实例.