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

用于开发和模拟的Lite Python AMQP服务器实现?,python,mocking,amqp,Python,Mocking,Amqp,在Django中,运行/manage.py runserver对开发人员来说非常好,避免了安装和启动真正的Web服务器的麻烦 如果您没有运行Django,您仍然可以非常轻松地设置gunicorn服务器 AMQP有类似的功能吗 我不需要一个完整的实现,也不需要一些健壮的东西,只需要一些易于安装和运行的dev.PyPi包就好了 芹菜不是答案。我不要客户端,我要服务器。就像一个迷你python RabbitMq。我不知道python中实现了任何AMQP代理。我不知道一般的“lite”实现;我认为实现A

在Django中,运行
/manage.py runserver
对开发人员来说非常好,避免了安装和启动真正的Web服务器的麻烦

如果您没有运行Django,您仍然可以非常轻松地设置gunicorn服务器

AMQP有类似的功能吗

我不需要一个完整的实现,也不需要一些健壮的东西,只需要一些易于安装和运行的dev.PyPi包就好了


芹菜不是答案。我不要客户端,我要服务器。就像一个迷你python RabbitMq。

我不知道python中实现了任何AMQP代理。我不知道一般的“lite”实现;我认为实现AMQP代理非常复杂,那些尝试它的人要么希望接近AMQP规范的某个版本,要么根本不费事。:)

我也不太明白运行代理如何会出现与为web应用程序运行测试web服务器相同的问题

如果应用程序不在web服务器中运行,web服务器将毫无用处。在开发应用程序时,无需进行全面部署就可以运行它

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

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

也许你有一些我没有想到的特殊问题;如果是这样的话,请留下评论(或扩展你的问题)来解释



编辑:最近我对基于AMQP的应用程序进行了大量测试,我发现RabbitMQ非常有用。它包括一个代理,我正在使用它为每个测试运行创建一个新的vhost,然后销毁它以清理代理的状态。这使得在共享代理上运行测试的侵入性大大降低。使用HTTP API来管理这一点,而不是使用正在测试的AMQP客户端,可以避免测试变得有些循环。

我也有同样的问题,看到空间有多干燥,我感到震惊。即使经过这么长时间,也几乎没有一个轻量级的AMQP服务器。我甚至找不到Github上的玩具实现。AMQP似乎是一个协议的野兽。我还发现RabbitMQ可能是最轻的

我最终使用了一个基于Docker的集成测试解决方案,该解决方案可以自动启动和终止RabbitMQ容器。您需要安装并且(当然)在您的计算机上运行Docker守护程序。我已经在用Docker做其他事情了,所以这对我的设置来说不是什么大问题;YMMV。之后,我基本上会:

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
导入docker
client=docker.from_env()
c=client.containers.run(
“rabbitmq:alpine”,使用alpine Linux构建(较小)
auto_remove=True,#停止时自动删除
detach=True,#在守护程序模式下运行
端口={'5672/tcp':('127.0.0.1',无)}绑定到随机本地主机端口
)
container=client.containers.get(c.id)#重新获取端口的容器
port=container.attrs['NetworkSettings']['Ports']['5672/tcp'][0]['HostPort']
# ... 在(127.0.0.1:)上设置所需的RabbitMQ实例
# ... 对(127.0.0.1:)运行测试
container.kill()#比“stop”快。也将删除它,所以不需要友好
在测试中等待整个服务器启动是很糟糕的,但是我想如果你想变得聪明,你可以缓存实例,在每次测试之前清除它,也许在开发会话开始时让它启动一次,然后在下一个会话开始时刷新。我最终可能会那样做


如果您想要一些长寿命的东西,而这些东西不一定是为了持久性开发而以编程方式启动和终止的,那么它可能会更好地为您服务。

+1。我对它没有什么特别的问题,只是对我来说,有一个快速pip安装的需求文件比手动管理所有依赖项更容易。好吧,我想我会做一个神话。顺便说一下,如果您使用的是芹菜,我相信可以将其配置为完全绕过代理并同步执行任务,这非常适合测试场景。是的。但这不是芹菜的使用案例(你可以使用getthoq)