Google.Apis.Admin.Email_Migration_v2 [Код состояния HTTP 412 - достигнут предел]

Изменить 2:

Клиентская библиотека: после просмотра нелегко предположить, что это для клиентской библиотеки.NET.

DLL: Google.Apis.Admin.email_migration_v2.dll


Какие шаги воспроизведут проблему?

  1. Создайте процесс, который содержит экземпляр Google.Apis.Admin.email_migration_v2.AdminService для каждого уникального почтового ящика Gmail Служб Google, в который будут отправляться сообщения. Все сгенерированные объекты AdminService используют одинаковые учетные данные OAuth2.0 и имя приложения. Каждый созданный объект AdminService будет отправлять сообщения только в один почтовый ящик пользователя Служб Google. Например, если бы мы отправляли сообщения в пять разных почтовых ящиков Google Apps Gmail, мы бы сгенерировали пять объектов AdminService для отправки сообщений; один для почтового ящика каждого пользователя.

    • Самое интересное, что каждый созданный объект AdminService создается в отдельном процессе.

    • Объектам AdminService был предоставлен объект FileDataStore для изменения местоположения, в котором хранится токен обновления; C:\ProgramData\ некий-файл \ некий-файл.

    • Поставляются соответствующие области действия для полномочий.

  2. Начните отправлять почтовые сообщения о каждом процессе. Использование одного потока для отправки сообщений в каждом процессе, поэтому в каждый почтовый ящик каждого пользователя отправляется только одно сообщение.

    • Каждое отправленное сообщение получает свой собственный экземпляр MailItem и MailResource.InsetMedia.

    • Объект MailResource.InsertMedia создается для каждого элемента путем вызова метода AdminService.Mail.Insert(MailItem, string, Stream, string).

  3. Когда наш код выполняет вызов MailResource.InsertMediaUpload.UploadAsync(CancellationTokenSource).Result - это место, где мы можем получить ошибку.

    • Ошибка поймана и обработана (зарегистрирована) от типа возврата вышеупомянутого вызова; тип является Google.Apis.Upload.IUploadProgress. Исключение обрабатывается с использованием свойства IUploadProgress.Exception.

Каков ожидаемый результат? Что ты видишь вместо этого?

  • Ожидаемый вывод будет успешным ответом на сообщение или свойством исключения IUploadProgress, которое будет нулевым после возврата задачи. Вместо этого мы получаем следующее сообщение об ошибке:

    Администратор службы выдал исключение: Google.GoogleApiException:Google.Apis.Requests.RequestError

    Достигнуто ограничение. [412] Ошибки [Сообщение [Достигнут предел.] Местоположение [If-Match - заголовок] Причина [conditionNotMet] Домен [global]]

    в Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Задача)

    в Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Задача)

    в 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) во время отправки сообщений. Как только мы получим эту ошибку, другие сообщения, отправленные после неудачных сообщений, могут быть успешными. (Элементы могут потерпеть неудачу в любой момент в начале, середине или конце процесса.)

  • Каждое отправленное сообщение имеет почти идентичный контент. Размер сообщений варьируется от 1 КБ до 100 КБ, включая размер всех связанных вложений, не все сообщения имеют вложения.

  • Повторная обработка неисправных элементов в более позднее время приводит к успешным ответам на сообщения, и соответствующие элементы отправляются в почтовый ящик Gmail пользователя Apps Google.

  • Максимальное количество почтовых ящиков пользователя Служб Google, отправляемых за один раз, было десять.

  • После проверки квот нашего проекта в консоли разработчиков Google:

    • Мы не достигли указанного лимита в 20 запросов в секунду для API переноса электронной почты; максимально при отправке 7 запросов в секунду.

    • Только 2% от максимальных ежедневных запросов было достигнуто.

  • Все отправленные сообщения имели одинаковую метку; на этикетке было ограничение в 225 символов. На самом деле все метки / суб-метки, примененные вместе, преодолели только 40 символов.

  • Это сообщение об ошибке все еще можно получить при отправке только в один почтовый ящик пользователя Служб Google; только с использованием одного процесса и одного потока.

  • Каждый процесс обычно отправляет от 1000 до 5000 сообщений.

  • Я не нашел много конкретной документации, чтобы объяснить эту конкретную ошибку достаточно подробно, чтобы исправить проблему под рукой.

Вопросы:

  1. Так что же конкретно означает этот код состояния 412 http? Какое ограничение встречается в этом сообщении?
  2. Разве мы не должны получать какую-либо форму ошибки 5XX с сервера, если мы достигли предела? В каком случае не сработает встроенная экспоненциальная политика отсрочки?
    • а. Если сервер не проверяет POST-запрос на предварительное условие о пределе на стороне сервера, то говорит клиенту отступить, что, как кажется, обычно указывает ошибка 412. В этом случае, пожалуйста, дайте как можно больше подробностей по вопросу 1.

Извините за обширный пост! Спасибо за ваше время! Я также буду создавать дефект / проблему в трекере проблем.NET Google и предоставлять ссылку.


Изменить 1:

Для всех, кто интересуется этой проблемой, есть ссылка на отправленный элемент в системе отслеживания проблем Google для.NET. Представленный выпуск

Для справки: номер 492.

2 ответа

Решение

Я полагаю, что нашел ответ на эту проблему, хотя я рекомендую отказ от ответственности, я не работаю в Google и не могу быть уверен на 100% в точности; Вы были предупреждены. Это должно, по крайней мере, быть верным для.NET-версии Google Email Migration v2 API. Я не могу гарантировать, как работают другие API, потому что я их не использую..

Благодаря более чем восьмимесячной работе с этим API, кажется, что если приложение или несколько приложений должны отправлять сообщения одному пользователю / почтовому ящику Служб Google последовательно, с большей скоростью, чем могут обрабатывать серверы Google, то при с некоторой вероятностью вы должны начать получать кучу исключений GoogleApiException с указанием "412 - предел достигнут" при отправке новых сообщений. Используя наше приложение, мы обнаружили, что у каждого пользователя / почтового ящика Служб Google есть своя очередь ожидающих элементов. Когда вы отправляете сообщение в Службы Google, оно сначала помещается в эту очередь, а затем обрабатывается сервером Google и помещается в почтовый ящик пользователя. Если эта очередь заполнится, и вы попытаетесь отправить другое сообщение, вы получите ошибку 412.

Можно подождать перед отправкой другого сообщения, вам придется подождать, сколько бы сервер Google ни обработал следующее сообщение в очереди пользователя перед отправкой другого; что непредсказуемо. На мой взгляд, лучший вариант - начать отправлять сообщения другому пользователю Служб Google; потому что каждый пользователь, кажется, имеет свою собственную очередь сообщений. Обязательно прекратите отправку пользователю, который последовательно получает 412 ошибок. Это даст серверу Google некоторое время для обработки очереди упакованных сообщений этого пользователя. Обратите внимание, что каждая очередь ожидающих сообщений содержала около 100-150 элементов, а затем выдавала 412 ошибок.

503 ошибки возникают при отправке сообщений в очередь почтовых ящиков пользователя с более высокой скоростью, чем 1 запрос в секунду. Как сказала Эмили, "лимит QPS, который вы видите в проекте консоли разработчика Google, не является фактическим лимитом по умолчанию", это действительно 1 QPS на пользователя Служб Google.

Что касается экспоненциального отката, то он должен быть реализован автоматически. Заметьте, что Пелеял, кажется, джентльмен, отвечающий за API; можно отметить на странице загрузки для API.

Это заняло у нас немного времени, чтобы понять, почему у вас такая проблема! Пожалуйста, если вы обнаружите противоречивую информацию, исправьте ошибки, найденные в этом ответе, или сделайте свои собственные!!

Я не совсем уверен, где вы видите "указанное ограничение в 20 запросов в секунду для API переноса электронной почты". Напоминание: лимит QPS, который вы видите в проекте Google Developers Console, не является фактическим лимитом по умолчанию. Вы можете изменить это ограничение на что угодно, и, таким образом, это не фактическое ограничение для API. Это действительно просто для управления потреблением квоты API (некоторые APis будут иметь гораздо более высокий QPS, где вы можете настроить его на более низкий уровень для разных проектов на вашей консоли).

Согласно документации APi по миграции электронной почты, QPS составляет 1 запрос в секунду (ссылка здесь: https://developers.google.com/admin-sdk/email-migration/v2/limits).

Я столкнулся с ошибкой 412 при достижении предела QPS, а также с ошибкой 412, когда я загружаю слишком много данных в один домен. Сколько данных вы загружаете все сразу? Я бы предложил сделать экспоненциальный откат, чтобы увидеть, исчезнет ли проблема.

Другие вопросы по тегам