Как создать программу - бот для ВК (диалог с сообществом) чтобы бот мог отвечать на FAQ, но суть в том что аудитория сообщества 7,8кк человек. Что нужно чтобы создать бота и чтобы он отвечал большому количеству человек одновременно. Сервера... Как вы наверное поняли... в этом я полный чайник)
минимизировать число вызовов API ВКонтакте. Для ответа 1 пользователю нужно а) пометить прочитанным входящее сообщение и б) отправить ответ. Это 2 вызова API. До 25 вызовов API можно упаковать в один execute() – так получится отвечать 12 пользователям за 1 вызов execute() и при лимите в 3 вызова в секунду – 36 пользователям в секунду.
следить за кол-вом вызовов в секунду и не превышать этот лимит: где-то, например, в Redis, держать времена трёх последних вызовов к API. При желании выполнить очередной доставать эти времена и принимать решение: выполнять сразу или подождать N миллисекунд.
очередь – сообщения обрабатывать не мгновенно при получении сигнала от callback api, а помещать их в очередь. Рабочий процесс берёт из очереди задачи и выполняет – группирует в пачки по 24 и отправляет – с учётом времени предыдущих трёх овтетов.
При такой организации вам хватит одного слабенького сервера и вы сможете приблизиться к теоретическому пределу в 36 сообщений в секунду.
как это устроить?
Рабочий же получает по сути только по одному запросу за раз. Плюс проблема, что если сейчас простой и очередь пустует 15 секунд (в ней только 1 сообщение), например, не будет же пользователь ждать эти 15 секунд ответа, пока наберется 24 сообщения
Например, рабочий процесс, запустившись с одним заданием должен попытаться вытащить из очереди ещё до 23 заданий. Так, если задания накопились, будут выполняться с максимальной скоростью. Если их нет – выполнится только это одно, без ожидания.
goga_x, можно, но имхо это оверкилл - ставить отдельный Gearman. Он больше для распределенных "больших" систем.
Почему бы просто не пихать очередное задание в базу данных или Redis или что у вас там уже стоит? А отдельный постоянно-крутящийся процесс пусть ждёт, пока в там очереди появится очередное задание, за которое схватиться и выполнить.
Сергей Соколов, вы правы. Пытаюсь писать свой сервис, поэтому нуждаюсь в решении вопроса лимитов. Так как я новичок до конца не понимаю, например, создам worker для обработки задачи, также нашел инструмент с помощью которого можно запустить в фоне - Supervisor. Но я до конца не понимаю, как это все организовать.
Как при появлении новой задачи запускать worker?