백엔드 Back-end/메시지 큐 Message Queue

Q. 파이썬 팩키지 pika로 래빗엠큐RabbitMQ로 접속할 때 나타나는 에러는?

Tap to restart 2023. 3. 6. 08:00

A. 연결 설정 오류로 StreamLostError: ('Transport indicated EOF',) 등 에러가 발생한다.

 

래빗엠큐 AMQP 기본 port는 5672다. 그런데 엉뚱한 port를 입력한다면?

import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost', port=3306))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

아래처럼 port를 3306으로 입력해보자.

아래처럼 pika.exceptions.IncompatibleProtocolError: StreamLostError: ('Transport indicated EOF',)란 에러가 발생한다.

% python send.py
Traceback (most recent call last):
  File "send.py", line 3, in <module>
    connection = pika.BlockingConnection(
  File "/Users/taptorestart/workspace/playground/python/venv/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 360, in __init__
    self._impl = self._create_connection(parameters, _impl_class)
  File "/Users/taptorestart/workspace/playground/python/venv/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 451, in _create_connection
    raise self._reap_last_connection_workflow_error(error)
pika.exceptions.IncompatibleProtocolError: StreamLostError: ('Transport indicated EOF',)

IncompatibleProtocolError란 3306 MySQL 포트니 AMQP 프로토콜이 아니라서 프로토콜이 안 맞다는 의미다.

 

엉뚱한 host를 입력한다면?

import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='192.168.0.1'))
channel = connection.channel()

아래처럼 pika.exceptions.AMQPConnectionError 연결 오류가 발생한다. 해당 호스트 자체로 연결이 안 되기 때문이다.

 

도커로 실행할 때 아래처럼 -p 5672:5672 \ 한 줄을 빼먹고 실행한 경우에도 마찬가지 오류가 발생한다. 해당 포트인 5672로 연결이 안 되기 때문이다.

docker run --name rabbitmq \
	-p 15672:15672 \
	-v /Users/taptorestart/rabbitmq:/var/lib/rabbitmq \
	-d rabbitmq:3.11.10-management

 

이 때 아래처럼 port를 15672로 한다면 어떻게 될까?

import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost', port=15672))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

앞에서 확인한 pika.exceptions.IncompatibleProtocolError: StreamLostError: ('Transport indicated EOF',) 오류가 발생한다.

그 이유는 15672 포트는 RabbitMQ 웹관리페이지라 HTTP 프로토콜을 지원하지 AMQP 프로토콜을 지원하지 않기 때문이다.

 

관련 글

Q. 파이썬으로 래빗엠큐RabbitMQ 메시지를 보내고 받고 싶다면?

Q. 래빗엠큐RabbitMQ에서 ack의 의미는?