169 похожих чатов

У Telegram есть ограничение по отправке сообщений за секунду. допустим,

есть основной поток, который обрабатывает сообщения от пользователей, и другой, который только отправляет сообщения. так как эти потоки работают независимо, то они не знают, как много сообщений было отправлено за секунду, поэтому можно привысить лимиты. решение очевидно — сделать очередь, в которую будут складываться все сообщения, которые нужно отправить, но возникает пару вопросов:
1) как реализовать эту очередь? стоит ли прибегать ко всяким RabbitMQ?
2) стоит ли делать два отдельных бинарника или можно всё оставить в одном бинарном файле? (условно, один поток наблюдает за изменениями на сайте и если они есть, то он присылает сообщение, а второй отвечает за непосредственное взаимодействие с теми, кто пользуется ботом)

11 ответов

15 просмотров

Для лимитирования скорости очередь не обязательна.

Берёшь TQueue и делаешь отдельный поток

Nick Ivanych
Для лимитирования скорости очередь не обязательна.

почему же? как тогда понять, что лимит превышен? глобальное состояние?

Воинствующий Безбожник
почему же? как тогда понять, что лимит превышен? г...

Очередь достаточно из циферок, а не самих сообщений.

Nick Ivanych
Очередь достаточно из циферок, а не самих сообщени...

извините, но я вас не понял. я попробую объяснить, почему без очереди нельзя обойтись. очевидно, отправкой сообщений надо заниматься в отдельном потоке. надо передавать данные в этот самый поток, сообщения могут накапливаться, поэтому нужно такое хранилище, которые сможет хранить более одного сообщения. что делает этот поток? он достаёт сообщение, далее проверяет по времени, можно ли его отправить, иначе либо ждёт, либо переходит к следующему сообщению (тут надо подумать над алгоритмом) и так, пока не закончатся сообщения в очереди. вот моя задумка. может быть, можно проще, но, честно, я не знаю как

Воинствующий Безбожник
извините, но я вас не понял. я попробую объяснить,...

Можно про текущее сообщение решать, насколько его задержать, исходя из текущей вычисленной скорости.

Nick Ivanych
Можно про текущее сообщение решать, насколько его ...

а. понял. т.е. сразу же планировать отправку сообщения, а не усыплять поток. интересно... спасибо

Воинствующий Безбожник
извините, но я вас не понял. я попробую объяснить,...

делай батчи и отправляй за раз все нужные сообщения, не?

Nutritional Rabbit
делай батчи и отправляй за раз все нужные сообщени...

так не получится, потому что с помощью sendMessage можно отправить только одно сообщение за раз. и смысла собирать сообщения в группу нет, всё равно лучше их отправку лучше запланировать

Воинствующий Безбожник
так не получится, потому что с помощью sendMessage...

А я бы не планировал ничего (сложно это), а использовал бы Rate Limited queue consumption. То есть, вот у меня сам "сервис", который читает очередь и делает sednMessage был бы ограничен определённым количеством операций в секунду. Может быть даже https://hackage.haskell.org/package/rate-limit-1.4.2 подощёл бы.

Alexey Raga
А я бы не планировал ничего (сложно это), а исполь...

спасибо, я почитаю. скорее всего придётся свой велосипед изобретать всё равно, хаха. а то там не так просто, что сообщения можно отправлять n сообщений за секунду, там чуть больше правил

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта