Aracılığıyla paylaş


Azure Notification Hubs kayıtlarını toplu olarak dışarı ve içeri aktarma

Bildirim hub'ında çok sayıda kayıt oluşturmanın veya değiştirmenin gerekli olduğu senaryolar vardır. Bu senaryolardan bazıları toplu işlemlerden sonraki etiket güncelleştirmeleri veya mevcut bir anında iletme uygulamasını Azure Notification Hubs kullanacak şekilde geçirmedir.

Bu makalede, bir bildirim hub'ında çok sayıda işlemin nasıl gerçekleştirebileceğiniz veya tüm kayıtları toplu olarak nasıl dışarı aktaracağınızı açıklanmaktadır.

NOT: Toplu içeri/dışarı aktarma yalnızca 'standart' fiyatlandırma katmanı için kullanılabilir

Üst düzey akış

Batch desteği, milyonlarca kayıt içeren uzun süre çalışan işleri destekleyecek şekilde tasarlanmıştır. Bu ölçeği elde etmek için toplu destek, iş ayrıntılarını ve çıktıyı depolamak için Azure Depolama'yı kullanır. Toplu güncelleştirme işlemleri için, kullanıcının içeriği kayıt güncelleştirme işlemlerinin listesi olan bir blob kapsayıcısında bir dosya oluşturması gerekir. İşi başlatırken, kullanıcı giriş blobunun URL'sini ve bir çıkış dizinine (blob kapsayıcısında da) yönelik bir URL sağlar. İş başladıktan sonra, kullanıcı işin başında sağlanan bir URL konumunu sorgulayarak durumu denetleyebiliyor. Belirli bir iş yalnızca belirli bir türde işlemler gerçekleştirebilir (oluşturur, güncelleştirir veya siler). Dışarı aktarma işlemleri benzer şekilde gerçekleştirilir.

İçeri Aktar

Kurulum

Bu bölümde aşağıdaki varlıklara sahip olduğunuz varsayılır:

Giriş dosyası oluşturma ve blobda depolama

Giriş dosyası, XML'de seri hale getirilmiş kayıtların listesini içerir ve her satıra bir tane ekler. Aşağıdaki kod örneği, Azure SDK'sını kullanarak kayıtların nasıl seri hale getirilip blob kapsayıcısına nasıl yüklendiğini gösterir:

private static async Task SerializeToBlobAsync(BlobContainerClient container, RegistrationDescription[] descriptions)
{
     StringBuilder builder = new StringBuilder();
     foreach (var registrationDescription in descriptions)
     {
          builder.AppendLine(registrationDescription.Serialize());
     }

     var inputBlob = container.GetBlobClient(INPUT_FILE_NAME);
     using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(builder.ToString())))
     {
         await inputBlob.UploadAsync(stream);
     }
}

Önemli

Yukarıdaki kod, bellekteki kayıtları seri hale getirerek akışın tamamını bir bloba yükler. Yalnızca birkaç megabayttan fazla bir dosyayı karşıya yüklediyseniz, bu adımların nasıl gerçekleştirildiğini gösteren Azure blob kılavuzuna bakın; örneğin blok blobları.

URL belirteçleri oluşturma

Giriş dosyanız karşıya yüklendikten sonra, hem giriş dosyası hem de çıkış dizini için bildirim hub'ınıza sağlamak üzere URL'leri oluşturun. Giriş ve çıkış için iki farklı blob kapsayıcısı kullanabilirsiniz.

static Uri GetOutputDirectoryUrl(BlobContainerClient container)
{
      Console.WriteLine(container.CanGenerateSasUri);
      BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.All, DateTime.UtcNow.AddDays(1));
      return container.GenerateSasUri(builder);
}

static Uri GetInputFileUrl(BlobContainerClient container, string filePath)
{
      Console.WriteLine(container.CanGenerateSasUri);
      BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.Read, DateTime.UtcNow.AddDays(1));
      return container.GenerateSasUri(builder);
}

İşi gönderme

İki giriş ve çıkış URL'siyle artık toplu işi başlatabilirsiniz.

NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(CONNECTION_STRING, HUB_NAME);
var job = await client.SubmitNotificationHubJobAsync(
     new NotificationHubJob {
             JobType = NotificationHubJobType.ImportCreateRegistrations,
             OutputContainerUri = outputContainerSasUri,
             ImportFileUri = inputFileSasUri
         }
     );

long i = 10;
while (i > 0 && job.Status != NotificationHubJobStatus.Completed)
{
    job = await client.GetNotificationHubJobAsync(job.JobId);
    await Task.Delay(1000);
    i--;
}

Bu örnek, giriş ve çıkış URL'lerine ek olarak, aşağıdaki türlerden biri olabilecek bir nesne içeren bir JobType nesne oluştururNotificationHubJob:

  • ImportCreateRegistrations
  • ImportUpdateRegistrations
  • ImportDeleteRegistrations

Arama tamamlandıktan sonra iş bildirim hub'ı tarafından devam eder ve GetNotificationHubJobAsync çağrısıyla durumunu de kontrol edebilirsiniz.

İşin tamamlanmasının ardından çıkış dizininizde aşağıdaki dosyalara bakarak sonuçları inceleyebilirsiniz:

  • /<hub>/<jobid>/Failed.txt
  • /<hub>/<jobid>/Output.txt

Bu dosyalar, toplu işleminizdeki başarılı ve başarısız işlemlerin listesini içerir. Dosya biçimi, her satırın özgün giriş dosyasının satır numarasını ve işlemin çıkışını (genellikle oluşturulan veya güncelleştirilen kayıt açıklaması) içeren biçimidir .cvs.

Tam örnek kod

Aşağıdaki örnek kod, kayıtları bir bildirim hub'ına aktarır.

using Microsoft.Azure.NotificationHubs;
using Azure.Storage.Blobs;
using Azure.Storage.Sas;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        private static string CONNECTION_STRING = "namespace"; 
        private static string HUB_NAME = "demohub";
        private static string INPUT_FILE_NAME = "CreateFile.txt";
        private static string STORAGE_ACCOUNT_CONNECTIONSTRING = "connectionstring";
        private static string CONTAINER_NAME = "containername";

        static async Task Main(string[] args)
        {
            var descriptions = new[]
            {
                new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMkUxREQFBlVTTkMwMQ"),
                new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMjUxREQFBlVTTkMwMQ"),
                new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMhUxREQFBlVTTkMwMQ"),
                new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMdUxREQFBlVTTkMwMQ"),
            };

            // Get a reference to a container named "sample-container" and then create it
            BlobContainerClient container = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, CONTAINER_NAME);

            await container.CreateIfNotExistsAsync();

            await SerializeToBlobAsync(container, descriptions);

            // TODO then create Sas
            var outputContainerSasUri = GetOutputDirectoryUrl(container);
            
            BlobContainerClient inputcontainer = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, STORAGE_ACCOUNT_CONNECTIONSTRING + "/" +         INPUT_FILE_NAME);

            var inputFileSasUri = GetInputFileUrl(inputcontainer, INPUT_FILE_NAME);


            // Import this file
            NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(CONNECTION_STRING, HUB_NAME);
            var job = await client.SubmitNotificationHubJobAsync(
                new NotificationHubJob {
                    JobType = NotificationHubJobType.ImportCreateRegistrations,
                    OutputContainerUri = outputContainerSasUri,
                    ImportFileUri = inputFileSasUri
                }
            );

            long i = 10;
            while (i > 0 && job.Status != NotificationHubJobStatus.Completed)
            {
                job = await client.GetNotificationHubJobAsync(job.JobId);
                await Task.Delay(1000);
                i--;
            }
        }

        private static async Task SerializeToBlobAsync(BlobContainerClient container, RegistrationDescription[] descriptions)
        {
            StringBuilder builder = new StringBuilder();
            foreach (var registrationDescription in descriptions)
            {
                builder.AppendLine(registrationDescription.Serialize());
            }

            var inputBlob = container.GetBlobClient(INPUT_FILE_NAME);
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(builder.ToString())))
            {
                await inputBlob.UploadAsync(stream);
            }
        }

        static Uri GetOutputDirectoryUrl(BlobContainerClient container)
        {
            Console.WriteLine(container.CanGenerateSasUri);
            BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.All, DateTime.UtcNow.AddDays(1));
            return container.GenerateSasUri(builder);
        }

        static Uri GetInputFileUrl(BlobContainerClient container, string filePath)
        {
            Console.WriteLine(container.CanGenerateSasUri);
            BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.Read, DateTime.UtcNow.AddDays(1));
            return container.GenerateSasUri(builder);

        }
    }
}

Dışarı Aktarma

Kaydı dışarı aktarma işlemi, aşağıdaki farklarla içeri aktarma işlemine benzer:

  • Yalnızca çıkış URL'sine ihtiyacınız vardır.
  • ExportRegistrations türünde bir NotificationHubJob oluşturursunuz.

Örnek kod parçacığı

Aşağıda, Java'da kayıtları dışarı aktarmak için örnek bir kod parçacığı verilmiştir:

// Submit an export job
NotificationHubJob job = new NotificationHubJob();
job.setJobType(NotificationHubJobType.ExportRegistrations);
job.setOutputContainerUri("container uri with SAS signature");
job = hub.submitNotificationHubJob(job);

// Wait until the job is done
while(true){
    Thread.sleep(1000);
    job = hub.getNotificationHubJob(job.getJobId());
    if(job.getJobStatus() == NotificationHubJobStatus.Completed)
        break;
}

Sonraki adımlar

Kayıtlar hakkında daha fazla bilgi edinmek için aşağıdaki makalelere bakın: