все на разных машинах. Для примера, есть обычный чат, в нем два примитива: пользователь и комната, к комнате подключаются пользователи, и если кто-то пищет сообщение то оно рассылается всем в этой комнате. Все работает логично когда все комнаты в одном процессе, и состояние комнаты (все подключения, доп информация какая-то, не суть) находится в одной памяти, можно просто взять и разослать всем. А что делать если пользователи подключатся к разным процессам? Тогда комната будет разбита на несколько процессов и получается как-то больно.
Мне в голову пришло два варианта:
1) сделать это все дело на pub/sub системе типо redis. От Aws и Google тоже что-то было. Получается что-то вроде системы где сама комната как факт не хранится, просто сущность поддерживающая пользователя подписывается на входящие сообщения и ловит их как они публикуются, но есть одно НО . Вроде как система все равно остается централизованной опираясь на pub/sub сервер, который распаралелить скорее всего тоже будет больно.
2) прикрутить балансировщик нагрузки и в итоге получится таже однпроцессная система где мы храним комнату только в одном процессе и вместе с ней все подключения, а сами комнаты могут быть раскиданы где угодно
========================
Может есть еще какие-то варианты, подскажите школяру)
Ну или дайте совет по поводу имеющихся вариантов, подкиньте возможные сервисы или как это лучше реализовать.
Асинхроно можно сделать если отмечать каждого пользователя которому отправлялось сообщение. И асинхроный скрипт будет обращаться к этой записи перед проведением отправки. Лучше записать туда время. Что бы при отсутствии подтверждения о получении сообщения спустя некоторое время попытка отправки повторилась. Возможно для подобного есть библитека.
зочем? есть джаббер
Обсуждают сегодня