Python için Azure Service Bus istemci kitaplığı - sürüm 7.11.4
Azure Service Bus, dağıtılmış gönderenler ve alıcılar arasında gerçek zamanlı ve hataya dayanıklı iletişim sağlamaya yönelik yüksek performanslı bir bulut tarafından yönetilen mesajlaşma hizmetidir.
Service Bus, yapılandırılmış ilk çıkar mesajlaşma, yayımlama/abone olma özellikleri ve gereksinimleriniz arttıkça kolayca ölçeklendirebilme gibi zaman uyumsuz son derece güvenilir iletişim için birden çok mekanizma sağlar.
Uygulamalar ve hizmetler arasında iletişim kurmak ve zaman uyumsuz mesajlaşma desenleri uygulamak için Python için Service Bus istemci kitaplığını kullanın.
- Service Bus ad alanları, kuyruklar, konular ve abonelikler oluşturun ve ayarlarını değiştirin.
- Service Bus kanallarınızda ileti gönderin ve alın.
- Karmaşık mesajlaşma desenlerini uygulamak için ileti kilitlerini, oturumları ve teslim edilemeyen harf işlevlerini kullanın.
Kaynak kodu | Paket (PyPi) | Paket (Conda) | API başvuru belgeleri | Ürün belgeleri | Örnekleri | Changelog
NOT: 0.50 veya daha düşük bir sürümü kullanıyorsanız ve bu paketin en son sürümüne geçmek istiyorsanız, Service Bus V0.50'den Service Bus V7'ye geçmek için lütfen geçiş kılavuzumuza bakın.
Başlarken
Paketi yükleme
Pip ile Python için Azure Service Bus istemci kitaplığını yükleyin:
pip install azure-servicebus
Ön koşullar:
Bu paketi kullanmak için aşağıdakilere sahip olmanız gerekir:
- Azure aboneliği - Ücretsiz hesap oluşturma
- Azure Service Bus - Ad alanı ve yönetim kimlik bilgileri
- Python 3.7 veya üzeri - Python'ı yükleme
Azure Service Bus ad alanına ihtiyacınız varsa, bunu Azure Portal aracılığıyla oluşturabilirsiniz. Grafik portalın kullanıcı arabirimini kullanmak istemiyorsanız, azure CLI'yi Cloud Shell aracılığıyla kullanabilir veya Azure CLI yerel olarak çalıştırarak şu Azure CLI komutuyla oluşturabilirsiniz:
az servicebus namespace create --resource-group <resource-group-name> --name <servicebus-namespace-name> --location <servicebus-namespace-location>
İstemcinin kimliğini doğrulama
Service Bus ile etkileşim, sınıfının bir örneğiyle ServiceBusClient
başlar. İstemci nesnesinin örneğini oluşturmak için SAS anahtarına sahip bir bağlantı dizesi veya ad alanına ve hesap anahtarlarından birine ihtiyacınız vardır.
Her iki yaklaşımla da kimlik doğrulaması yapma hakkında tanıtım için lütfen aşağıda bağlantılı örnekleri bulun.
bağlantı dizesi'dan istemci oluşturma
- Gerekli kimlik bilgilerini almak için, bir ortam değişkenini service bus bağlantı dizesi ile doldurmak için bağlı örneğin üst kısmındaki Azure CLI kod parçacığını (Bash Shell için Biçimlendirildi) kullanabilirsiniz (hizmet veri yolu bağlantı dizesi alma adım adım kılavuzunu izleyerek bu değerleri Azure Portal'da da bulabilirsiniz).
azure-identity kitaplığını kullanarak istemci oluşturma:
- Bu oluşturucu, Service Bus örneğinizin tam ad alanını ve TokenCredential protokolünün uygulandığı bir kimlik bilgisini alır. Azure-identity paketinde
TokenCredential
kullanılabilen protokol uygulamaları vardır. Tam ad alanı biçimindedir<yournamespace.servicebus.windows.net>
. - tarafından
azure-identity
sağlanan kimlik bilgisi türlerini kullanmak için lütfen paketini yükleyin:pip install azure-identity
- Ayrıca, zaman uyumsuz API'yi kullanmak için önce gibi
aiohttp
bir zaman uyumsuz aktarım yüklemeniz gerekir:pip install aiohttp
- Azure Active Directory kullanırken sorumlunuza Service Bus'a erişim izni veren bir rol atanmalıdır, örneğin Azure Service Bus Veri Sahibi rolü. Service Bus ile Azure Active Directory yetkilendirmesini kullanma hakkında daha fazla bilgi için lütfen ilişkili belgelere bakın.
Not: İstemci bağlam yöneticisi olmadan başlatılabilir, ancak kaynakları sızdırmamak için client.close() aracılığıyla el ile kapatılmalıdır.
Önemli kavramlar
bir ServiceBusClient
başlatıldıktan sonra, service bus ad alanı içindeki birincil kaynak türleriyle etkileşim kurabilirsiniz. Bu türlerde birden çok kaynak bulunabilir ve gerçek ileti iletiminin gerçekleştiği ad alanı genellikle bir uygulama kapsayıcısı görevi görür:
Kuyruk: İleti göndermeye ve almaya izin verir. Genellikle noktadan noktaya iletişim için kullanılır.
Konu: Kuyrukların aksine, Konular yayımlama/abone olma senaryolarına daha uygundur. Bir konu adresine gönderilebilir, ancak birden çok tane paralel olarak kullanılabilmesi için bir abonelik gerektirir.
Abonelik: Bir Konudan tüketecek mekanizma. Her abonelik bağımsızdır ve konuya gönderilen her iletinin bir kopyasını alır. Kurallar ve Filtreler, belirli bir abonelik tarafından alınan iletileri uyarlamak için kullanılabilir.
Bu kaynaklar hakkında daha fazla bilgi için bkz. Azure Service Bus nedir?.
Bu kaynaklarla etkileşime geçmek için aşağıdaki SDK kavramları hakkında bilgi sahibi olmanız gerekir:
ServiceBusClient: Bu, bir kullanıcının service Bus Ad Alanına bağlanmak için önce başlatması gereken nesnedir. Bir kuyruk, konu veya abonelikle etkileşime geçmek için, bu istemciden bir gönderen veya alıcı çıkarılır.
ServiceBusSender: Kuyruğa veya Konuya ileti göndermek için, burada görüldüğü gibi örneğin
ServiceBusClient
karşılık gelenget_queue_sender
veyaget_topic_sender
yöntemini kullanabilirsiniz.ServiceBusReceiver: Kuyruktan veya Abonelikten ileti almak için, burada görüldüğü gibi örneğin
ServiceBusClient
karşılık gelenget_queue_receiver
veyaget_subscription_receiver
yöntemini kullanabilirsiniz.ServiceBusMessage: Gönderirken, yükünüzü içerecek şekilde bu tür oluşturulur. Alırken yüke burada erişebilirsiniz.
İş parçacığı güvenliği
ServiceBusClient, ServiceBusSender ve ServiceBusReceiver'ın iş parçacığı açısından güvenli olduğunu garanti etmeyiz. Bu örneklerin iş parçacıkları arasında yeniden kullanılması önerilmez. Bu sınıfları iş parçacığı güvenli bir şekilde kullanmak çalışan uygulamaya bağlı.
Örnekler
Aşağıdaki bölümlerde, en yaygın Service Bus görevlerinden bazılarını kapsayan çeşitli kod parçacıkları sağlanır:
- Kuyruğa ileti gönderme
- Kuyruktan ileti alma
- Oturum etkin bir kuyruktan ileti gönderme ve alma
- Konu başlıkları ve aboneliklerle çalışma
- Alındıktan sonra iletiyi kapatma
- İleti veya Oturum kilitlerini otomatik olarak yenileme
Kuyrukları/konuları/abonelikleri oluşturma ve silme gibi yönetim görevlerini gerçekleştirmek için lütfen burada bulunan azure-mgmt-servicebus kitaplığını kullanın.
Lütfen samples dizininde gönderme, alma, oturum yönetimi ve ileti işleme gibi yaygın Service Bus senaryolarını gösteren diğer örnekleri bulun.
Kuyruğa ileti gönderme
NOT: Buradaki başvuru belgelerine bakın.
Bu örnek, Azure portal veya az komutları aracılığıyla oluşturulmuş, zaten var olduğu varsayılan bir kuyruğa tek bir ileti ve ileti dizisi gönderir.
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)
NOT: Bir ileti, yöntemi kullanılarak
ServiceBusSender.schedule_messages()
veya çağrıdan önce belirtilerekServiceBusMessage.scheduled_enqueue_time_utc
gecikmeli teslim için zamanlanabilirServiceBusSender.send_messages()
İptali zamanlama ve zamanlama hakkında daha fazla ayrıntı için lütfen buradaki örneklere bakın.
Kuyruktan ileti alma
Kuyruktan almak için, aracılığıyla geçici bir alma receiver.receive_messages()
gerçekleştirebilir veya alıcının kendisi aracılığıyla kalıcı olarak alabilirsiniz.
ServiceBusReceiver üzerinden yineleme yoluyla kuyruktan ileti alma
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.
NOT: ile
receive_mode=PEEK_LOCK
alınan tüm iletiler (bu varsayılandır, alternatif RECEIVE_AND_DELETE iletiyi alındıktan hemen sonra kuyruktan kaldırır), işlemenin kilit süresinden uzun sürmesi durumunda süresi dolmadan önce üzerindenreceiver.renew_message_lock
yenilenmesi gereken bir kilit vardır. Bir yardımcının bunu arka planda otomatik olarak gerçekleştirmesi için bkz. AutoLockRenewer'ı kilitler . Kilit süresi Azure'da kuyrukta veya konunun kendisinde ayarlanır.
ServiceBusReceiver.receive_messages() aracılığıyla kuyruktan ileti alma
NOT:
ServiceBusReceiver.receive_messages()
oluşturucudan kalıcı olarak almak yerine geçici bir yöntem çağrısı aracılığıyla iletilerin tek veya kısıtlanmış bir listesini alır. Her zaman bir liste döndürür.
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))
Bu örnekte, max_message_count saniye cinsinden belirtilen bir max_wait_time vurmadan önce almayı deneyecek en fazla ileti sayısını bildirir.
NOT: Ayrıca, göz atılmakta olan
ServiceBusReceiver.peek_messages()
iletileri kilitlemediğinden ve bu nedenle yerleşemediklerinden, almaktan çok daha farklı olduğu da belirtilmelidir.
Oturum etkin bir kuyruktan ileti gönderme ve alma
NOT: Oturum gönderme ve alma için başvuru belgelerine bakın.
Oturumlar, kuyruğun veya aboneliğin en üstünde ilk çıkar ve tek alıcı semantiği sağlar. Gerçek alma söz dizimi aynı olsa da, başlatma biraz farklılık gösterir.
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))
NOT: Bir oturumdan alınan iletilerin kilitlerinin oturum dışı bir alıcı gibi yenilenmesi gerekmez; bunun yerine, kilit yönetimi ile yenilenebilen bir oturum kilidiyle oturum düzeyinde gerçekleşir
receiver.session.renew_lock()
Konu başlıkları ve aboneliklerle çalışma
NOT:Konular ve abonelikler için başvuru belgelerine bakın.
Konular ve abonelikler, ileti göndermek ve almak için kuyruklara alternatif sağlar. Ayrıntılı ayrıntılar ve bunların kuyruklardan farkı hakkında daha fazla bilgi için buradaki belgelere bakın.
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))
Alındıktan sonra iletiyi kapatma
Kuyruktan alırken, aldığınız iletilerde gerçekleştirebileceğiniz birden çok eylem vardır.
NOT: Yalnızca modda alınan
ServiceBusReceiveMode.PEEK_LOCK
nesneleri yerleştirebilirsinizServiceBusReceivedMessage
(bu varsayılandır).ServiceBusReceiveMode.RECEIVE_AND_DELETE
modu, alındı durumunda iletiyi kuyruktan kaldırır.ServiceBusReceivedMessage
ileti kilidi yukarıda belirtilen alma yöntemlerinde olduğu gibi alınmadığından, iletidenpeek_messages()
döndürülen iletiler kapatılamaz.
İletide yukarıda belirtildiği gibi bir kilit varsa, ileti kilidinin süresi dolduysa kapatma başarısız olur.
İşleme kilit süresinden daha uzun sürecekse süresi dolmadan önce üzerinden receiver.renew_message_lock
bakımı yapılmalıdır.
Kilit süresi Azure'da kuyrukta veya konunun kendisinde ayarlanır.
Bir yardımcının bunu arka planda otomatik olarak gerçekleştirmesi için bkz. AutoLockRenewer'ı kilitler .
Tamamla
İletinin başarıyla tamamlanacağını bildirir ve iletiyi kuyruktan kaldırır.
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)
Bırak
İletinin işlenmesini şimdilik bırakın, iletiyi başka bir (veya aynı) alıcı tarafından alınmak üzere hemen kuyruğa geri döndürür.
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
İletiyi birincil kuyruktan özel bir "teslim edilemeyen ileti alt kuyruğuna" aktarın; burada parametresiyle sub_queue=ServiceBusSubQueue.DEAD_LETTER
işlevi kullanılarak ServiceBusClient.get_<queue|subscription>_receiver
erişilebilir ve diğer alıcılar gibi bu kuyruktan tüketilebilir. ( buradaki örne bakın)
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)
Erteleme
Erteleme, önceki düzenleme yöntemlerinden kısmen farklıdır. bir çağrıdaki ServiceBusReceiver.receive_deferred_messages
sıra numarasıyla alınması gereken şekilde bir kenara bırakarak iletinin doğrudan kuyruktan alınmasını önler ( buradaki örne bakın)
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)
İleti veya Oturum kilitlerini otomatik olarak yenileme
NOT:Otomatik kilitleme yenilemesi için başvuru belgelerine bakın.
AutoLockRenewer
, çağrının receiver.renew_message_lock
/receiver.session.renew_lock
pratik veya istenmeyen olması durumunda iletinizin veya oturumunuzun uzun süreler boyunca bile kilitli kalmasını sağlamak için basit bir yöntemdir.
Dahili olarak, nesnenin süresi dolmak üzereyse kilit yenilemesi yapmak için eşzamanlı bir izleme oluşturmak çok kısa bir işlem değildir.
Aşağıdaki gibi kullanılmalıdır:
- İleti kilidi otomatik yenileme
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()
- Oturum kilidi otomatik yenileme
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()
Herhangi bir nedenle otomatik yenileme kesintiye uğradıysa veya başarısız olduysa, bu durum yenilenen nesnedeki özelliği aracılığıyla auto_renew_error
veya yenileyici başlatmada parametresine on_lock_renew_failure
geri çağrı geçirilerek gözlemlenebilir.
Ayrıca, belirtilen nesne üzerinde eylem gerçekleştirmeye çalışırken de (örneğin, bir iletiyi tamamlarken) bildirimde bulunur.
Sorun giderme
Günlüğe Kaydetme
- Günlükçü'leri kitaplıktan izlemeleri toplamak için etkinleştirin
azure.servicebus
. - Günlükçü'leri temel alınan uAMQP kitaplığından izlemeleri toplamak için etkinleştirin
uamqp
. - İstemciyi oluştururken ayarlayarak
logging_enable=True
AMQP kare düzeyi izlemesini etkinleştirin. - Günlük kaydının çok ayrıntılı olduğunu düşündüğünüz
uamqp
durumlar olabilir. Gereksiz günlüğe kaydetmeyi engellemek için kodunuzun en üstüne aşağıdaki kod parçacığını ekleyin:
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)
Zaman aşımları
Bir kullanıcının kitaplık içinde dikkat etmesi gereken çeşitli zaman aşımları vardır.
- 10 dakikalık hizmet tarafı bağlantı kapatma: Hizmeti kaynak sızıntısına karşı korumak için bir bağlantı açıldıktan sonra 10 dakika boşta kaldıktan sonra kapatılır. Bu büyük ölçüde bir kullanıcı için saydam olmalıdır, ancak böyle bir süre sonra yeniden bağlantı oluştuğunu fark ederseniz, bu nedenledir. Bağlantıda yönetim işlemleri de dahil olmak üzere tüm işlemlerin gerçekleştirilmesi bu zaman aşımını uzatır.
- max_wait_time: Bir alıcı oluşturulurken veya çağrılırken
receive_messages()
, ileti alma işleminin trafik olmadığında durdurulacağı saat sağlanır. Bu, hem kesinlik temellireceive_messages()
işlev hem de ileti yoksa çıkış yapmadan önce oluşturucu stili alma işleminin çalıştırılacağı uzunluk için geçerlidir. Hiçbiri (varsayılan) değerinin geçirilmesi, başka bir işlem yapılmazsa 10 dakikalık eşiğe kadar sonsuza kadar bekler.
NOT: Bir iletinin veya oturumun işlenmesi zaman aşımlarına neden olacak kadar uzunsa, el ile çağırmaya
receiver.renew_message_lock
/receiver.session.renew_lock
alternatif olarak, yukarıda İletiyiAutoLockRenewer
ile ilgili ayrıntılı işlevlerden yararlanabilirsiniz.
Yaygın Özel Durumlar
Service Bus API'leri azure.servicebus.exceptions içinde aşağıdaki özel durumları oluşturur:
- ServiceBusConnectionError: Hizmet bağlantısında bir hata oluştu. Bunun nedeni geçici bir ağ sorunu veya hizmet sorunu olabilir. Yeniden denemenizi öneririz.
- ServiceBusAuthorizationError: Hizmet bağlantısı yetkilendirilirken bir hata oluştu. Bunun nedeni kimlik bilgilerinin işlemi gerçekleştirmek için doğru izne sahip olmaması olabilir. Kimlik bilgilerinin izinlerinin denetlenmiş olması önerilir.
- ServiceBusAuthenticationError: Hizmet bağlantısının kimliği doğrulanırken bir hata oluştu. Bunun nedeni kimlik bilgilerinin yanlış olması olabilir. Kimlik bilgilerini denetlemenizi öneririz.
- OperationTimeoutError: Bu, hizmetin beklenen süre içinde bir işleme yanıt vermediğini gösterir. Bunun nedeni geçici bir ağ sorunu veya hizmet sorunu olabilir. Hizmet isteği başarıyla tamamlamış veya tamamlamamış olabilir; durumu bilinmiyor. Geçerli durumu doğrulamayı denemeniz ve gerekirse yeniden denemeniz önerilir.
- MessageSizeExceededError: Bu, ileti içeriğinin service bus çerçeve boyutundan daha büyük olduğunu gösterir.
Bir toplu işte çok fazla service bus iletisi gönderildiğinde veya gövdesine
Message
geçirilen içerik çok büyük olduğunda bu durum oluşabilir. Toplu olarak gönderilen iletilerin sayısını veya tekServiceBusMessage
bir öğesine geçirilen içeriğin boyutunu azaltmanız önerilir. - MessageAlreadySettled: Bu, iletiyi kapatmanın başarısız olduğunu gösterir. Zaten çözülen bir iletiyi kapatmaya çalışırken bu durum oluşabilir.
- MessageLockLostError: İletideki kilidin süresi doldu ve kuyruğa geri bırakıldı.
Bunu düzeltmek için yeniden alınması gerekir.
bir iletinin kilit süresine dikkat etmeniz ve uzun işlem süresi olması durumunda süre dolmadan önce kilidi yenilemeye devam etmeniz gerekir.
AutoLockRenewer
iletinin kilidinin otomatik olarak yenilenmesine yardımcı olabilir. - SessionLockLostError: Oturumdaki kilidin süresi doldu.
Alınan tüm düzeltilmemiş iletiler artık kapatılamaz.
Gerekirse iletileri yeniden alırsanız oturuma yeniden bağlanmanız önerilir.
Bir oturumun kilit süresine dikkat etmeniz ve uzun işlem süresi olması durumunda süre dolmadan önce kilidi yenilemeye devam etmeniz gerekir.
AutoLockRenewer
oturum kilidinin otomatik olarak yenilenmesine yardımcı olabilir. - MessageNotFoundError: Belirli bir sıra numarasına sahip bir ileti almayı deneme. Bu ileti bulunamadı. İletinin henüz alınmadığından emin olun. İletinin geçersiz olup olmadığını görmek için deadletter kuyruğuna bakın.
- MessagingEntityNotFoundError: İşlemle ilişkili varlık yok veya silindi. Varlığın mevcut olduğundan emin olun.
- MessagingEntityDisabledError: Devre dışı bırakılmış bir varlıkta çalışma zamanı işlemi isteği. Lütfen varlığı etkinleştirin.
- ServiceBusQuotaExceededError: Mesajlaşma varlığı izin verilen maksimum boyuta ulaştı veya bir ad alanına yönelik bağlantı sayısı üst sınırı aşıldı. Varlıktan veya alt sıralarından iletiler alarak varlıkta alan oluşturun.
- ServiceBusServerBusyError: Hizmet şu anda isteği işleyemiyor. İstemci bir süre bekleyebilir ve işlemi yeniden deneyebilir.
- ServiceBusCommunicationError: İstemci Service Bus ile bağlantı kuramıyor. Sağlanan ana bilgisayar adının doğru olduğundan ve konağa ulaşılabilir olduğundan emin olun. Kodunuz güvenlik duvarı/ara sunucu içeren bir ortamda çalışıyorsa Service Bus etki alanına/IP adresine ve bağlantı noktalarına gelen trafiğin engellenmediğinden emin olun.
- SessionCannotBeLockedError: Belirli bir oturum kimliğine sahip bir oturuma bağlanmayı deneyin, ancak oturum şu anda başka bir istemci tarafından kilitlenmiş durumda. Oturumun kilidinin diğer istemciler tarafından açıldığından emin olun.
- AutoLockRenewFailed: Arka planda bir ileti veya oturum üzerindeki kilidi yenileme girişimi başarısız oldu.
Tarafından kullanılan
AutoLockRenewer
alıcı kapatıldığında veya yenilenebilir kullanım kilidinin süresi dolduğunda bu durum oluşabilir. İletiyi alarak yenilenebilir iletiyi veya oturumu yeniden kaydetmeniz veya oturumlu varlığa yeniden bağlanmanızı öneririz. - AutoLockRenewTimeout: İletiyi veya oturum kilidini yenilemek için ayrılan süre doldu. Otomatik kilitlemenin yenilenmesini isteyen nesneyi yeniden kaydedebilir veya zaman aşımını önceden uzatabilirsiniz.
- ServiceBusError: Service Bus ile ilgili diğer tüm hatalar. Yukarıda açıklanan tüm hataların kök hata sınıfıdır.
Genel Özel Durum türlerimizin ayrıntılı açıklamaları için lütfen özel durum başvuru belgelerini görüntüleyin.
Sonraki adımlar
Daha fazla örnek kod
Lütfen samples dizininde gönderme, alma, oturum yönetimi ve ileti işleme gibi yaygın Service Bus senaryolarını gösteren diğer örnekleri bulun.
Diğer belgeler
Service Bus hizmeti hakkında daha kapsamlı belgeler için docs.microsoft.com ile ilgili Service Bus belgelerine bakın.
Yönetim özellikleri ve belgeleri
ServiceBus'a karşı yönetim işlemleri gerçekleştirmek isteyen kullanıcılar için (Kuyruk/konu/vb. oluşturma, filtre kurallarını değiştirme, varlıkları listeleme) API belgeleri için azure-mgmt-servicebus belgelerine bakın. Terse kullanım örnekleri burada da bulunabilir.
Saf Python AMQP Aktarım ve Geriye Dönük Uyumluluk Desteği
Azure Service Bus istemci kitaplığı artık saf python AMQP uygulamasını temel alır. uAMQP
gerekli bağımlılık olarak kaldırıldı.
Temel alınan aktarım olarak kullanmak uAMQP
için:
- pip ile yükleyin
uamqp
.
$ pip install uamqp
- İstemci oluşturma sırasında geçin
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
)
Not: message
üzerindeServiceBusMessageBatch
//ServiceBusMessage
ServiceBusReceivedMessage
daha önce kullanıma sunulan uamqp.Message
özniteliği kullanım dışı bırakılmıştır.
Özniteliği tarafından message
döndürülen "Eski" nesneler geçişi kolaylaştırmaya yardımcı olmak için tanıtıldı.
Kaynaktan uAMQP tekerleği oluşturma
azure-servicebus
AMQP protokolü uygulaması için uAMQP'ye bağlıdır.
uAMQP tekerlekleri çoğu büyük işletim sistemi için sağlanır ve yüklenirken azure-servicebus
otomatik olarak yüklenir.
uAMQP için temel AMQP protokolü uygulaması azure-servicebus
olarak kullanılması amaçlanıyorsa, çoğu büyük işletim sistemi için uAMQP tekerlekleri bulunabilir.
uAMQP tekerleklerinin sağlanmadığı bir platformda çalışıyorsanız, lütfen kullanmayı uAMQP
düşünüyorsanız ve uAMQP tekerleklerinin sağlanmadığı bir platformda çalıştırıyorsanız, kaynaktan yüklemek için lütfen uAMQP Yükleme yönergelerini izleyin.
Katkıda bulunma
Bu proje, katkı ve önerilere açıktır. Çoğu durumda, sağladığınız katkıyı kullanmamız için bize hak tanıma hakkına sahip olduğunuzu ve bu hakkı bize tanıdığınızı bildiren bir Katkıda Bulunan Lisans Sözleşmesi’ni (CLA) kabul etmeniz gerekir. Ayrıntılar için bkz. https://cla.microsoft.com.
Bir çekme isteği gönderdiğinizde, CLA robotu bir CLA sağlamanız gerekip gerekmediğini otomatik olarak belirler ve çekme isteğini uygun şekilde donatır (örn. etiket, açıklama). Robot tarafından sağlanan yönergeleri izlemeniz yeterlidir. Bu işlemi, CLA’mızı kullanarak tüm depolarda yalnızca bir kere yapmanız gerekir.
Bu proje Microsoft Open Source Code of Conduct (Microsoft Açık Kaynak Kullanım Kuralları) belgesinde listelenen kurallara uygundur. Daha fazla bilgi için Kullanım Kuralları SSS bölümüne bakın veya ek sorular veya yorumlarla iletişime geçin opencode@microsoft.com .
Azure SDK for Python