Невозможно найти объекты из хранилища таблиц после вставки пакетов по 100 - PullRequest
0 голосов
/ 09 ноября 2018

Проблема: В настоящее время у нас есть две функции плана потребления Azure, каждая из которых получает входные сообщения очереди шины обслуживания. Первые функции вызывают SQL Azure с сохраненным процессом, получают обратно более 500 тыс. Записей и сохраняют эти записи в пакетах из хранилища таблиц от 100 до Azure, причем каждый пакет имеет уникальный ключ раздела. После этого он создает новое сообщение очереди для следующей функции, которая читает пакет и обрабатывает его.

Все работает нормально, когда вторая функция не работает и все еще нуждается в прогреве. Если вторая функция выполняется в памяти и получает сообщение очереди, мы выполняем поиск ключа раздела в хранилище таблицы, и иногда кажется, что возвращающиеся данные пусты .

Код, который вставляет пакеты в табличное хранилище:

 foreach (var entry in partitionKeyGroupinng)
               {
                   var operation = new TableBatchOperation();
                   entry.ToList().ForEach(operation.Insert);

                   if (operation.Any())
                   {
                       await CloudTable.ExecuteBatchAsync(operation);
                   }
               }

Это внутри функции асинхронной задачи в общей сборке, на которую ссылаются все функции.

Код для чтения из хранилища таблиц при поиске ключа раздела:

TableContinuationToken continuationToken = null;

        var query = BuildQuery(partitionKey);

        var allItems = new List<T>();
        do
        {
            var items = await CloudTable.ExecuteQuerySegmentedAsync(query, continuationToken);
            continuationToken = items.ContinuationToken;
            allItems.AddRange(items);
        } while (continuationToken != null);

        return allItems;

Код, который вызывает это для поиска по ключу раздела:

 var batchedNotifications = await _tableStorageOperations.GetByPartitionKeyAsync($"{trackingId.ToString()}_{batchNumber}");

Я считаю, что это связано с тем, что пакет все еще пишется и доступен для других клиентов, но не знаете, так ли это? Как лучше всего справиться с этим с помощью функции обработки и возможной согласованности?

Я отключил следующее на клиенте таблицы:

  tableServicePoint.UseNagleAlgorithm = false;          
  tableServicePoint.Expect100Continue = false;
  tableServicePoint.ConnectionLimit = 300;

Если я также посмотрю тот же ключ раздела в проводнике хранилища, когда происходит событие, я могу увидеть пакет, чтобы он возвращал значения? Я думал, что использование EGT с пакетной обработкой гарантирует, что это будет записано и доступно как можно скорее, потому что асинхронный метод Task WriteBatch не должен завершиться до того, как закончится запись пакета, однако не знаю, как долго будет возвращаться хранения таблицы занимает запись этого в физический раздел и затем сделать его доступным. Я также упаковал все сообщения очереди служебной шины перед отправкой, чтобы добавить некоторую задержку для второй функции.

Вопрос: Как нам справиться с этой задержкой при доступе к этим записям из табличного хранилища между двумя функциями с использованием очередей служебной шины?

...