Python용 Azure Service Bus 클라이언트 라이브러리 - 버전 7.11.4
Azure Service Bus 분산 발신자와 수신자 간에 실시간 및 내결함성 통신을 제공하기 위한 고성능 클라우드 관리 메시징 서비스입니다.
Service Bus는 구조적 선착순 메시징, 게시/구독 기능 및 요구 사항이 증가함에 따라 쉽게 스케일링할 수 있는 기능과 같은 비동기 고도로 안정적인 통신을 위한 여러 메커니즘을 제공합니다.
Python용 Service Bus 클라이언트 라이브러리를 사용하여 애플리케이션과 서비스 간에 통신하고 비동기 메시징 패턴을 구현합니다.
- Service Bus 네임스페이스, 큐, topics 및 구독을 만들고 해당 설정을 수정합니다.
- Service Bus 채널 내에서 메시지를 보내고 받습니다.
- 메시지 잠금, 세션 및 배달 못한 편지 기능을 활용하여 복잡한 메시징 패턴을 구현합니다.
소스 코드 | 패키지(PyPi) | 패키지(Conda) | API 참조 설명서 | 제품 설명서 | 샘플 | Changelog
참고: 버전 0.50 이하를 사용하고 이 패키지의 최신 버전으로 마이그레이션하려는 경우 Service Bus V0.50에서 Service Bus V7로 이동하는 마이그레이션 가이드를 참조하세요.
시작
패키지 설치
pip를 사용하여 Python용 Azure Service Bus 클라이언트 라이브러리를 설치합니다.
pip install azure-servicebus
필수 조건:
이 패키지를 사용하려면 다음이 있어야 합니다.
- Azure 구독 -체험 계정 만들기
- Azure Service Bus - 네임스페이스 및 관리 자격 증명
- Python 3.7 이상 - Python 설치
Azure Service Bus 네임스페이스가 필요한 경우 Azure Portal을 통해 만들 수 있습니다. 그래픽 포털 UI를 사용하지 않으려면 Cloud Shell 통해 Azure CLI를 사용하거나 Azure CLI를 로컬로 실행하여 이 Azure CLI 명령을 사용하여 만들 수 있습니다.
az servicebus namespace create --resource-group <resource-group-name> --name <servicebus-namespace-name> --location <servicebus-namespace-location>
클라이언트 인증
Service Bus와의 상호 작용은 클래스의 instance 시작합니다ServiceBusClient
. 클라이언트 개체를 인스턴스화하려면 SAS 키가 있는 연결 문자열 또는 네임스페이스와해당 계정 키 중 하나가 필요합니다.
두 방법 중 하나를 통해 인증하는 방법에 대한 데모를 위해 아래에 연결된 샘플을 찾습니다.
연결 문자열 클라이언트 만들기
- 필요한 자격 증명을 얻으려면 연결된 샘플의 맨 위에 있는 Azure CLI 코드 조각(Bash Shell용 형식)을 사용하여 service bus 연결 문자열 환경 변수를 채울 수 있습니다(Service Bus 연결 문자열 가져오기에 대한 단계별 가이드에 따라 Azure Portal에서 이러한 값을 찾을 수도 있음).
azure-identity 라이브러리를 사용하여 클라이언트를 만듭니다.
- 이 생성자는 Service Bus instance 정규화된 네임스페이스와 TokenCredential 프로토콜을 구현하는 자격 증명을 사용합니다. azure-identity 패키지에서 사용할 수 있는 프로토콜의
TokenCredential
구현이 있습니다. 정규화된 네임스페이스는 형식<yournamespace.servicebus.windows.net>
입니다. - 에서 제공하는 자격 증명 형식을
azure-identity
사용하려면 패키지를 설치하세요.pip install azure-identity
- 또한 비동기 API를 사용하려면 먼저 와 같은
aiohttp
비동기 전송을 설치해야 합니다.pip install aiohttp
- Azure Active Directory를 사용하는 경우 보안 주체에게 Azure Service Bus 데이터 소유자 역할과 같은 Service Bus에 대한 액세스를 허용하는 역할이 할당되어야 합니다. Service Bus에서 Azure Active Directory 권한 부여를 사용하는 방법에 대한 자세한 내용은 관련 설명서를 참조하세요.
참고: 컨텍스트 관리자 없이 클라이언트를 초기화할 수 있지만 리소스를 누출하지 않려면 client.close()를 통해 수동으로 닫아야 합니다.
주요 개념
를 초기화 ServiceBusClient
한 후에는 Service Bus 네임스페이스 내의 기본 리소스 유형과 상호 작용할 수 있으며, 그 중 여러 리소스가 존재할 수 있으며 실제 메시지 전송이 수행되는 경우 네임스페이스는 애플리케이션 컨테이너로 사용되는 경우가 많습니다.
큐: 메시지 보내기 및 수신을 허용합니다. 지점 간 통신에 자주 사용됩니다.
토픽: 큐와 달리 토픽은 시나리오를 게시/구독하는 데 더 적합합니다. 토픽을 보낼 수 있지만 구독이 필요하며, 그 중 여러 항목을 병렬로 사용할 수 있어야 합니다.
구독: 토픽에서 사용하는 메커니즘입니다. 각 구독은 독립적이며 토픽에 전송된 각 메시지의 복사본을 받습니다. 규칙 및 필터를 사용하여 특정 구독에서 수신되는 메시지를 조정할 수 있습니다.
이러한 리소스에 대한 자세한 내용은 Azure Service Bus?을 참조하세요.
이러한 리소스와 상호 작용하려면 다음 SDK 개념에 익숙해야 합니다.
ServiceBusClient: 사용자가 Service Bus 네임스페이스에 연결하기 위해 먼저 초기화해야 하는 개체입니다. 큐, 토픽 또는 구독과 상호 작용하려면 이 클라이언트에서 보낸 사람 또는 수신기를 생성합니다.
ServiceBusSender: 큐 또는 토픽에 메시지를 보내려면 여기에 표시된 대로 instance 해당
get_queue_sender
또는get_topic_sender
메서드를ServiceBusClient
사용합니다.ServiceBusReceiver: 큐 또는 구독에서 메시지를 받으려면 여기에 표시된 대로 instance 해당
get_queue_receiver
또는get_subscription_receiver
메서드를ServiceBusClient
사용합니다.ServiceBusMessage: 전송할 때 페이로드를 포함하도록 생성할 형식입니다. 수신 시 페이로드에 액세스할 수 있습니다.
스레드로부터의 안전성
ServiceBusClient, ServiceBusSender 및 ServiceBusReceiver가 스레드로부터 안전하다는 보장은 없습니다. 스레드 간에 이러한 인스턴스를 다시 사용하지 않는 것이 좋습니다. 스레드로부터 안전한 방식으로 이러한 클래스를 사용하는 것은 실행 중인 애플리케이션에 달려 있습니다.
예제
다음 섹션에서는 다음을 포함하여 가장 일반적인 Service Bus 작업을 다루는 몇 가지 코드 조각을 제공합니다.
큐/topics/구독 만들기 및 삭제와 같은 관리 작업을 수행하려면 여기에서 사용할 수 있는 azure-mgmt-servicebus 라이브러리를 활용하세요.
전송, 수신, 세션 관리 및 메시지 처리와 같은 일반적인 Service Bus 시나리오를 보여주는 샘플 디렉터리에서 추가 예제를 확인하세요.
큐에 메시지 보내기
참고: 참조 설명서는 여기를 참조하세요.
이 예제에서는 Azure Portal 또는 az 명령을 통해 만든 이미 존재하는 것으로 간주되는 큐에 단일 메시지 및 메시지 배열을 보냅니다.
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_sender(queue_name) as sender:
# Sending a single message
single_message = ServiceBusMessage("Single message")
sender.send_messages(single_message)
# Sending a list of messages
messages = [ServiceBusMessage("First message"), ServiceBusMessage("Second message")]
sender.send_messages(messages)
참고: 메서드를 사용
ServiceBusSender.schedule_messages()
하거나 호출하기 전에 를 지정하여 배달이 지연될 수 있습니다.ServiceBusMessage.scheduled_enqueue_time_utc
ServiceBusSender.send_messages()
예약 및 취소 일정에 대한 자세한 내용은 여기 샘플을 참조 하세요.
큐에서 메시지 받기
큐에서 수신하려면 수신자 자체를 통해 receiver.receive_messages()
임시 수신을 수행하거나 영구적으로 수신할 수 있습니다.
ServiceBusReceiver를 반복하여 큐에서 메시지 받기
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
# max_wait_time specifies how long the receiver should wait with no incoming messages before stopping receipt.
# Default is None; to receive forever.
with client.get_queue_receiver(queue_name, max_wait_time=30) as receiver:
for msg in receiver: # ServiceBusReceiver instance is a generator.
print(str(msg))
# If it is desired to halt receiving early, one can break out of the loop here safely.
참고: 을
receive_mode=PEEK_LOCK
사용하여 받은 모든 메시지(기본값이며, 수신 시 큐에서 메시지를 즉시 제거하는 대체 RECEIVE_AND_DELETE 있음)에는 처리가 잠금 기간보다 오래 걸리는 경우 만료되기 전에 을 통해receiver.renew_message_lock
갱신해야 하는 잠금이 있습니다. 도우미가 자동으로 백그라운드에서 이 작업을 수행하려면 AutoLockRenewer 갱신 을 참조하세요. 잠금 기간은 큐 또는 토픽 자체의 Azure에서 설정됩니다.
ServiceBusReceiver.receive_messages()를 통해 큐에서 메시지 받기
참고:
ServiceBusReceiver.receive_messages()
는 생성기에서 영구적으로 수신하는 것이 아니라 임시 메서드 호출을 통해 단일 또는 제한된 메시지 목록을 수신합니다. 항상 목록을 반환합니다.
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
received_message_array = receiver.receive_messages(max_wait_time=10) # try to receive a single message within 10 seconds
if received_message_array:
print(str(received_message_array[0]))
with client.get_queue_receiver(queue_name) as receiver:
received_message_array = receiver.receive_messages(max_message_count=5, max_wait_time=10) # try to receive maximum 5 messages in a batch within 10 seconds
for message in received_message_array:
print(str(message))
이 예제에서 max_message_count max_wait_time 적중하기 전에 수신하려는 최대 메시지 수를 초 단위로 선언합니다.
참고: 또한 피킹되는 메시지를 잠그지 않으므로 메시지를 확인할 수 없으므로 수신하는 것과 미묘하게 다르다는 점도 유
ServiceBusReceiver.peek_messages()
의해야 합니다.
세션 사용 큐에서 메시지 보내기 및 받기
세션은 큐 또는 구독 위에 선입선출 및 단일 수신기 의미 체계를 제공합니다. 실제 수신 구문은 동일하지만 초기화는 약간 다릅니다.
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_SESSION_QUEUE_NAME']
session_id = os.environ['SERVICE_BUS_SESSION_ID']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_sender(queue_name) as sender:
sender.send_messages(ServiceBusMessage("Session Enabled Message", session_id=session_id))
# If session_id is null here, will receive from the first available session.
with client.get_queue_receiver(queue_name, session_id=session_id) as receiver:
for msg in receiver:
print(str(msg))
참고: 세션에서 받은 메시지는 비 세션 수신자처럼 잠금을 갱신할 필요가 없습니다. 대신 로 갱신할 수 있는 세션 잠금을 사용하여 세션 수준에서 잠금 관리가 수행됩니다.
receiver.session.renew_lock()
topics 및 구독 작업
토픽 및 구독은 메시지를 보내고 받기 위한 큐에 대한 대안을 제공합니다. 자세한 내용은 여기에서 문서를 참조하고 이러한 항목과 큐의 차이점을 확인하세요.
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
topic_name = os.environ['SERVICE_BUS_TOPIC_NAME']
subscription_name = os.environ['SERVICE_BUS_SUBSCRIPTION_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_topic_sender(topic_name) as sender:
sender.send_messages(ServiceBusMessage("Data"))
# If session_id is null here, will receive from the first available session.
with client.get_subscription_receiver(topic_name, subscription_name) as receiver:
for msg in receiver:
print(str(msg))
영수증 후 메시지 해결
큐에서 수신할 때 받은 메시지에 대해 수행할 수 있는 여러 작업이 있습니다.
참고: 모드에서
ServiceBusReceiveMode.PEEK_LOCK
수신되는 개체만 정정ServiceBusReceivedMessage
할 수 있습니다(기본값임).ServiceBusReceiveMode.RECEIVE_AND_DELETE
모드는 수신 시 큐에서 메시지를 제거합니다.ServiceBusReceivedMessage
메시지 잠금이 앞에서 언급한 수신 메서드에 있는 것처럼 수행되지 않으므로 에서peek_messages()
반환된 메시지를 확인할 수 없습니다.
메시지에 위에서 설명한 대로 잠금이 있는 경우 메시지 잠금이 만료되면 해결에 실패합니다.
처리가 잠금 기간보다 오래 걸리는 경우 만료되기 전에 를 통해 receiver.renew_message_lock
유지 관리해야 합니다.
잠금 기간은 큐 또는 토픽 자체의 Azure에서 설정됩니다.
도우미가 백그라운드에서 자동으로 이 작업을 수행하려면 AutoLockRenewer 를 참조하세요.
완료
성공적으로 완료되도록 메시지 처리를 선언하고 큐에서 메시지를 제거합니다.
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.complete_message(msg)
중단
당분간 메시지 처리를 중단하고 다른(또는 동일한) 수신자가 선택할 메시지를 큐로 즉시 되돌려 줍니다.
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.abandon_message(msg)
DeadLetter
기본 큐에서 매개 변수 sub_queue=ServiceBusSubQueue.DEAD_LETTER
가 있는 함수를 사용하여 ServiceBusClient.get_<queue|subscription>_receiver
액세스하고 다른 수신기와 마찬가지로 에서 사용할 수 있는 특수한 "배달 못한 편지 하위 큐"로 메시지를 전송합니다. ( 여기서 샘플 참조)
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.dead_letter_message(msg)
지연
연기는 이전의 정산 방법과 미묘하게 다릅니다. 호출 ServiceBusReceiver.receive_deferred_messages
시 시퀀스 번호로 수신되도록 큐에서 메시지를 따로 설정하여 메시지가 큐에서 직접 수신되지 않도록 방지합니다( 여기 샘플 참조).
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.defer_message(msg)
메시지 또는 세션 잠금 자동 갱신
참고:자동 잠금 갱신에 대한 참조 설명서를 참조하세요.
AutoLockRenewer
는 호출 receiver.renew_message_lock
/receiver.session.renew_lock
이 비실용적이거나 원치 않는 경우 오랜 기간 동안에도 메시지 또는 세션이 잠기도록 하는 간단한 방법입니다.
내부적으로 개체가 만료될 무렵에 잠금 갱신을 수행하는 동시 Watchdog를 만드는 것은 약어에 지나지 않습니다.
다음과 같이 사용해야 합니다.
- 메시지 잠금 자동 갱신
from azure.servicebus import ServiceBusClient, AutoLockRenewer
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
# Can also be called via "with AutoLockRenewer() as renewer" to automate closing.
renewer = AutoLockRenewer()
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver.receive_messages():
renewer.register(receiver, msg, max_lock_renewal_duration=60)
# Do your application logic here
receiver.complete_message(msg)
renewer.close()
- 세션 잠금 자동 갱신
from azure.servicebus import ServiceBusClient, AutoLockRenewer
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
session_queue_name = os.environ['SERVICE_BUS_SESSION_QUEUE_NAME']
session_id = os.environ['SERVICE_BUS_SESSION_ID']
# Can also be called via "with AutoLockRenewer() as renewer" to automate closing.
renewer = AutoLockRenewer()
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(session_queue_name, session_id=session_id) as receiver:
renewer.register(receiver, receiver.session, max_lock_renewal_duration=300) # Duration for how long to maintain the lock for, in seconds.
for msg in receiver.receive_messages():
# Do your application logic here
receiver.complete_message(msg)
renewer.close()
어떤 이유로든 자동 갱신이 중단되거나 실패한 경우 갱신 중인 개체의 auto_renew_error
속성을 통해 또는 갱신자 초기화 시 매개 변수에 콜백을 전달하여 이를 관찰할 on_lock_renew_failure
수 있습니다.
또한 지정된 개체에 대해 작업을 수행하려고 할 때(예: 메시지 완료) 매니페스트됩니다.
문제 해결
로깅
- 로거가 라이브러리에서 추적을 수집하도록 설정합니다
azure.servicebus
. - 로거가 기본 uAMQP 라이브러리에서 추적을 수집하도록 설정합니다
uamqp
. - 클라이언트를 만들 때 를 설정하여 AMQP 프레임 수준 추적을 사용하도록 설정합니다
logging_enable=True
. - 로깅이 너무 자세한 것으로 간주
uamqp
하는 경우가 있을 수 있습니다. 불필요한 로깅을 표시하지 않려면 코드 맨 위에 다음 코드 조각을 추가합니다.
import logging
# The logging levels below may need to be changed based on the logging that you want to suppress.
uamqp_logger = logging.getLogger('uamqp')
uamqp_logger.setLevel(logging.ERROR)
# or even further fine-grained control, suppressing the warnings in uamqp.connection module
uamqp_connection_logger = logging.getLogger('uamqp.connection')
uamqp_connection_logger.setLevel(logging.ERROR)
시간 제한
라이브러리 내에서 사용자가 알고 있어야 하는 다양한 시간 제한이 있습니다.
- 10분 서비스 쪽 링크 닫기: 일단 열리면 리소스 누출로부터 서비스를 보호하기 위해 10분 동안 유휴 상태인 링크가 닫힙니다. 이는 대체로 사용자에게 투명해야 하지만 이러한 기간 후에 다시 연결이 발생하는 것을 발견하면 이러한 이유가 됩니다. 링크에서 관리 작업을 포함한 모든 작업을 수행하면 이 시간 제한이 연장됩니다.
- max_wait_time: 수신기를 만들 때 제공되거나 를 호출
receive_messages()
할 때 트래픽이 없는 후 메시지를 수신하는 시간이 중지됩니다. 메시지가 없는 경우 종료하기 전에 생성기 스타일 수신이 실행되는 길이뿐만 아니라 명령적receive_messages()
함수에도 적용됩니다. 다른 작업이 수행되지 않으면 없음(기본값)을 전달하면 10분 임계값까지 영원히 대기합니다.
참고: 메시지 또는 세션의 처리가 시간 제한을 유발하기에 충분한 경우 수동으로 호출
receiver.renew_message_lock
/receiver.session.renew_lock
하는 대신 위의 에 자세히 설명된 기능을 활용할AutoLockRenewer
수 있습니다.
일반적인 예외
Service Bus API는 azure.servicebus.exceptions에서 다음 예외를 생성합니다.
- ServiceBusConnectionError: 서비스에 대한 연결에서 오류가 발생했습니다. 일시적인 네트워크 문제 또는 서비스 문제로 인해 발생할 수 있습니다. 다시 시도하는 것이 좋습니다.
- ServiceBusAuthorizationError: 서비스에 대한 연결 권한을 부여할 때 오류가 발생했습니다. 이 문제는 자격 증명에 작업을 수행할 수 있는 올바른 권한이 없기 때문일 수 있습니다. 자격 증명의 권한을 검사 것이 좋습니다.
- ServiceBusAuthenticationError: 서비스에 대한 연결을 인증할 때 오류가 발생했습니다. 이는 자격 증명이 올바르지 않음으로 인해 발생했을 수 있습니다. 자격 증명을 검사 것이 좋습니다.
- OperationTimeoutError: 이는 서비스가 예상된 시간 내에 작업에 응답하지 않았음을 나타냅니다. 일시적인 네트워크 문제 또는 서비스 문제로 인해 발생할 수 있습니다. 서비스가 요청을 성공적으로 완료했거나 완료하지 않았을 수 있습니다. 상태 알 수 없습니다. 현재 상태를 확인하고 필요한 경우 다시 시도하는 것이 좋습니다.
- MessageSizeExceededError: 이는 메시지 콘텐츠가 서비스 버스 프레임 크기보다 크다는 것을 나타냅니다.
이 문제는 너무 많은 서비스 버스 메시지가 일괄 처리로 전송되거나 본
Message
문에 전달된 콘텐츠가 너무 큰 경우에 발생할 수 있습니다. 일괄 처리로 전송되는 메시지의 수 또는 단일ServiceBusMessage
에 전달되는 콘텐츠 크기를 줄이는 것이 좋습니다. - MessageAlreadySettled: 이는 메시지를 정정하지 못했음을 나타냅니다. 이는 이미 해결된 메시지를 해결하려고 할 때 발생할 수 있습니다.
- MessageLockLostError: 메시지에 대한 잠금이 만료되어 큐로 다시 해제되었습니다.
그것은 그것을 해결하기 위해 다시 받아야합니다.
메시지의 잠금 기간을 알고 있어야 하며 처리 시간이 긴 경우 만료 전에 잠금을 계속 갱신해야 합니다.
AutoLockRenewer
는 메시지의 잠금을 자동으로 갱신하는 데 도움이 될 수 있습니다. - SessionLockLostError: 세션에 대한 잠금이 만료되었습니다.
수신된 모든 불안정한 메시지는 더 이상 해결할 수 없습니다.
필요한 경우 메시지를 다시 수신하는 경우 세션에 다시 연결하는 것이 좋습니다.
세션의 잠금 기간을 알고 있어야 하며 처리 시간이 긴 경우 만료 전에 잠금을 계속 갱신해야 합니다.
AutoLockRenewer
는 세션의 잠금을 자동으로 갱신하는 데 도움이 될 수 있습니다. - MessageNotFoundError: 특정 시퀀스 번호가 있는 메시지를 받으려고 시도합니다. 이 메시지를 찾을 수 없습니다. 메시지를 아직 받지 못했는지 확인합니다. 전달 실패 큐에서 메시지가 전달되지 않았는지 확인합니다.
- MessagingEntityNotFoundError: 작업과 연결된 엔터티가 없거나 삭제되었습니다. 엔터티가 있는지 확인하세요.
- MessagingEntityDisabledError: 비활성화된 엔터티에 대한 런타임 작업 요청 엔터티를 활성화하세요.
- ServiceBusQuotaExceededError: 메시징 엔터티가 최대 허용 크기에 도달했거나 네임스페이스에 대한 최대 연결 수를 초과했습니다. 엔터티나 하위 큐에서 메시지를 수신하여 엔터티에 공간을 만듭니다.
- ServiceBusServerBusyError: 현재 서비스는 요청을 처리할 수 없습니다. 클라이언트가 잠시 대기한 후 작업을 다시 시도할 수 있습니다.
- ServiceBusCommunicationError: 클라이언트가 Service Bus에 대한 연결을 설정할 수 없습니다. 제공된 호스트 이름이 정확하며 호스트에 연결할 수 있는지 확인합니다. 코드가 방화벽/프록시를 사용하는 환경에서 실행되는 경우 Service Bus 도메인/IP 주소 및 포트에 대한 트래픽이 차단되지 않았는지 확인합니다.
- SessionCannotBeLockedError: 특정 세션 ID를 사용하여 세션에 연결하려고 시도하지만 세션은 현재 다른 클라이언트에 의해 잠겨 있습니다. 해당 세션이 다른 클라이언트에서 잠금 해제되었는지 확인합니다.
- AutoLockRenewFailed: 백그라운드에서 메시지 또는 세션에 대한 잠금을 갱신하지 못했습니다.
이 문제는 에서
AutoLockRenewer
사용하는 수신기가 닫혀 있거나 재생 가능한 수신기의 잠금이 만료되었을 때 발생할 수 있습니다. 메시지를 받거나 세션 엔터티에 다시 연결하여 재생 가능 메시지 또는 세션을 다시 등록하는 것이 좋습니다. - AutoLockRenewTimeout: 메시지 또는 세션 잠금을 갱신하기 위해 할당된 시간이 경과했습니다. 자동 잠금을 갱신하려는 개체를 다시 등록하거나 시간 제한을 미리 연장할 수 있습니다.
- ServiceBusError: 다른 모든 Service Bus 관련 오류입니다. 위에서 설명한 모든 오류의 루트 오류 클래스입니다.
일반적인 예외 유형에 대한 자세한 설명 은 예외 참조 문서를 참조하세요.
다음 단계
추가 샘플 코드
전송, 수신, 세션 관리 및 메시지 처리와 같은 일반적인 Service Bus 시나리오를 보여주는 샘플 디렉터리에서 추가 예제를 확인하세요.
추가 설명서
Service Bus 서비스에 대한 자세한 설명서는 docs.microsoft.com Service Bus 설명서를 참조하세요 .
관리 기능 및 설명서
ServiceBus에 대한 관리 작업을 수행하려는 사용자의 경우(큐/토픽/등 만들기, 필터 규칙 변경, 엔터티 열거) API 설명서에 대한 azure-mgmt-servicebus 설명서를 참조하세요. Terse 사용 예제는 여기에서 도 찾을 수 있습니다.
순수 Python AMQP 전송 및 이전 버전과의 호환성 지원
이제 Azure Service Bus 클라이언트 라이브러리는 순수 Python AMQP 구현을 기반으로 합니다. uAMQP
가 필수 종속성으로 제거되었습니다.
기본 전송으로 사용하려면 다음을 수행 uAMQP
합니다.
- pip를 사용하여 설치
uamqp
합니다.
$ pip install uamqp
- 클라이언트를 생성하는 동안 전달
uamqp_transport=True
합니다.
from azure.servicebus import ServiceBusClient
connection_str = '<< CONNECTION STRING FOR THE SERVICE BUS NAMESPACE >>'
queue_name = '<< NAME OF THE QUEUE >>'
client = ServiceBusClient.from_connection_string(
connection_str, uamqp_transport=True
)
참고: message
이전에 을ServiceBusMessageBatch
//ServiceBusMessage
ServiceBusReceivedMessage
노출uamqp.Message
한 의 특성은 더 이상 사용되지 않습니다.
특성을 통해 반환된 message
"레거시" 개체는 전환을 용이하게 하기 위해 도입되었습니다.
원본에서 uAMQP 휠 빌드
azure-servicebus
는 AMQP 프로토콜 구현을 위한 uAMQP에 따라 달라집니다.
uAMQP 휠은 대부분의 주요 운영 체제에 대해 제공되며 를 설치할 때 자동으로 설치 azure-servicebus
됩니다.
uAMQP를 의 기본 AMQP 프로토콜 구현azure-servicebus
으로 사용하려는 경우 대부분의 주요 운영 체제에서 uAMQP 휠을 찾을 수 있습니다.
uAMQP 휠이 제공되지 않는 플랫폼에서 실행하는 경우 를 사용 uAMQP
하려는 경우 uAMQP 휠이 제공되지 않은 플랫폼에서 실행 중인 경우 uAMQP 설치 지침에 따라 원본에서 설치하세요.
참여
이 프로젝트에 대한 기여와 제안을 환영합니다. 대부분의 경우 기여하려면 권한을 부여하며 실제로 기여를 사용할 권한을 당사에 부여한다고 선언하는 CLA(기여자 라이선스 계약)에 동의해야 합니다. 자세한 내용은 https://cla.microsoft.com 을 참조하세요.
끌어오기 요청을 제출하면 CLA-bot은 CLA를 제공하고 PR을 적절하게 데코레이팅해야 하는지 여부를 자동으로 결정합니다(예: 레이블, 설명). 봇에서 제공하는 지침을 따르기만 하면 됩니다. 이 작업은 CLA를 사용하여 모든 리포지토리에서 한 번만 수행하면 됩니다.
이 프로젝트에는 Microsoft Open Source Code of Conduct(Microsoft 오픈 소스 준수 사항)가 적용됩니다. 자세한 내용은 Code of Conduct FAQ(규정 FAQ)를 참조하세요. 또는 추가 질문이나 의견은 opencode@microsoft.com으로 문의하세요.
Azure SDK for Python