所以我的目标是要有几个使用Rabbitmq消息相互交互的容器(rabbitmq服务器在单独的容器中)
兔子
class Rabbit:
host = 'rabbitmq-host'
userid = 'test'
password = 'test'
class Consumer(Rabbit):
def __init__(self, exchange_name):
self.exchange_name = exchange_name
self.connection = None
try:
credentials = pika.PlainCredentials(self.userid, self.password)
params = pika.ConnectionParameters(self.host, 5672, '/', credentials)
self.connection = pika.BlockingConnection(params)
except Exception as ex:
print(ex)
if self.connection is not None and self.connection.is_open:
self.connection.close()
raise ex
self.channel = self.connection.channel()
凭据测试:测试存在,我重新检查。
然后从另一个文件(main.py)创建使用者
c = Consumer('media')
docker-compose.yml
version: '3'
services:
rabbitmq-server:
image: "rabbitmq:3-management"
hostname: "rabbitmq-host"
environment:
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "test"
RABBITMQ_DEFAULT_PASS: "test"
RABBITMQ_DEFAULT_VHOST: "/"
ports:
- "15672:15672"
- "5672:5672"
labels:
NAME: "rabbitmq1"
info-getter:
build: ./info-getter
depends_on:
- rabbitmq-server
tty: true
ports:
- "3000:3000"
测试时,我在容器中运行rabbitmq服务器,但本地机器上的应用程序均正常运行,但是当我运行“docker-compose up”时,出现此异常:
info-getter_1 |
info-getter_1 | Traceback (most recent call last):
info-getter_1 | File "main.py", line 10, in <module>
info-getter_1 | c = Consumer('media')
info-getter_1 | File "libs/rabbit.py", line 27, in __init__
info-getter_1 | raise ex
info-getter_1 | File "libs/rabbit.py", line 22, in __init__
info-getter_1 | self.connection = pika.BlockingConnection(params)
info-getter_1 | File "/usr/local/lib/python3.6/site-packages/pika/adapters/blocking_connection.py", line 360, in __init__
info-getter_1 | self._impl = self._create_connection(parameters, _impl_class)
info-getter_1 | File "/usr/local/lib/python3.6/site-packages/pika/adapters/blocking_connection.py", line 451, in _create_connection
info-getter_1 | raise self._reap_last_connection_workflow_error(error)
info-getter_1 | pika.exceptions.AMQPConnectionError
services_info-getter_1 exited with code 1
我要去哪里错了?
我还要补充一点,即使我指定了“depends_on”,在运行“docker-compose up”后,信息获取日志也会出现在rabbitmq-server日志之前。
最佳答案
通常,错误消息包含其他状态-例如:
通常是由于RabbitMQ工作程序/客户端无法连接到RabbitMQ服务器而导致此错误。
这可能是由多种原因引起的-我列举几个:
1)没有正确指定RabbitMQ服务器的IP。
它可能没有传递带有环境变量的代码(这就是为什么在代码中添加对此进行检查很重要的原因)。
当使用docker-compose时,应将RabbitMQ服务器的IP替换为服务DNS(这是docker-compose.yml
文件中服务的名称,或者hostname
属性的值,如果已指定)。
2)RabbitMQ的工作人员/客户试图在准备就绪之前到达RabbitMQ服务器。
请注意,depend_on
仅表示服务之间的依赖关系,并等待服务启动但尚未准备就绪。
因此,您不能依靠添加以下内容:
depends_on:
- rabbitmq-server
因为RabbitMQ服务器服务引导阶段需要时间。
请参阅以下有关
depend_on
命令的参考。请参阅下面针对此运行时相关性问题提供的解决方案。
3)使用
5672
端口的主机上已经在运行RabbitMQ服务器服务。在这种情况下,当您尝试启动RabbitMQ服务器服务时,您将收到一个显式错误,但是从RabbitMQ-worker的 Angular 来看,它是同样的问题。您可以通过以下方法解决#2中提到的运行时依赖性问题:
A)在客户端中有重试逻辑-考虑使用pluggins和Shoval这样的Federation。
B)如果问题的原因是#2-您可以使用restart_policy选项,并且在重试几次后连接将成功。
C)使用诸如wait-for-it,dockerize或与sh兼容的wait-for之类的工具。这些是小型包装脚本,您可以将其包含在应用程序的镜像中,以轮询给定的主机和端口,直到它接受TCP连接为止。在here中阅读更多内容。
D)执行
docker-compose up rabbitmq-server
,仅在服务准备就绪后才执行其他服务。E)在worker执行命令中使用时间间隔(例如
sleep 10
)(我不推荐这种方法)。关于Docker-Compose docs中的
depends_on
:使用
depends_on
时需要注意以下几点:关于python - 使用docker-compose在Docker容器之间发送RabbitMq消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56280607/