Структура RabbitMQ для обмена личными сообщениями

В настоящее время я ищу создание службы обмена сообщениями, где пользователи могут отправлять и получать сообщения в частном порядке между собой. У меня может быть потребность в многопользовательском чате, но по большей части я хочу, чтобы только отдельные получатели могли читать отправленные им сообщения.

Глядя на RabbitMQ, имеет ли смысл использовать один обмен и создавать очередь для каждого пользователя при входе в систему и уничтожать каждую очередь при выходе из системы? Существуют ли серьезные проблемы с производительностью при создании очереди для каждого пользователя или есть лучшие альтернативы?

Я создаю REST API и планирую, чтобы пользователи отправляли сообщения другим через конечную точку (/send) и подписывались на свои собственные потоки сообщений через веб-сокеты или что-то подобное. Я, вероятно, также буду хранить сообщения в MongoDB, чтобы пользователи могли получить доступ ко всем своим предыдущим сообщениям. Приветствуются любые предложения по структуре.


person Jacob    schedule 27.07.2015    source источник


Ответы (1)


Я думаю, что ваш подход правильный. Вам не нужен обмен, если вы будете использовать обмен по умолчанию (по умолчанию AMQP). И во время входа в систему создайте новую очередь и оставьте имя очереди таким же, как имя пользователя. (Просто нужно убедиться, что имена пользователей уникальны). И если вы публикуете сообщение в обмене по умолчанию с именем пользователя (то есть: именем очереди) в качестве ключа маршрутизации, RbbitMQ направит это сообщение только в эту очередь. И при выходе из системы, если вы удалите очередь, пользователь будет пропускать сообщения, когда он не в сети. Если все в порядке, создайте очередь после входа в систему и используйте эксклюзивную конфигурацию, в которой говорится, что очередь удаляется, когда нет потребителя. Но если вы хотите сохранить автономные сообщения, вам необходимо постоянно создавать очередь во время регистрации пользователя.

person Manmay    schedule 28.07.2015
comment
Спасибо за предложения. Я хочу архивировать все сообщения, а также отправлять им любые сообщения, которые пользователь мог пропустить, когда они снова в сети. Я планирую добавлять каждое сообщение в MongoDB, а затем отправлять в очередь. Целесообразно ли иметь тысячи, а может быть, гораздо больше очередей, постоянно создаваемых для пользователей, или мне следует попытаться обработать отправку пропущенных сообщений через Mongo? - person Jacob; 31.07.2015