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ın nasıl Depolama gösteracağız. Örnekler C++ ile yazılır ve C++ için Azure Depolama istemci kitaplığını kullanır. Ele alınan senaryolar arasında ekleme, göz atma, kuyruk iletilerini alma ve silmenin yanı sıra kuyruk oluşturma ve silme yer almaktadır.

Not

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

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şlenecek iş biriktirme listesi 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ı: Tüm Azure depolama erişimi bir depolama hesabı üzerinden yapılır. 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, en fazla yaşam süresi 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 bir depolama hesabı oluşturmayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azurite depolama öykünücüsünü da kullanabilirsiniz. Daha fazla bilgi için bkz. Yerel Azure depolama geliştirmesi Için Azurite öykünücüsünü kullanma.

C++ uygulaması oluşturma

Bu kılavuzda, bir C++ uygulaması içinde çalıştırlan depolama özelliklerini kullanabilirsiniz.

Bunu yapmak için C++ için Azure Depolama istemci kitaplığını yüklemeniz ve Azure aboneliğinize 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

Kaynak kodu derleme ve README dosyasındaki bir NuGet dışarı aktarma hakkında bir kılavuz bulabilirsiniz.

Kuyruk ayarlarına erişmek için Depolama

Aşağıdaki include deyimlerini C++ dosyasının en üstüne ekleyin ve burada kuyruklara erişmek için Azure Depolama API'lerini kullanın:

#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ıştırarak depolama bağlantı dizesini depolama hesabınız adını ve ve değerleri için depolama hesabında listelenen depolama hesabının depolama erişim anahtarını kullanarak Azure portal AccountName AccountKey sağlayabilirsiniz. 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"));

Yerel bilgisayarınızda Windows test etmek için Azurite depolama öykünücüsünü kullanabilirsiniz. Azurite, yerel geliştirme makineniz üzerinde Azure Blob Depolama ve Kuyruk Depolama benzetimini Depolama 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'i başlatmak için bkz. Yerel Azure sanal ağ geliştirmesi için Azurite öykünücüsünü Depolama kullanın.

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ı cloud_storage_account bilginizi temsil etmek için sınıfını kullanabilirsiniz. Depolama bağlantı dizesinde depolama hesabı bilgilerini almak için yöntemini parse kullanabilirsiniz.

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

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

Nesnesi, cloud_queue_client kuyruklar için başvuru nesnelerini alasiniz. Aşağıdaki kod bir nesnesi cloud_queue_client 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();

Kullanmak cloud_queue_client istediğiniz kuyruğa başvuru almak için nesnesini kullanın. Kuyruk yoksa kuyruğu 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 kullanılır: Kuyruğa ileti ekleme

Mevcut kuyruğa ileti eklemek için önce yeni bir cloud_queue_message oluşturun. Ardından yöntemini add_message arayın. Bir cloud_queue_message dizeden (UTF-8 biçiminde) veya bir byte dizisinde oluşturulabilir. Burada bir kuyruk oluşturan (yoksa) ve iletiyi ek olarak kod Hello, World vemektedir:

// 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 iletiyi: Sonraki iletiye göz atın

yöntemini çağırarak kuyruktan kaldırmadan kuyruğun önündeki iletiye göz peek_message 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 kullanı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. Donanım veya yazılım hatası nedeniyle bir işleme adımı başarısız olursa baştan başlamak zorunda kalmadan, kuyruk iletilerde çok adımlı iş akışlarını izlemek için bu tekniği 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 iletiyi açıklama: Sonraki iletiyi açıklama

Kodunuz iki adımda kuyruktan bir iletiyi kuyruğa alır. get_messageçağrısında, kuyrukta bir sonraki iletiyi alırsınız. 'den döndürülen get_message ileti, bu kuyruktan iletileri okuyan diğer kodlar için görünmez hale gelir. İletiyi kuyruktan kaldırmayı tamamlamak için ayrıca çağrısı da delete_message gerekir. 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. Kodunuz, delete_message ileti işlendikten hemen sonra çağrı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"));

// 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 yapabilirsiniz: İletileri yok etmek 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 get_messages çağrıda 20 ileti almak için yöntemini kullanır. Ardından döngü kullanarak her iletiyi for işler. Ayrıca her ileti için görünmezlik zaman aşımı beş dakika olarak ayarlanır. Tüm iletiler için beş dakikanın aynı anda başladığına, dolayısıyla çağrısından bu yana beş dakika geçtikten sonra, silinmemiş tüm iletiler get_messages yeniden görünür hale gelir.

// 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 kullanılır: Kuyruk uzunluğunu al

Bir kuyruktaki ileti sayısı ile ilgili bir tahmin alabilirsiniz. yöntemi, download_attributes ileti sayısı dahil olmak üzere kuyruk özelliklerini döndürür. yöntemi approximate_message_count kuyrukta 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 kullanılır: Kuyruk silme

Bir kuyruğu ve içinde yer alan tüm iletileri silmek için kuyruk delete_queue_if_exists nesnesinde yöntemini arayı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"));

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

Sonraki adımlar

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