Как настроить сервис потребления очереди Amazon - PullRequest
0 голосов
/ 21 ноября 2018

Я кодировал какой-то скрипт массовой рассылки.Это работает так.
1. Извлечение пользователей из базы данных, которые должны получать электронную почту.В настоящее время это число составляет ~ 11 тыс.
. 2. Поместите свой адрес электронной почты в службу очереди Amazon.
3. С помощью интервала запускайте другой лямбда-код, который извлекается из службы очереди.
4. Найдите связанные продукты каждого пользователя иПостройте HTML-шаблон (Amazon s3) для рассылки.
5. Отправьте их с помощью Amazon SES.

Поскольку Amazon SES разрешает только до 14 писем в секунду, мне нужно настроить количество потребления при извлечении.Но это как-то потребляет слишком много, а SES дает мне ошибку.

Текущий фрагмент кода:

module.exports.mail_puller = (event, context, callback) => {
  init_aws();
  const Consumer = require('sqs-consumer');
  const app = Consumer.create({
    queueUrl: process.env.QUEUE_URL,
    handleMessage: (msg, done) => {
      build_email(JSON.parse(msg.Body));
      done();
    },
    waitTimeSeconds: 20,
    size: 1,
    visibilityTimeout: 1,
    sqs: sqs
  });

  app.on('error', (err) => {
    if (err) console.log(err);
  });
  app.on('empty', (err) => {
    if (err) console.log(err);
    if (connection && connection.state !== 'disconnected') connection.end();
    app.stop();
    callback(null, response);
  });
  app.start();
};

function build_email(obj) {
  init_cheerio();
  const $t = cheerio.load(obj.tpl);

  find_chosen(obj.id).then(products => {
    for (let product of products) {
      $t('.products-container').prepend(build_product(obj.product_tpl, product));
    }
    send_email(obj.email, obj.subject, $t.html().toString(), obj.id);
  });
}

Сообщение об ошибке:

2018-11-21T01:51:11.039Z    daf6727a-ed2f-11e8-9330-c581beef6958    { Throttling: Maximum sending rate exceeded.
at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/query.js:47:29)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)
message: 'Maximum sending rate exceeded.',
code: 'Throttling',
time: 2018-11-21T01:51:11.039Z,
requestId: 'ebcebbd1-ed2f-11e8-b6d5-130ef17efa56',
statusCode: 400,
retryable: true }

1 Ответ

0 голосов
/ 27 ноября 2018

Регулирование - это нормальное событие , и вы должны обработать это исключение, перезапустив обработанный запрос после некоторой задержки - для этого AWS предоставляет инфраструктуру политики повторов (ссылка предназначена дляJava SDK, но похожая концепция существует для всех SDK).Подробнее о повторных попытках читайте здесь здесь .

Вы можете помочь смягчить это, также применив некоторое ограничение скорости на вашей стороне - в основном добавьте некоторые искусственные задержки к вашим send_email вызовам, чтобы уменьшить удушение SES.

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

...