不调试时 Google 广告管理器 api 很慢c#

问题描述

我们目前在 Google 广告管理器 C# 客户端中遇到了一个相当奇怪的行为。 我们正在使用 Google.Dfp nuget 包。

这是我们使用的代码

reportQuery.dimensions = new Dimension[] {
  Dimension.DATE,dimension
};
var reportJob = new ReportJob {
  reportQuery = reportQuery
};
reportJob = reportService.runReportJob(reportJob);
// Set download options.
var options = new ReportDownloadOptions {
  exportFormat = ExportFormat.XML,useGzipCompression = true
};
var reportUtilities = new ReportUtilities(reportService,reportJob.id) {
  reportDownloadOptions = options
};
var dimensionResponse = new List < DimensionResponse > ();
XDocument xmlDoc = null;
using(var response = reportUtilities.GetResponse()) {
  using(var oReader = new StreamReader(response.DecompressedStream)) {
    xmlDoc = XDocument.Load(oReader);
    var serializer = new XmlSerializer(typeof (ReportResponse),new XmlRootAttribute("Report"));
    var xml = xmlDoc.ToString();
    using(var sr = new StringReader(xml)) {
      var result = (ReportResponse) serializer.Deserialize(sr);
      if (result.ReportData.DataSet.Row != null) {
        dimensionResponse = result.ReportData.DataSet.Row.Select(x => new DimensionResponse {
          DateString = x.Column[0].Val,Name = x.Column[1].Val,Impressions = int.Parse(x.Column[hasIdColumn ? 3 : 2].Val,NumberStyles.Number,CultureInfo.InvariantCulture),Clicks = int.Parse(x.Column[hasIdColumn ? 4 : 3].Val,CTR = x.Column[hasIdColumn ? 5 : 4].Val,ActiveViewViewableImpressions = int.Parse(x.Column[hasIdColumn ? 6 : 5].Val,ActiveViewViewableImpressionsRate = x.Column[hasIdColumn ? 7 : 6].Val
        }).ToList();
      }
    }
  }
}
return dimensionResponse;

问题出现在这一行:

using(var response = reportUtilities.GetResponse())

当我们逐步调试时,api 返回响应大约需要 2 秒,但是当我们删除断点并尝试不使用它时,函数完成大约需要 32 秒。 在生产服务器上的发布模式下也会出现同样的缓慢。

我们认为第一次很慢,所有其他测试都更快,因为谷歌在后端缓存了报告,但事实并非如此,因为我们设法在不同日期的非缓存报告上重现问题。

知道什么会导致这种奇怪的行为吗?

解决方法

您可以从appengine latency here

尝试以下内容

您是否将生产密钥放入代码中,是否也超出了速率限制。

  • 代码优化 在 App Engine 上优化代码的一些方法 减少延迟:

  • 离线工作:使用 Cloud Tasks 以便用户请求不会被阻塞 等待发送邮件等工作完成。

  • 异步 ​​API 调用:确保您的代码没有被阻塞等待 用于完成 API 调用。诸如 ndb 之类的库提供内置的 对此表示支持。

  • 批处理 API 调用:API 调用的批处理版本通常更快 而不是单独拨打电话。

  • 非规范化数据模型:减少对数据进行调用的延迟 通过对数据模型进行非规范化来实现持久层。