Структура RabbitMQ для личных сообщений
В настоящее время я ищу создание службы обмена сообщениями, где пользователи могут отправлять и получать сообщения конфиденциально между собой. Мне может потребоваться многопользовательский чат, но по большей части я хочу, чтобы только один получатель мог читать отправленные им сообщения.
Рассматривая RabbitMQ, имеет ли смысл использовать один обмен и создавать очередь для каждого пользователя, когда он входит в систему и уничтожает каждую очередь при выходе из системы? Существуют ли серьезные проблемы с производительностью при создании очереди для каждого пользователя или есть лучшие альтернативы?
Я создаю REST API и планирую, чтобы пользователи отправляли сообщения другим через конечную точку (/send) и подписывались на свои собственные потоки сообщений через веб-сокеты или что-то подобное. Я, вероятно, также буду хранить сообщения в MongoDB, чтобы пользователи могли получить доступ ко всем своим предыдущим сообщениям. Любые предложения по структуре приветствуются.
1 ответ
Я думаю, что ваш подход правильный. Вы не нуждаетесь в обмене, если вы будете использовать обмен по умолчанию (AMQP Default). И во время входа в систему создайте новую очередь и оставьте имя очереди таким же, как имя пользователя. (Просто нужно убедиться, что имена пользователей уникальны). И если вы опубликуете сообщение в обмене по умолчанию с именем пользователя (т.е. именем очереди) в качестве ключа маршрутизации, RbbitMQ направит это сообщение только в эту очередь. И при выходе из системы, если вы удалите очередь, тогда пользователь будет пропускать сообщения, когда он не в сети. Если все в порядке, тогда создайте очередь после входа в систему и используйте исключительную конфигурацию, которая говорит, что очередь удаляется, когда нет потребителя. Но если вы хотите оставить сообщения в автономном режиме, то вам нужно создать очередь постоянно при регистрации пользователя.