C++’tan Kuyruk Depolama kullanma

İpucu

Microsoft Azure Depolama Gezgini’ni deneyin

Microsoft Azure Depolama Gezgini, Microsoft’un Windows, macOS ve Linux üzerinde Azure Depolama verileriyle görsel olarak çalışmanızı sağlayan ücretsiz ve tek başına uygulamasıdır.

Genel Bakış

Bu kılavuzda, Azure Kuyruk Depolama hizmetini kullanarak yaygın senaryoları nasıl gerçekleştirebileceğiniz gösterilir. Örnekler C++ dilinde yazılır ve C++ için Azure Depolama istemci kitaplığını kullanır. Kapsanan senaryolar kuyruk iletilerini ekleme, gözatma, alma ve silmenin yanı sıra kuyruk oluşturma ve silmeyi içerir.

Not

Bu kılavuz C++ v1.0.0 ve üzeri için Azure Depolama istemci kitaplığını hedefler. Önerilen sürüm, NuGet veya GitHub aracılığıyla kullanılabilen Azure Depolama istemci kitaplığı v2.2.0'dır.

Kuyruk depolama nedir?

Azure Kuyruk depolama, HTTP veya HTTPS kullanan kimlik doğrulaması yapılmış çağrılar aracılığıyla dünyanın her yerinden erişilebilen çok sayıda iletinin depolanması için bir hizmettir. Tek bir kuyruk iletisinin boyutu 64 KB’ye kadar olabilir ve bir kuyrukta, depolama hesabının toplam kapasite sınırına kadar milyonlarca ileti bulunabilir. Kuyruk depolama genellikle zaman uyumsuz olarak işlenmek üzere bir iş kapsamı oluşturmak için kullanılır.

Kuyruk hizmeti kavramları

Azure Kuyruk hizmeti aşağıdaki bileşenleri içerir:

Azure Kuyruk hizmeti bileşenleri

  • Depolama Hesabı: Azure Depolama'ya tüm erişim bir depolama hesabı üzerinden gerçekleştirilir. Depolama hesapları hakkında daha fazla bilgi için bkz. Depolama hesabına genel bakış.

  • Kuyruk: Kuyrukta bir dizi ileti vardır. Tüm iletiler bir kuyrukta olmalıdır. Kuyruk adının tamamen küçük harfli olması gerektiğini unutmayın. Kuyrukların adlandırılması hakkında daha fazla bilgi için bkz. Kuyrukları ve Meta Verileri Adlandırma.

  • İleti: İleti, biçimi ne olursa olsun en çok 64 KB büyüklüktedir. Bir iletinin kuyrukta kalabileceği en uzun süre 7 gündür. Sürüm 2017-07-29 veya üzeri için yaşam süresi üst sınırı herhangi bir pozitif sayı veya iletinin süresinin dolmadığını belirten -1 olabilir. Bu parametre atlanırsa, varsayılan yaşam süresi yedi gündür.

  • URL biçimi: Kuyruklar şu URL biçimi kullanılarak adreslenebilir: http://<storage account>.queue.core.windows.net/<queue>

    Aşağıdaki URL diyagramdaki bir kuyruğun adresini belirtir:

    http://myaccount.queue.core.windows.net/incoming-orders

Azure depolama hesabı oluşturma

İlk Azure depolama hesabınızı oluşturmanın en kolay yolu Azure Portalı’nı kullanmaktır. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.

Azure PowerShell, Azure CLI veya .NET için Azure Depolama Kaynak Sağlayıcısı’nı da kullanarak Azure depolama hesabı oluşturabilirsiniz.

Şu anda Azure'da depolama hesabı oluşturmamayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azurite depolama öykünücüsü de kullanabilirsiniz. Daha fazla bilgi için bkz. Yerel Azure Depolama geliştirmesi için Azurite öykünücüsü kullanma.

C++ uygulaması oluşturma

Bu kılavuzda, bir C++ uygulaması içinde çalıştırabileceğiniz depolama özelliklerini kullanacaksınız.

Bunu yapmak için C++ için Azure Depolama istemci kitaplığını yüklemeniz ve Azure aboneliğinizde bir Azure Depolama hesabı oluşturmanız gerekir.

C++ için Azure Depolama istemci kitaplığını yüklemek için aşağıdaki yöntemleri kullanabilirsiniz:

.\vcpkg.exe install azure-storage-cpp

ReadME dosyasında kaynak kodu oluşturma ve NuGet'e aktarma hakkında bir kılavuz bulabilirsiniz.

Uygulamanızı Kuyruk Depolama'ya erişecek şekilde yapılandırma

Kuyruklara erişmek için Azure Depolama API'lerini kullanmak istediğiniz C++ dosyasının en üstüne aşağıdaki include deyimlerini ekleyin:

#include <was/storage_account.h>
#include <was/queue.h>

Azure Depolama bağlantı dizesini ayarlama

Azure Depolama istemcisi, veri yönetimi hizmetlerine erişmek için uç noktaları ve kimlik bilgilerini depolamak için bir depolama bağlantı dizesi kullanır. bir istemci uygulamasında çalışırken, depolama hesabınızın adını ve ve AccountKey değerleri için Azure portal listelenen depolama hesabının depolama erişim anahtarını kullanarak depolama bağlantı dizesini AccountName aşağıdaki biçimde sağlamanız gerekir. Depolama hesapları ve erişim anahtarları hakkında bilgi için bkz. Azure Depolama hesapları hakkında. Bu örnekte bağlantı dizesini tutmak için nasıl statik bir alan bildirebileceğiniz gösterilmektedir:

// Define the connection-string with your values.
const utility::string_t storage_connection_string(U("DefaultEndpointsProtocol=https;AccountName=your_storage_account;AccountKey=your_storage_account_key"));

Uygulamanızı yerel Windows bilgisayarınızda test etmek için Azurite depolama öykünücüsünüzü kullanabilirsiniz. Azurite, yerel geliştirme makinenizde Azure Blob Depolama ve Kuyruk Depolama simülasyonu sağlayan bir yardımcı programdır. Aşağıdaki örnekte bağlantı dizesini yerel depolama öykünücünüzde tutmak için nasıl statik bir alan bildirebileceğiniz gösterilmektedir:

// Define the connection-string with Azurite.
const utility::string_t storage_connection_string(U("UseDevelopmentStorage=true;"));  

Azurite'yi başlatmak için bkz. Yerel Azure Depolama geliştirmesi için Azurite öykünücüsü kullanma.

Aşağıdaki örnekler, depolama bağlantı dizesini almak için bu iki yöntemden birini kullandığınızı varsayar.

Bağlantı dizenizi alma

depolama hesabı bilgilerinizi göstermek için sınıfını cloud_storage_account kullanabilirsiniz. Depolama hesabı bilgilerinizi depolama bağlantı dizesinden almak için yöntemini kullanabilirsiniz parse .

// Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

Nasıl yapılır: Kuyruk oluşturma

cloud_queue_client Nesne, kuyruklar için başvuru nesneleri almanıza olanak tanır. Aşağıdaki kod bir cloud_queue_client nesnesi oluşturur.

// Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create a queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

cloud_queue_client Kullanmak istediğiniz kuyruğa başvuru almak için nesnesini kullanın. Kuyruk yoksa oluşturabilirsiniz.

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Create the queue if it doesn't already exist.
queue.create_if_not_exists();  

Nasıl yapılır: Kuyruğa ileti ekleme

Var olan kuyruğa ileti eklemek için önce yeni cloud_queue_messagebir oluşturun. Ardından yöntemini çağırın add_message . Bir cloud_queue_message dizeden (UTF-8 biçiminde) veya bayt dizisinden oluşturulabilir. Bir kuyruk oluşturan (yoksa) ve iletisini Hello, Worldekleyen kod aşağıdadır:

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Create the queue if it doesn't already exist.
queue.create_if_not_exists();

// Create a message and add it to the queue.
azure::storage::cloud_queue_message message1(U("Hello, World"));
queue.add_message(message1);  

Nasıl yapılır: Sonraki iletiye göz atma

yöntemini çağırarak kuyruktan kaldırmadan kuyruğun önündeki iletiye peek_message göz atabilirsiniz.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Peek at the next message.
azure::storage::cloud_queue_message peeked_message = queue.peek_message();

// Output the message content.
std::wcout << U("Peeked message content: ") << peeked_message.content_as_string() << std::endl;

Nasıl yapılır: Kuyruğa alınan iletinin içeriğini değiştirme

Kuyrukta yer alan bir iletinin içeriğini değiştirebilirsiniz. Eğer ileti bir iş görevini temsil ediyorsa, bu özelliği kullanarak iş görevinin durumunu güncelleştirebilirsiniz. Aşağıdaki kod kuyruk iletisini yeni içeriklerle güncelleştirir ve görünürlük zaman aşımını 60 saniye daha uzatır. Bu, ileti ile ilişkili işin durumunu kaydeder ve istemciye ileti üzerinde çalışmaya devam etmesi için bir dakika daha zaman verir. Bu tekniği, donanım veya yazılım hatası nedeniyle bir işlem adımı başarısız olursa baştan başlamak zorunda kalmadan kuyruk iletilerinde çok adımlı iş akışlarını izlemek için kullanabilirsiniz. Genellikle bir yeniden deneme sayacı tutmanı gerekir ve bir ileti n seferden daha fazla yeniden denenirse, silebilirsiniz. Bu, her işlendiğinde bir uygulama hatası tetikleyen bir iletiye karşı koruma sağlar.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Get the message from the queue and update the message contents.
// The visibility timeout "0" means make it visible immediately.
// The visibility timeout "60" means the client can get another minute to continue
// working on the message.
azure::storage::cloud_queue_message changed_message = queue.get_message();

changed_message.set_content(U("Changed message"));
queue.update_message(changed_message, std::chrono::seconds(60), true);

// Output the message content.
std::wcout << U("Changed message content: ") << changed_message.content_as_string() << std::endl;  

Nasıl yapılır: Sonraki iletiyi sıralama

Kodunuz iki adımda kuyruktaki bir iletiyi kuyruğa alır. çağrısı get_messageyaptığınızda kuyruktaki bir sonraki iletiyi alırsınız. tarafından get_message döndürülen bir ileti, bu kuyruktan gelen iletileri okuyan diğer kodlar için görünmez hale gelir. İletiyi kuyruktan kaldırmayı tamamlamak için öğesini de çağırmanız delete_messagegerekir. Bir iletinin iki adımlı kaldırılma süreci, donanım veya yazılım arızasından dolayı kodunuzun bir iletiyi işleyememesi durumunda kodunuzun başka bir örneğinin aynı iletiyi alıp yeniden denemesini sağlar. İleti işlendikten hemen sonra kodunuz çağrılar delete_message .

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Get the next message.
azure::storage::cloud_queue_message dequeued_message = queue.get_message();
std::wcout << U("Dequeued message: ") << dequeued_message.content_as_string() << std::endl;

// Delete the message.
queue.delete_message(dequeued_message);

Nasıl yapılır: İletileri sıralamak için ek seçenekleri kullanma

İletilerin bir kuyruktan alınma şeklini iki yöntemle özelleştirebilirsiniz. İlk olarak toplu iletiler alabilirsiniz (en fazla 32). İkinci olarak daha uzun veya daha kısa bir görünmezlik süresi ayarlayarak kodunuzun her iletiyi tamamen işlemesi için daha az veya daha fazla zaman tanıyabilirsiniz. Aşağıdaki kod örneği, bir çağrıda get_messages 20 ileti almak için yöntemini kullanır. Ardından her iletiyi bir for döngü kullanarak işler. Ayrıca her ileti için görünmezlik zaman aşımı beş dakika olarak ayarlanır. Beş dakikanın tüm iletiler için aynı anda başladığını, bu nedenle çağrısının get_messagesüzerinden beş dakika geçtikten sonra silinmemiş tüm iletilerin yeniden görünür olacağını unutmayın.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Dequeue some queue messages (maximum 32 at a time) and set their visibility timeout to
// 5 minutes (300 seconds).
azure::storage::queue_request_options options;
azure::storage::operation_context context;

// Retrieve 20 messages from the queue with a visibility timeout of 300 seconds.
std::vector<azure::storage::cloud_queue_message> messages = queue.get_messages(20, std::chrono::seconds(300), options, context);

for (auto it = messages.cbegin(); it != messages.cend(); ++it)
{
    // Display the contents of the message.
    std::wcout << U("Get: ") << it->content_as_string() << std::endl;
}

Nasıl yapılır: Kuyruk uzunluğunu alma

Bir kuyruktaki ileti sayısı ile ilgili bir tahmin alabilirsiniz. yöntemi, download_attributes ileti sayısı da dahil olmak üzere kuyruk özelliklerini döndürür. yöntemi, approximate_message_count kuyruktaki yaklaşık ileti sayısını alır.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Fetch the queue attributes.
queue.download_attributes();

// Retrieve the cached approximate message count.
int cachedMessageCount = queue.approximate_message_count();

// Display number of messages.
std::wcout << U("Number of messages in queue: ") << cachedMessageCount << std::endl;  

Nasıl yapılır: Kuyruk silme

Bir kuyruğu ve içindeki tüm iletileri silmek için kuyruk nesnesinde yöntemini çağırın delete_queue_if_exists .

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// If the queue exists and delete it.
queue.delete_queue_if_exists();  

Sonraki adımlar

Artık Kuyruk Depolama'nın temellerini öğrendiğinize göre, Azure Depolama hakkında daha fazla bilgi edinmek için bu bağlantıları izleyin.