У нас в Стражнике сейчас потихоньку идёт полный перенос всей логики отправки сообщений в единую очередь, чтобы не было случаев когда одна команда выжрала весь рейтлимит и очередь ловит 429 на попытку отправить в нормальных пределах. Чтобы отправить задачу в очередь у нас используется несколько конструкций
Отправка через контекст:
await ctx.sendMessage("command:admins", ctx.chat.id, await ctx.lang.t('commands.general.disabled'), {
reply_parameters: {
message_id: ctx.message.message_id,
allow_sending_without_reply: true
}
});Ответ через контекст (для случаев когда мы отвечаем на что-то в тот же чат и тот же тред):
await ctx.replyQueued(await ctx.lang.t('commands.general.disabled'), {
reply_parameters: {
message_id: ctx.message.message_id,
allow_sending_without_reply: true
}
});Отправка вне контекста (ей к примеру пользуется отправка сообщений через API, когда у нас нет контекста обновления от ТГ):
await Queues.getInstance().sendMessage("main", "command:admins", await Language.getFallback().t('commands.general.disabled'), {
reply_parameters: {
message_id: ctx.message.message_id,
allow_sending_without_reply: true
}
});А как под каптом работает этот метод?
let job = await this._sendQueue.add(name, {id, text, extra, target}, {priority});
job = await job.waitUntilFinished(this._sendQueueListener);
return job.returnvalue;Увидели проблему? Если нет, то не бойтесь, я тоже её не замечал пока она не воспроизвелась. await - корень нашего зла. Когда куча воркеров и ещё большая куча потоков внутри них начинают отправлять сообщения одновременно, согласно рейтлимитам очередь начинает троллить отправку, А НАШИ ПОТОКИ ЖДУТ ОТВЕТ ТЕЛЕГИ. В итоге у нас получается боттлнек когда из-за количества отправляемых сообщений, мы теряем в скорости обработке входящих. И это кстати случилось, но к счастью и удивлению - ночью.
Подкрепил в пост графики которые позволили нам обнаружить этот косяк. Вот так вот, порой ошибок от сервиса нет, но если глянуть график - понимаешь что ошибка есть, и это ты 😢
#updates


