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

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

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

11 ответов

5 просмотров

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
А чем вам питонисты не угодили?😂
.
79
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
А дин типизация это хорошо или плохо?
Alexey
12
Исходники плюс документация? Вы гоните)) демок хватит всем
zamtmn
11
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
77
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Hello. Could you please help me with finding all coordinates within a radius using a spatial index, given that I have a table with coordinates? SET @lng = 37.57925; SET @lat ...
Rinchin G
7
Карта сайта