Azure 表存储续

Posted

技术标签:

【中文标题】Azure 表存储续【英文标题】:Azure table Storage continuation 【发布时间】:2015-03-13 09:08:18 【问题描述】:

因此,Microsoft 决定将诊断数据发送到 Azure 表存储。我正在尝试查询此存储并将其发送到另一个位置以通过 C# SDK 进行分析。我可以很好地查询数十万条记录,但似乎他们发送的最后一个延续令牌将始终收到空响应。即使更多数据被发送到表存储中,我的延续令牌也不起作用,仍然会得到一个空延续令牌和空数据。

有人做过这样的事吗?如果他们发送的继续令牌被破坏,我如何继续“同步”天蓝色表数据?

           public static List<PerfMonEntity> GetEventData(ref TableContinuationToken contToken)
    
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
        CloudTable eventLogsTable = tableClient.GetTableReference("WADPerformanceCountersTable");
        TableQuery<PerfMonEntity> query = new TableQuery<PerfMonEntity>();

        var l = new List<PerfMonEntity>();
        var segment = eventLogsTable.ExecuteQuerySegmented(query, contToken ?? new TableContinuationToken());
        foreach (PerfMonEntity wadCounter in segment)
        
            l.Add(wadCounter);
        
        contToken = segment.ContinuationToken;

        if (contToken == null)
        
            Console.WriteLine("contToken is NULL!");
            return null;
        

        Console.WriteLine("partkey: 0", contToken.NextPartitionKey ?? "");
        Console.WriteLine("rowkey: 0", contToken.NextRowKey ?? "");

        return l;
    

-=-=-=-=-=-

        while (num < loop)
        
            List<PerfMonEntity> eleList = AzurePerfTable.GetEventData(ref contToken);
            if (eleList != null)
                returnedList.AddRange(eleList);
            else
                num = loop;
            num += 1;

            if (contToken != null)
                AZContinuationToken.SetContToken(contToken);

            Console.WriteLine("returnedlistsize: 0", returnedList.Count<PerfMonEntity>());
        

【问题讨论】:

【参考方案1】:

当没有更多数据要返回时,继续标记为空。当它不为空时,意味着在下一页中还有其他实体要返回。您可以检查 null 以确定您何时检索到最后一页,然后退出循环。

尝试按照以下思路编写逻辑:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

CloudTable eventLogsTable = tableClient.GetTableReference("WADPerformanceCountersTable");
TableQuery query = new TableQuery();

Console.WriteLine("List perf counter results in pages:");

TableContinuationToken token = null;

do

    var segment = eventLogsTable.ExecuteQuerySegmented(query, token, null, null);

    foreach (var wadCounter in segment)
    
        Console.WriteLine(wadCounter.PartitionKey);
        Console.WriteLine(wadCounter.RowKey);
        Console.WriteLine(wadCounter.Timestamp);
    

    token = segment.ContinuationToken;

while (token != null);

【讨论】:

购买一个如何从我们到达的地方重新启动到上次停止的地方? (例如 tail -f 行为?) 我知道这已经很晚了,但是您可以像这样创建BlobContinuationToken 的新实例:BlobContinuationToken token = new BlobContinuationToken() NextMarker = "[long_continuation_token_goes_here]" ;。这将在那时开始您的请求并继续。

以上是关于Azure 表存储续的主要内容,如果未能解决你的问题,请参考以下文章

使用 azure 数据工厂管道将 json 对象存储到 azure 表存储实体

使用 Azure MSI 访问 Azure 表存储

Azure Functions - 使用 Azure Functions 的表存储触发器

为啥不能配置 Azure 诊断以通过新的 Azure 门户使用 Azure 表存储?

Azure 表存储备份

在 Azure 存储帐户表中存储 API 密钥/密码