2017-03-15 4 views
1

내 프로듀서 코드에서 소비자가 언제 메시지를 수신했는지 알고 싶습니다. basic.ackpika confirm_delivery는 브로커가 메시지를 받았을 때 또는 소비자가 승인했을 때를 확인합니까?

channel.confirm_delivery()BlockingConnection을 사용하면 설명서에서 1) 브로커가 메시지를 받았거나 2) 소비자가이를 수락했다는 것을 확인해야하는지 확실하지 않습니다.

(NO 소비자와)이 코드를 실행 :

import pika 
import uuid 

# Open a connection to RabbitMQ on localhost using all default parameters 
connection = pika.BlockingConnection() 
# Open the channel 
channel = connection.channel() 
queue = str(uuid.uuid4()) 

# Declare the queue 
channel.queue_declare(queue=queue) 

# Turn on delivery confirmations 
channel.confirm_delivery() 

# Send a message 
if channel.basic_publish(exchange='', 
         routing_key=queue, 
         body='Hello World!', 
         properties=pika.BasicProperties(
          content_type='text/plain', 
          delivery_mode=1)): 
    print('Message publish was confirmed') 
else: 
    print('Message could not be confirmed') 

를 확인할 수있는 메시지를 보여줍니다. 이것은 내가 기대하거나 원하는 것이 아닙니다. 반환 : basic_publish 설명서에

말한다 그러나

Behavior of channels in "confirm" mode with RabbitMQ의 중복 될 수있다 배달 확인이 ( 새앙 토끼 0.10.0의 새로운 기능)를 사용할 수 없습니다 true이고, 메시지 가

어느 날 생각하게한다 (Basic.ack없이 Basic.Return) 배달 된 경우 메시지가 이 (Basic.nack 및/또는 Basic.Return)를 deliveved 트루 할 수없는 경우 그렇지 않은 경우는 false 그것은 내가 원했던 것을 가지고 있어야합니다.

답변

0

confirm_deliveriesRabbitMQ가 (메시지가 수신되지 않음)하는 basic.ack (메시지 수신) 또는 basic.nack 하나가 메시지를 수신했을 때 반환되는 것을 의미한다.

그러나 이는 메시지가 큐에 성공적으로 배달되었음을 보장하지 않습니다. 예외를 throw하려면 라우트 할 수없는 메시지에 필수 플래그를 추가해야합니다.

배송 확인 및 필수 플래그 here에 대한 자세한 내용을 볼 수 있습니다.

질문 하시겠습니까? 소비자가 메시지를 성공적으로 처리했는지 여부를 게시자가 알 수있는 방법이 없습니다. 그러나 소비자가 메시지를 소비하지 못하면 다시 대기열에 들어가 다른 소비자가 처리해야하지만 소비자가 얼마나 잘 설계되었는지에 따라 달라집니다.

메시지가 제대로 처리되었는지 알아야 할 경우 RPC 호출과 같은 요청 상태로 응답하는 것이 가장 좋은 방법 일 수 있습니다. X 초 내에 응답을받지 못하면 메시지가 처리되지 않았다고 가정합니다. https://www.rabbitmq.com/tutorials/tutorial-six-python.html

rpc 게시자에게 비동기 예제가 필요한 경우 플라스크 here에 대한 몇 가지 예를 살펴볼 수 있습니다.

+1

이 문제를 해결해 주셔서 감사합니다. 실제로 이것은 몇 가지 테스트를 통해 밝혀진 것입니다. – Martin

관련 문제