首页 > 解决方案 > $batch 请求 - 与逐个执行的请求相比,它们是否提供客户端性能加速

问题描述

xrm 中的 $batch 请求应该用于作为一个组成功或失败的操作数。

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 ... }

现在我的问题是它们是否也应该为客户端加载提供性能加速?IE 当我使用 $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 实际上增加了一些开销。

标签: dynamics-crmdynamics-crm-online

解决方案


批量请求将节省往返时间。即主要性能优势。按顺序发送 2 个请求比只发送 1 个请求要慢得多。正如 Daryl 所说,您的 2 请求是异步发送的(这或多或少意味着并行)。这就是您看到差异的原因。因此,您基本上将并行处理与单线程进行比较。


推荐阅读