Я ищу способ спроектировать свою систему, состоящую из нескольких издателей, нескольких каналов и нескольких подписчиков, всех из которых можно легко однозначно идентифицировать. Мне нужно отправлять сообщения в обоих направлениях с минимальной задержкой. Однако, если подписчик умирает, сообщения, на которые он подписался, не следует отбрасывать, когда он возвращается в сеть, он должен получить все ожидающие сообщения. Поскольку я обрабатываю очень большое количество сообщений (до 1000 в секунду происходит на регулярной основе), имея сервер с низкими характеристиками, это означает, что постоянное хранение списков всех сообщений не является вариантом.
Я рассматривал возможность использования счетчика / списка ссылок для сообщений. Когда сообщение публикуется, оно инициализируется списком подписчиков на этот конкретный канал, когда подписчик получает сообщение, подписчик удаляется из списка. Сообщение удаляется, если список пуст.
Теперь, если подписчик умирает, не отписавшись от подписки, сообщения не будут удалены, потому что список отсутствующих подписчиков не пуст. Когда он вернется в оперативный режим, он сможет получить список всех ожидающих сообщений, поскольку он идентифицируется с тем же идентификатором, что и мертвый экземпляр.
Возможно, потребуется тайм-аут сообщений / подписчиков, например, если подписчик был неактивен в течение 10 минут, все записи списка, содержащие его, будут очищены.
Это хорошая идея, не забыл ли я о проблемах, которые могут возникнуть, в частности, с этой системой? Есть ли какая-нибудь система, которая уже это делает? RabbitMQ и подобные системы PubSub, похоже, не имеют этого - если нет, я думаю, Redis - это путь?