Пример более сложного приложения с очередями и биржами ...
sergei v.2 09.09 12:27
Я сформулирую задачу пока без кода ...
Например мы хотим сделать условный "телеграмм 2.0"
Есть пользователи в приложении чата (веб-версия или андроид приложение). Этих пользователей допустим 1 млн. И они все переписываются в групповых чатах.
Каждый из них подключаеся свои клиентом к websocket-серверу. Если бы wss был один, то всё было бы просто, но один сервер не может держать бесконечное количество одновременных подключений. Поэтому у нас много wss - каждый допустим обслуживает 10000 пользоватлей. На 1 млн пользоватлей у нас их 100 штук. И каждый wss слушает свою очередь в ребите.
Допустим в одном чате сидит 4 пользователя (и каждый из них сидит ещё одновременно в 150 чатах - ждет оттуда входящие сообщения в реалтайме, поэтому нельзя собрать участников одного чата в одном сокете или очереди -- у каждого было бы по 150 сокетов вместо одного). Поэтому первые два подключились к wss1, третий к wss15, а четвертый к wss99 -- подключение произвольное от загрузки серверов например на момоент подключения (спрашивает куда мне подключаться, ему говорят адрес - подключился, работай).
Один из них пишет сообщение в этот чат и постит его на сервер (через апи или через тот же wss не важно). Сервер пишет его в базу и должен разослать остальным трем. Для этого он может распихать его в нужные очереди (но там есть нюанс - надо постоянно отслеживать кто из участников чата на каком wss==очередь) или тупо запихнуть в биржу, которая отправит это сообщение сразу во все 100 очередей (может тоже не идеальное решение, но для иллюстрации примера в самый раз). Каждый wss выгребает из своей персональной очереди это сообщение, смотрит есть ли среди тех кто к нему подключился адресаты этого сообщения, если есть шлет им его через сокет, а если нет, просто выкидывает в мусорку.
Т.е. когда нам надо чтобы одно сообщение взяли несколько обработчиков, мы делаем биржу, биндим к ней очереди, и заряжаем задачу не в конкретные очереди, а в биржу. Биржа рассылает задачу по всем своим очередям (дублирует). А дальше по классике.
Есть биржа по умолчанию и если просто создать очередь, то она вяжется к этой бирже, но обычно задачи ставятся прямо в конкретную очередь, а не в эту их общую биржу.
И ещё ...
Писать на парсере сейчас wss не возможно - он сейчас не умеет поднимать и держать сокеты. Конечно наверное можно заморочиться и сделать сокеты в нем, как сделали http-сервер. Запускается, висит в бесконечном цикле или в consume и слушает порт. На порту создается постоянный сокет, туда прилетают запросы, он их обрабатывает. Или через эти сокеты он пуляет какие-то ответы/команды клиентам.
Сейчас это мы пишем на го или ноде. Наверное можно и парсер допрокачать.