我目前正在寻找一种消息传递服务,用户可以在彼此之间私下发送和接收消息。我可能需要多用户聊天,但在大多数情况下,我只希望单个收件人能够阅读发送给他们的邮件。
通过查看RabbitMQ,使用一个交换是否有意义,并为每个用户在登录时创建一个队列并在注销时销毁每个队列?为每个用户创建队列是否存在重大性能问题,还是有更好的替代方案?
我正在构建REST API并计划让用户通过端点(/ send)向其他人发送消息,并通过websockets或类似的东西订阅他们自己的消息流。我可能也会在MongoDB中存储消息,因此用户可以访问以前的所有消息。对结构的任何建议都表示赞赏。
答案 0 :(得分:1)
我认为你的方法是正确的。如果您将使用默认交换(AMQP默认),您的活动不需要交换。在登录期间,创建一个新队列并保持队列名称与用户名相同。 (只需要确保用户名是唯一的)如果您使用用户名(即:队列名称)将消息发布到默认交换机作为路由键,RbbitMQ将仅将该消息路由到该队列。如果您删除队列,那么在注销时,用户将在他不在线时错过这些消息。如果可以,则在登录后创建队列并使用配置独占,即当没有消费者时队列被删除。但是,如果您想保留离线消息,则需要在用户注册期间永久创建队列。