Реализация кластерного чата на основе очереди
Я работаю над реализацией чата. Идея очень проста, есть карта, где ключи - это userNames, а значения - это очередь сообщений, которые должны быть доставлены пользователю.
Эта карта представленаConcurrentHashMap<String, <ConcurrentLinkedQueue<Message>>>
Когда приходит новое сообщение для пользователя, оно записывается на эту карту, и каждый пользователь получает свои сообщения из очереди, используя простой пул http. Этот подход работает отлично.
Теперь мне нужно реализовать аналогичные функции в кластере. Для репликации кеша я использую кеш jboss. Сейчас репликация кеша работает синхронно. Это означает, что запись в локальный узел для кэширования не будет выполняться до записи в другие узлы.
В основном интерфейс кеша похож на карту с методами put и get.
Прямо сейчас я бы повторил всю очередь. Когда пришло новое сообщение, я получаю очередь из карты, добавляю новое сообщение в очередь и "ставлю" (переписываю) новую очередь на все узлы.
Когда от пользователя поступает запрос на получение новых сообщений для клонирования текущей очереди, сделайте очередь, связанную с этим пользователем, пустой на всех узлах и доставьте сообщения пользователю из клонированной очереди.
Я чувствую, что есть много случаев, когда что-то может пойти не так. Например, я поместил сообщение в очередь на узле A, репликация очереди началась, и прямо сейчас на другом узле B пользователь извлекает сообщения из очереди, делая очередь пустой. И позже репликация очереди из узла A закончилась, и узел B снова получил уже доставленные сообщения. Пользователь получает одни и те же сообщения дважды
Каков общий подход для реализации этой подпрограммы обмена сообщениями в кластере?
1 ответ
Короче, обмен сообщениями. Вы можете свернуть свой собственный на основе JMS или использовать Enterprise Service Bus.