Google.Apis.Admin.Email_Migration_v2 [HTTP状态码412 - 达到限额]

时间:2014-09-29 19:41:47

标签: c# .net google-api google-api-dotnet-client google-email-migration

编辑2:

客户端库: 在审核之后,不容易建议将其用于.NET客户端库。

DLL: Google.Apis.Admin.email_migration_v2.dll


哪些步骤会重现此问题?

  1. 生成包含a的进程 每个Google.Apis.Admin.email_migration_v2.AdminService实例 将发送邮件的唯一Google Apps Gmail邮箱。 生成的所有AdminService对象都使用相同的OAuth2.0 凭证和应用程序名称。生成每个AdminService对象 只会向一个Google Apps用户的邮箱发送邮件。对于 例如,如果我们向五个不同的Google Apps发送邮件 Gmail邮箱我们会生成五个要发送的AdminService对象 消息;每个用户的邮箱一个。

    • 最重要的是要创建的每个AdminService对象都是在单独的进程上创建的。

    • 为AdminService对象提供了一个FileDataStore对象来更改存储刷新令牌的位置; C:\ ProgramData \ SomeFile \ SomeFile。

    • 为凭据提供适当的范围。

  2. 开始在每个进程上发送邮件。使用一个线程在每个进程中发送消息,因此每次只向每个用户的邮箱发送一条消息。

    • 发送的每条消息都有自己的MailItem和MailResource.InsetMedia实例

    • 通过调用AdminService.Mail.Insert(MailItem,string,Stream,string)方法为每个项生成MailResource.InsertMedia对象。

  3. 当我们的代码调用MailResource.InsertMediaUpload.UploadAsync(CancellationTokenSource)时.Result是我们收到错误的地方。

    • 从上述呼叫的返回类型中捕获并处理(记录)错误;类型是Google.Apis.Upload.IUploadProgress。使用IUploadProgress.Exception属性处理异常。
  4. 预期产量是多少?你怎么看?

    • 在返回任务后,预期输出将是成功的消息响应或IUploadProgress的异常属性为null。相反,我们收到以下错误消息:

      服务管理员抛出异常: Google.GoogleApiException:Google.Apis.Requests.RequestError

      达到限制。 [412] 错误[消息[达到限制。]位置[If-Match - 标题]原因[conditionNotMet]域[global]]

      at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

      at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)

      at Google.Apis.Upload.ResumableUpload`1.d__e.MoveNext()

    您使用的是哪个版本的产品?

    • Google.Apis.Admin.Email_Migration_v2(1.8.1.20)

    您的操作系统是什么?

    • Windows Server 2008 R2 Enterprise(SP1)

    您的IDE是什么?

    • Visual Studio 2013 Premium

    什么是.NET框架版本?

    • 4.0.30319

    请在下面提供任何其他信息。

    • 非连续消息可能失败(使用412 http状态代码 上面提供的)在发送消息的过程中。一旦我们 收到此错误失败的消息后发送的其他消息 能成功吗(项目在此过程中的任何时候都可能失败 开始,中间或结束。)

    • 发送的每条消息都有几乎相同的内容。的大小 消息的范围从1KB到100KB,包括所有关联的大小 附件,并非所有邮件都有附件。

    • 稍后重新处理失败的项目会导致成功 消息响应和相应的项目将发送给用户 Google Apps Gmail收件箱。

    • 发送给一个Google Apps用户邮箱的最大数量 时间十点。

    • 检查Google Developers Console项目的配额后:

      • 我们远未达到每秒20个请求的指定限制 电子邮件迁移API;最多每秒发送7个请求。

      • 只有2%的每日最高要求已经达到。

    • 发送的所有邮件都有相同的标签;这个标签很好 225个字符限制。实际上所有的标签/子标签都适用 一共只超过40个字符。

    • 仅向一个发送时,仍然可以收到此错误消息 Google Apps用户的邮箱;只使用一个进程和一个线程。

    • 每个进程通常会发送1000-5000条消息。

    • 我没有找到很多具体的文档来详细解释这个特定错误,以解决手头的问题。

    问题:

    1. 那么这个412 http状态代码究竟是什么意思呢?此消息所指的是什么限制?
    2. 如果我们达到限制,我们不应该从服务器收到某种形式的5XX错误吗?在哪种情况下,内置的指数退避政策不会启动?
      • 一个。除非服务器正在检查POST请求是否存在关于服务器端限制的前提条件,否则告诉客户端退出哪个412错误似乎通常表示。在这种情况下,请尽可能详细地提供问题1。
    3. 很抱歉这篇文章很棒!谢谢你的时间!我还将在Google的.NET问题跟踪器中创建一个缺陷/问题并提供链接。


      修改1:

      对于有兴趣关注此问题的任何人,都可以在Google的Google问题跟踪器中找到已提交项目的链接。 Submitted Issue

      作为参考,它是问题492。

2 个答案:

答案 0 :(得分:0)

我不太确定您在哪里看到"电子邮件迁移API"指定的每秒20次请求限制。提醒:您在Google Developers Console项目中看到的QPS限制不是实际的默认限制。您可以将该限制更改为您想要的任何内容,因此,这不是API的实际限制。它实际上只是用于管理API配额的消耗(某些AP将具有更高的QPS,您可以在其中调整它以降低控制台上的不同项目)。

根据电子邮件迁移APi文档,QPS是每秒1个请求(链接在这里:https://developers.google.com/admin-sdk/email-migration/v2/limits)。

当QPS限制被击中时,我遇到了412个错误,而且当我将过多数据上传到单个域时,我也看到了412错误。你一次加载多少数据?我建议做一个指数退避,看看问题是否会消失。

答案 1 :(得分:0)

我相信我已经找到了这个问题的答案,虽然我会建议免责声明,我不为Google工作,也不能100%确定准确性;你被警告过了。这至少适用于Google版本的Google电子邮件迁移v2 API。我无法保证其他API如何工作,因为我不使用它们。

现在,通过在这个API中使用这个API已经超过八个月了,如果一个应用程序或多个应用程序要始终如一地向单个Google Apps用户/邮箱发送邮件,那么它的速度要比Google服务器可以处理的速度快,那么在某种程度上你应该开始得到一堆GoogleApiExceptions,说明" 412 - 限制到达"发送新邮件时我们通过使用我们的应用程序收集的是每个Google Apps用户/邮箱都有自己的待处理项目队列。当您向Google Apps发送消息时,它首先会被放入此队列,然后由Google服务器处理并放入用户的邮箱中。如果此队列已满,并且您尝试发送另一条消息,则会收到412错误。

选项是在发送另一条消息之前等待,您必须等待Google服务器在发送另一条消息之前处理用户队列中的下一条消息所需的时间。这是不可预测的。我认为更好的选择是开始向其他Google Apps用户发送邮件;因为每个用户似乎都有自己的消息队列。请务必停止向始终遇到412错误的用户发送邮件。这将为Google服务器提供一些时间来处理该用户的打包消息队列。请注意,在抛出412个错误之前,每个待处理消息队列似乎容纳了大约100-150个项目

当以比每秒1个请求更高的速率将消息发送到用户的邮箱队列时,似乎发生503错误。正如Emily所声明的那样,您在Google Developers Console项目中看到的QPS限制并不是实际的默认限制"每个Google Apps用户真的是1 QPS。

对于指数退避,它应该自动实现,见this。注意Peleyal似乎是负责API的绅士;可以从API的下载页面中注明。

如果您遇到这个问题,我们花了一些时间来弄清楚这些欢呼!如果您发现任何有矛盾的信息,请更正此答案中的错误或自行制作!!