Я работаю в команде, разрабатывающей онлайн-игру на основе django в реальном времени. Мы разрабатываем компонент масштабируемости и сталкиваемся с логической проблемой для игрового процесса.
На каждом узле размещается уникальная «игра», в которой участвуют несколько пользователей. Мы будем развертывать за простым балансировщиком нагрузки (ELB), чтобы разделить запросы между нашими [N] хостами.
Из-за зависимости узла от игры я хотел бы включить часть промежуточного программного обеспечения, которое может искать и пересылать сеанс клиента, если запрошенная игра уже существует.
Рисунок 1: поиск/перенаправление нужных функций
0-3 можно легко реализовать, но нам не удалось найти реализацию пункта 4.
Предполагая, что мы запускаем этот код на node1 и обнаруживаем, что game6 находится на node3, мы хотим перенаправить запрос клиента на узел3 такой, что:
- node3 напрямую отвечает клиенту и устанавливает сеанс
- будущие запросы не должны проходить через балансировщик нагрузки
Я надеюсь, что есть решение, которое позволило бы нам сделать это, либо изменив заголовки HTTP (Forwarded-for и т. д.), либо повторно отправив сообщение, но, возможно, есть другой метод, о котором мы не подумали.
Другие мысли:
- Используйте DNS-имя для каждого узла (host.example.com), чтобы соответствующим образом перенаправить запрос клиента. (требуется установка и заранее известное количество хостов)
- Использовать исходный node1 в качестве прокси (сделать независимый запрос к node3 и вернуть данные клиенту) (Дорого, так как при масштабировании вероятность оказаться на нужном хосте изначально снижается )