Реализация кластерного чата на основе очереди - PullRequest
0 голосов
/ 06 октября 2011

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

.

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 06 октября 2011

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

...