$ пакетные запросы - обеспечивают ли они повышение производительности клиента по сравнению с запросами, выполняемыми один за другим - PullRequest
1 голос
/ 26 апреля 2019

Предполагается, что $ batch-запросы в xrm используются для определения количества операций, которые либо завершаются успешно, либо как группа.

https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/webapi/execute-batch-operations-using-web-api

IE вместо этогоиз

POST [Organization URI]/api/data/v9.0/tasks
{ ...payload for task1.. }
POST [Organization URI]/api/data/v9.0/tasks
{ ...payload for task2.. }

Вы создаете запрос

POST [Organization URI]/api/data/v9.0/$batch
{ .... shared payload ... }

Теперь у меня вопрос, должны ли они также обеспечивать повышение производительности при загрузке клиента?То есть, когда я буду использовать $ batch, общая производительность клиента должна быть лучше?

РЕДАКТИРОВАТЬ

Тестовый фрагмент, который я использовал:

syncTest = function() {
  var now = Date.now();
  var count = 0;
  var done = function() {
    count++;
    if (count === 2) {
      console.log("Sync: " + (Date.now() - now) + " ms");
    }
  };

  $.ajax({method:"GET",url:"/api/data/v9.0/contacts(53c4918e-5367-e911-a83b-000d3a31329f)", success: function() { done(); }});
  $.ajax({method:"GET",url:"/api/data/v9.0/contacts(50b297c5-4867-e911-a843-000d3a3130ea)", success: function() { done(); }});
};

asyncTest = function() {
  var now = Date.now();
  var done = function() {
    console.log("Async: " + (Date.now() - now) + " ms");
  };

  var headers = {
    'Content-Type': 'multipart/mixed;boundary=batch_123456',
    'Accept': 'application/json',
    'Odata-MaxVersion': '4.0',
    'Odata-Version': '4.0'
  };

  var data = [];
  data.push('--batch_123456');
  data.push("Content-Type: application/http");
  data.push("Content-Transfer-Encoding:binary");
  data.push('');
  data.push('GET /api/data/v9.0/contacts(53c4918e-5367-e911-a83b-000d3a31329f) HTTP/1.1');
  data.push('Content-Type:application/json;type=entry');
  data.push('');
  data.push('{}');

  data.push('--batch_123456');  
  data.push("Content-Type: application/http");
  data.push("Content-Transfer-Encoding:binary");
  data.push('');
  data.push('GET /api/data/v9.0/contacts(50b297c5-4867-e911-a843-000d3a3130ea) HTTP/1.1');
  data.push('Content-Type:application/json;type=entry');
  data.push('');
  data.push('{}');  
  data.push('--batch_123456');
  var payload = data.join('\r\n');

  $.ajax({method:"POST",url:"/api/data/v9.0/$batch", data:payload, headers: headers, success: function() { done(); }});
};

Метод тестирования - очистить кэш браузера, выполнить фрагмент кода;время (в среднем за пять попыток):

$batch                 - 242ms per combined request (average for 5x)
one by one in parallel - 195ms per combined request (average for 5x)

Так что, похоже, $ batch фактически добавляет некоторые накладные расходы.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2019

Для ваших запросов, поскольку они работают асинхронно, оба запроса будут отправлены на сервер и будут обрабатываться асинхронно, а не пакет, который будет обрабатывать их по одному за раз. Поэтому я думаю, что общее время выполнения будет меньше для двух асинхронных по сравнению с одним асинхронным, но из-за обработки на сервере, а не проблем на стороне клиента. Вместо этого вы можете изменить свои звонки на синхронизацию и посмотреть, есть ли разница.

0 голосов
/ 04 мая 2019

Пакетный запрос сэкономит время туда-обратно.Это главное преимущество в производительности.Последовательная отправка 2х запросов выполняется намного медленнее, чем отправка только 1 запроса.Как заявил Дэрил, ваши 2 запроса отправляются в асинхронном режиме (что более или менее означает параллельное выполнение).Вот почему вы видите разницу.Таким образом, вы в основном сравниваете параллельную обработку с однопоточностью.

0 голосов
/ 27 апреля 2019

Пакет Web API может принимать 100 записей, что может обеспечить улучшенную производительность по сравнению с параллельной последовательностью. Это будет в первую очередь связано с уменьшением количества соединений между клиентом и сервером, что может быть проблемой производительности в средах с высокой задержкой. Как отмечено ниже, он не предназначен специально для удовлетворения этого сценария, однако, в первую очередь для достижения транзакционного поведения.

Пакетные операции с использованием веб-API в некоторой степени аналогичны ExecuteTransactionRequest и ExecuteMultipleRequest Службы организации.

Batch

  • Предоставляет способ объединения нескольких операций, которые либо выполняются успешно, либо не выполняются как группа.
  • Транзакционное поведение: Да.
  • Максимальный размер партии: 100.

ExecuteTransactionRequest

  • Выполнение нескольких операций в одной транзакции с возможностью отката всех изменений данных в случае сбоя одной операции.
  • Транзакционное поведение: Да.
  • Максимальный размер партии: два или более (вероятно, 1000, если оно соответствует ExecuteMultipleRequest).

ExecuteMultipleRequest

  • Повышение производительности, когда задержка интернета может быть наибольшим ограничивающим фактором .
  • Транзакционное поведение: Нет.
  • Максимальный размер пакета: 1000, два одновременных вызова.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...