开发和模拟的Lite Python AMQP服务器实现?

时间:2011-03-03 10:26:22

标签: python mocking amqp

在Django中,运行./manage.py runserver对开发人员来说非常好,避免了设置和启动真实网络服务器的麻烦。

如果你没有运行Django,你仍然可以很容易地设置一个gunicorn服务器。

AMQP有类似内容吗?

我不需要完整的实现,也不需要强大的东西,只需要易于安装和运行dev的东西。 PyPi包很棒。

芹菜不是答案。我不想要客户端,我想要一台服务器。就像迷你蟒蛇RabbitMq。

2 个答案:

答案 0 :(得分:3)

我不知道在Python中实现的任何AMQP代理。我一般都不知道“精简”的实施;我认为实现AMQP代理是非常复杂的,那些尝试它的人要么接近AMQP规范的一个版本,要么根本不打扰。 :)

我也不太清楚运行代理如何呈现与为Web应用程序运行测试Web服务器相同的问题。

如果没有您的应用程序在其中运行,Web服务器没有任何用处,并且在您开发应用程序时,无需进行完全部署即可运行它。

但是您没有实现代理的内部,并且您可以动态配置它(与Web服务器不同),每次更改代码时都不需要重新启动它。交换,绑定和队列可以由被测试的应用程序声明,然后自动删除。

安装RabbitMQ并不困难,它几乎不需要任何配置(如果有的话),因为它附带了一个默认的vhost和guest用户帐户,可以在隔离的测试环境中使用。所以我从未遇到让RabbitMQ在我的测试机上运行的问题。

也许你有一些我没想过的特别问题;如果是这种情况,请留下评论(或扩展您的问题)来解释它。


编辑:最近我一直在对基于AMQP的应用程序进行大量测试,我发现RabbitMQ的Management Plugin非常有用。它包含一个HTTP API,我用它来做每个测试运行创建一个新的vhost,然后销毁它以清理代理的状态。这使得在共享代理上运行测试的干扰更小。使用HTTP API来管理它,而不是测试的AMQP客户端,避免测试变得有些循环。

答案 1 :(得分:0)

我有同样的问题,看到空间有多干,我感到震惊。即使在这段时间之后,那里几乎没有轻量级的AMQP服务器。我甚至无法在Github上找到玩具实现。 AMQP似乎是一个协议的野兽。我还发现RabbitMQ可能和它一样轻。

我最终使用基于Docker的解决方案进行集成测试,自动启动并杀死RabbitMQ容器。您需要安装Docker Python library并且(当然)在您的计算机上运行Docker守护程序。我已经在使用Docker处理其他事情了,所以它对我的设置来说并不是一个大问题;因人而异。在那之后,基本上我做了:

import docker

client = docker.from_env()
c = client.containers.run(
    'rabbitmq:alpine',                       # use Alpine Linux build (smaller)
    auto_remove=True,                        # Remove automatically when stopped
    detach=True,                             # Run in daemon mode  
    ports={'5672/tcp' : ('127.0.0.1', None)} # Bind to a random localhost port
)

container = client.containers.get(c.id)      # Re-fetch container for port
port = container.attrs['NetworkSettings']['Ports']['5672/tcp'][0]['HostPort']

# ... Do any set up of the RabbitMQ instance needed on (127.0.0.1:<port>)

# ... Run tests against (127.0.0.1:<port>)

container.kill()   # Faster than 'stop'. Will also delete it so no need to be nice

在测试中必须等待整个服务器启动很糟糕但是我想如果你想要变得非常聪明,你可以缓存实例并在每次测试之前清除它,并且可能在开发时开始一次会话,然后在下一个开始时刷新。我可能最终会这样做。

如果你想要更长寿的东西,不一定以编程方式启动并杀死持久开发者,那么normal Docker route可能会更好地为你服务。