6

我想在 Python 中创建 2 个应该相互通信的应用程序。其中一个应用程序应该像服务器一样运行,第二个应用程序应该是客户端的 GUI。它们可以在同一系统(同一台机器上)或远程和不同设备上运行。

我想问你,我应该使用哪种技术 - AMQP 消息传递(如RabbitMQ),Twisted如服务器(或Tornado)或 ZeroMQ 并将应用程序连接到它。将来我想进行某种身份验证等。

我已经阅读了很多问题和文章(例如:Why do we need to use rabbitmq),很多人都在说“rabbitmq 和 twisted 是不同的”。我知道他们是。我真的很想知道这些差异以及为什么在这种情况下这些解决方案中的一个会比另一个更好。

编辑: 我想用它来满足以下要求:

  1. 一次将有超过 1 个用户连接 - 我认为将有 1 - 10 个用户连接到同一个程序,他们将协同工作
  2. 发送的数据是“消息”,告诉用户做了什么——比如远程调用(但不要专注于此,因为 GUIS 可以用不同的语言编写,所以消息将类似于 json 信息)。
  3. 该系统应该允许协作工作——因此它应该尽可能地具有交互性。(当用户输入或执行某些操作时,数据将一直发送)。

另外,我很想听听为什么一种解决方案不仅在这种特殊情况下会比另一种更好。

4

2 回答 2

10

Twisted 用于通过Reactor Pattern为您提供异步网络来解决 C10k 网络问题。它也很方便,因为它提供了一个很好的并发抽象,因为 Python 中的线程/并发不像 Erlang 那样简单。因此,有些人使用 Twisted 来调度工作任务,但这不是它的设计目的。

RabbitMQ 基于消息队列模式。这一切都与可靠的消息传递有关,与网络无关。我强调可靠的部分,因为有许多不同的异步网络框架(例如 Vert.x)提供消息传递(也称为 pub/sub)。

大多数人通常将这两种模式结合在一起创建一个“消息总线”,它可以满足各种网络需求,而不会出现不必要的网络阻塞,并实现出色的集成和可扩展性。

“消息队列”与网络“反应器循环”如此相配的原因是您不应该阻塞反应器循环,因此您必须将阻塞工作分派给其他进程(线程、lwp、单独的机器进程、队列等..)。在实践中,最简洁的方法是分布式消息传递。

根据您的要求,如果您希望结果立即显示并扩展,您应该使用异步网络,但是您可能会使用一个简单的系统,只要您只有少数客户端,就可以进行轮询。所以问题是总共有多少用户(Twisted)?您希望交付更新的可靠性如何(RabbitMQ)?最后,您是否希望您的架构与语言和平台无关...也许您以后想使用 Node.js(专注于消息队列而不是异步网络...即 RabbitMQ)。就我个人而言,我会看看Vert.x,它允许你用 Python 编写代码。

于 2013-02-05T19:46:55.727 回答
1

当有人告诉您 Twisted 和 RabbitMQ 不同时,是因为比较两者就像比较具有不同目标的两个事物。

Twisted 是一个异步框架,类似于 Tornada。RabbitMQ 是一个消息队列系统。你不能直接比较每一个。

您应该将您的问题变成两个新问题,第一个问题是我应该使用哪种协议来传达我的流程?答案可以用诸如 amqp、Protocol Buffers 之类的词来找出...

另一个,我应该使用哪个框架来编写我的客户端和服务器程序?在这里,答案可能落在 Twisted、Tornado、....

于 2013-02-05T16:15:12.627 回答