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:
- Sağlanan bildirim hub'ı.
- Azure Depolama blob kapsayıcısı.
- Azure Depolama NuGet paketine ve Notification Hubs NuGet paketine başvurular.
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:
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin