Отправка сообщений от rabbitMq

Я использую rabbit-Mq в своем веб-приложении (Asp.net-MVC 4.0). Мое требование - отправить сообщение конкретному пользователю. Предположим, если пользователь 1 онлайн и он отправляет сообщение пользователю 2 по адресу rabbit-Mq. Он должен быть получен только "user2". Код, который я использовал, является шаблоном, который хранит сообщение в очереди, и всякий раз, когда пользователь нажимает на кнопку "Получить", он получает это сообщение, но в моем случае нет ограничений для конкретного пользователя. Любой может получить это сообщение, которое неверно, и я должен с этим справиться. Пожалуйста, помогите мне в этом.

Есть ли в Rabbit-Mq что-нибудь, что может отличить правильное сообщение от правильного пользователя / потребителя? Можем ли мы установить ключ с сообщением и проверить ключ при получении? Это возможно?

Ниже я пишу код, который я использую для отправки и получения сообщений

public ActionResult SendMessage(MessagingModel ObjModel)
        {        var factory = new ConnectionFactory() { HostName = "localhost" };
                using (var connection = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        Message = ObjModel.Message;
                        channel.QueueDeclare("MessageQueue", true, false, false, null);
                        var body = Encoding.UTF8.GetBytes(ObjModel.Message);
   channel.BasicPublish("", "MessageQueue", null, body);
}
}
}

   public JsonResult RecieveMessage()
        {
  var factory = new ConnectionFactory() { HostName = "localhost" };
                using (var connection = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        channel.QueueDeclare("MessageQueue", true, false, false, null);
                        bool noAck = true;
                        BasicGetResult result = channel.BasicGet("MessageQueue", noAck);
                        if (result == null)
                        {
                            Message = "No Messages Found.";
                        }
                        else
                        {
                            IBasicProperties props = result.BasicProperties;
                            byte[] Body = result.Body;
                            Message = Encoding.Default.GetString(Body);
                        }
                    }
                }

1 ответ

Во-первых, вы должны запомнить следующие вещи:

  • Все сообщения в RabbitMQ публикуются через биржи.
  • Очереди привязаны к биржам.
  • Событие, если вы публикуете сообщение непосредственно в очередь, фактически оно все равно проходит через обмен по умолчанию - (по умолчанию AMPQ).
  • Есть разные виды обменов. Вы можете прочитать немного об обменах здесь: https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html

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

Также вы можете добавить определенный заголовок к вашему сообщению:

var props = model.CreateBasicProperties();
props.Headers.Add("UserId", userId);

а затем в RecieveMessage() после чтения сообщения из очереди см. этот заголовок, а если сообщение предназначено для текущего пользователя - получите его и подтвердите это сообщение, в противном случае не подтвердите это сообщение.
Но это плохое решение. Я просто сохранял сообщения из очереди в базе данных, а затем считывал их, фильтруя по пользователю.

Другие вопросы по тегам