Реализация кластерного чата на основе Queue

Я работаю над реализацией чата. Идея очень проста, есть карта, где ключи - это имена пользователей, а значения - это очередь сообщений, которые должны быть доставлены пользователю.

Эта карта представленаConcurrentHashMap<String, <ConcurrentLinkedQueue<Message>>>

Когда приходит новое сообщение для пользователя, оно записывается на эту карту, и каждый пользователь извлекает свои сообщения из очереди, используя простой http-пул. Этот подход отлично работает.

Теперь мне нужно реализовать аналогичную функциональность в кластере. Для репликации кеша я использую кеш jboss. Прямо сейчас репликация кеша работает синхронно. Это означает, что запись на локальном узле в кеш не будет выполняться до записи на другие узлы.

В основном интерфейс кеша похож на карту с методами put и get.

Прямо сейчас я бы воспроизвел всю очередь. Когда приходят новые сообщения, я получаю очередь с карты, добавляю новое сообщение в очередь и «ставлю» (переписываю) новую очередь на все узлы.

Когда от пользователя поступает запрос на получение новых сообщений для клонирования текущей очереди, сделать очередь, связанную с этим пользователем, пустой на всех узлах и доставить сообщения пользователю из клонированной очереди.

Я чувствую, что есть много случаев, когда что-то может пойти не так. Например, я помещаю сообщение в очередь на узле A, репликация очереди начинается, и прямо сейчас на другом узле B пользователь извлекает сообщения из очереди, делая очередь пустой. А позже репликация очереди с узла А закончилась и узел Б снова получил уже доставленные сообщения. Пользователь получает одни и те же сообщения дважды

Каков общий подход к реализации этой процедуры обработки сообщений в кластере?


person user12384512    schedule 05.10.2011    source источник


Ответы (1)


Короче, обмен сообщениями. Вы можете создать свою собственную на основе JMS или использовать Enterprise Service Bus.

person Paul Jackson    schedule 06.10.2011