$ batch请求-与逐个执行的请求相比,它们是否提供客户端性能提升

时间:2019-04-26 11:21:35

标签: dynamics-crm dynamics-crm-online

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

  

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

I.E。代替

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 :(得分:0)

该Web API批处理可以接受100条记录,与并行进行一对一记录相比,可以提供更高的性能。这主要是由于减少了客户端与服务器之间的通信数量,这在高延迟环境中可能是性能问题。如下所述,它并不是专门为满足这种情况而设计的,它主要是为了实现交易行为。

使用Web API的

Batch操作与组织服务的ExecuteTransactionRequestExecuteMultipleRequest有点相似。

Batch

  • 提供一种将多个成功或失败的操作捆绑在一起的方法。
  • 交易行为:是的。
  • 最大批次大小:100。

ExecuteTransactionRequest

  • 在单个事务中执行多项操作,并能够在任何一项操作失败时回滚所有数据更改。
  • 交易行为:是的。
  • 最大批处理大小:两个或更多(如果与ExecuteMultipleRequest相匹配,则可能为1000)。

ExecuteMultipleRequest

  • 提高性能,使Internet延迟成为largest limiting factor
  • 交易行为:否。
  • 最大批处理大小:1000,两个并发调用。

答案 1 :(得分:0)

对于您的请求,由于它们正在异步运行,因此这两个请求都将发送到服务器,并且将与批处理异步处理,批处理将一次处理一个。因此,我可以想象两个异步的总执行时间会少于一个异步的总执行时间,但是由于服务器处理,而不是客户端问题。您可以改为将通话更改为通过同步,以查看是否存在差异。

答案 2 :(得分:0)

批处理请求将节省往返时间。即主要性能优势。顺序发送2个请求,比仅发送1个请求要慢得多。如Daryl所述,您的2个请求均发出Async(或多或少表示并行)。这就是您看到差异的原因。因此,您基本上将并行处理与单线程进行比较。