Я создаю приложение, которое принимает входные данные через веб-узел, который должен быть передан другим клиентам, которые могут быть подключены к другим внешним серверам.Горизонтальное масштабирование приложения, которое разделяет входные данные между серверами
Для простоты представьте себе многопользовательский многоязычный чат-приложение. Получение ввода, направленного к правильному соединению, не является проблемой, так это обмен сообщениями между серверами и возможность масштабирования и сохранение задержки сообщений.
Прямо сейчас у меня есть брокерский процесс, к которому подключается каждый интерфейс, затем подписываются на очередь за все, о чем могут потребоваться его связи. Это делается для вырезания сообщений от брокера, которые никогда не будут использоваться интерфейсом. Тем не менее, я все еще получаю от 75% до 85% сообщений, отправляемых обратно каждому интерфейсу от брокера.
В поездке я выполняю проверку сообщений, разбор и любую другую бизнес-логику. Во время поездки я перебираю локальный массив для подписки и отправляю сообщение каждому подписанному соединению.
Пример: если я получаю 10 сообщений на 11 интерфейсных серверах, это что-то (110 сообщений - 10 сообщений обрабатываются локально и не отправляются обратно брокером) * 0.75 оптимистичный уровень подписки = 75 сообщений, отправляемых обратно для каждого сервера. Таким образом, у нас есть 10 локальных + 75 брокеров = 85 сообщений, обрабатываемых на этот отрезок времени каждым сервером.
Теперь у меня не было бы 11 интерфейсных серверов за 100 мс/с, возможно, два, но сообщения, отправляемые обратно на каждый внешний сервер по процессу брокера, как бы взорвали больше сообщений, которые я получаю через дополнительные интерфейсные серверы.
Брокерский процесс - это небольшое приложение node.js, которое ведет переговоры с RabbitMQ и PostgreSQL. Интерфейсные серверы также являются приложениями node.js.
Что я могу делать или должен ли я делать по-другому, чтобы поддерживать латентность в периоды высокой громкости?
Обновление для ответа на комментарий пользователя: Хотя я ожидаю много перекрытия между очередями, соединение приведет к тому, что их внешний сервер будет подписаться, я не ожидаю, что он будет 100% для каждого сервера. Худший случай - каждый сервер интерфейса должен подписываться на каждую очередь на брокере, получая 100% сообщений от брокера. Оптимистично, только около 75% сообщений действительно нужно будет отправить обратно на какой-либо конкретный внешний сервер.
Второе обновление для itaifrenkel: Возможно, что сообщение, отправленное двумя пользователями, может быть возвращено в разных заказах. Это было бы приемлемо только в том случае, если латентность была очень низкой, и это происходит только при очень близких друг к другу сообщениях. Если бы это происходило с разовыми сообщениями, я бы сказал, что у нас есть проблема с задержкой и масштабированием.
Существует случай, когда нам нужно будет отобразить историю, но я оставил ее, потому что я чувствовал, что это выходит за рамки вопроса.
Вы говорите, что накладные расходы составляют 75% независимо от используемого сообщения или нет. Тогда почему вы используете такую оптимистичную подписку. Если это не будет строго на основе использования. Как вы решаете подписаться или нет. – user568109
Если чат переполнен, верно ли, что два пользователя в одной комнате чата видят два сообщения в другом порядке? – itaifrenkel
Когда пользователь входит в чат-комнату, будет ли какая-либо польза в предоставлении исторических сообщений до входа пользователя в систему. – itaifrenkel