【问题标题】:RabbitMq Implementation PracticallyRabbitMq 实际实现
【发布时间】:2013-09-23 11:12:59
【问题描述】:
  1. 我正在研究 rabbitmq,我对某些点感到困惑,例如。 我刚刚实现了一个来自互联网的示例,它创建了一个队列然后它获取 来自该队列的消息,从而将其显示在网页上。 现在我的问题是:: 假设我的服务器安装了 RabbitmQ,并且多个用户正在访问我所在的网站 已经实现了rabbitmq。现在,第一个用户发送了一条消息,但是它将向谁发送这条消息? 致所有将打开页面的用户,因为代码对于发送的消息和名称是通用的 队列的数量也将相同。

  2. 假设,第一个用户在队列“Queue1”上发送一条消息“Hello” 现在,另一个用户在同一个队列上发送另一个消息 =“Hello World” 还有一个用户在同一个队列上发送了一条消息=“Hello Worl World”。 现在第 n 个用户单击接收消息,那么将向他显示哪条消息? 第一个,第二个还是第三个?

  3. 这意味着我们的应用程序将始终只有一个队列?

有人可以指导我吗?我很困惑......

我将在下面粘贴我将用于我的网站的代码示例

//For sending the messge
  protected void btnSendMail_Click(object sender, EventArgs e)
    {
        try
        {
            var factory = new ConnectionFactory();
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    //  ConnectionFactory factory = new ConnectionFactory() { HostName = "localhost" };
                    // // factory.UserName = txtUserEmail.Text.ToString();
                    ////  factory.Password = "password";
                    //  factory.VirtualHost = "/";
                    //  factory.Protocol = Protocols.FromEnvironment();
                    //  factory.HostName = "localhost";
                    //  factory.Port = AmqpTcpEndpoint.UseDefaultPort;
                    //  IConnection conn = factory.CreateConnection();
                    //  using (var channel = conn.CreateModel())
                    //  {
                    //      channel.QueueDeclare("hello", false, false, false, null);
                    //      string message = "Hello World!";
                    //      var body = Encoding.UTF8.GetBytes(txtUserEmail.Text.ToString());
                    //      channel.BasicPublish("", "hello", null, body);
                    //      conn.Close();
                    //  }
                    //Sending Message
                    channel.QueueDeclare("hello1", false, false, false, null);

                    string message = txtUserEmail.Text.ToString();
                    var body = Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish("", "hello1", null, body);
                    //Console.WriteLine(" [x] Sent {0}", message);
                    //Console.ReadLine();
                    Label1.Text = Encoding.Default.GetString(body);
                }
            }

        }
        catch
        {
        }
    }


//For receiving the message.
 protected void btnReceive_Click(object sender, EventArgs e)
    {
        try
        {
            //var factory = new ConnectionFactory() { HostName = "localhost" };
            //using (var connection = factory.CreateConnection())
            //{
            //    using (var channel = connection.CreateModel())
            //    {

            //        channel.QueueDeclare("hello", false, false, false, null);
            //        BasicGetResult result = channel.BasicGet("hello", false);
            //        var consumer = new QueueingBasicConsumer(channel);
            //        channel.BasicConsume("hello", true, consumer);
            //        Console.WriteLine(" [*] Waiting for messages." +
            //                                 "To exit press CTRL+C");
            //        while (true)
            //        {

            //            var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

            //            var body = ea.Body;
            //            var message = Encoding.UTF8.GetString(body);
            //            Console.WriteLine(" [x] Received {0}", message);
            //            Label1.Text = message.ToString();
            //        }
            //    }
            //}
            var factory = new ConnectionFactory();
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    bool noAck = false;
                    BasicGetResult result = channel.BasicGet("hello1", noAck);
                    if (result == null)
                    {

                    }
                    else
                    {
                        IBasicProperties props = result.BasicProperties;
                        byte[] Body = result.Body;
                        Label1.Text = Encoding.Default.GetString(Body);

                    }
                }
            }


        }
        catch
        {
        }
    }

【问题讨论】:

  • 我对这个问题不是很清楚。您正在解决哪个示例 RabbitMQ 问题? RabbitMQ 提供消息传递,您提供应用程序。
  • 先生,我的问题很简单。我有一个网站,我正在其中实施rabbitMq。如您所知,该站点用于发送和接收消息。为此,它创建一个队列并在其中存储一条消息,并在接收消息时使用相同的队列。现在,假设该网站的第一个用户发送一条消息,一个队列保存该消息,现在另一个用户发送一条消息,现在会发生什么.我应该创建一个不同的队列还是相同的队列可以存储它。我使用了相同的队列,但在接收时我只收到第一条消息,而不是第二个用户发送的消息。
  • 这真的取决于你如何设置 RabbitMQ。是的,您可以使用单个队列并处理多条消息。但是你遗漏了很多信息。您使用的是直接、扇出还是主题交换?你的队列是如何配置的?如果您显示您的实际代码(在问题中)也许我们可以提供帮助:)
  • 通过将 noAck 设置为 false,您还没有确认收到消息。尝试将 noAck 设置为 true。
  • @Sandy 以便我们为您的问题提供更好的答案,我们需要从架构的角度了解您的系统正在尝试完成什么。然后我们可以建议如何最好地布置它。说“它需要为多个用户工作”是没有帮助的。我建议您重新编写您的问题并告诉我们您正在构建的系统。

标签: c# asp.net .net asp.net-mvc rabbitmq


【解决方案1】:

如果您使用 RabbitMQ 创建消息系统,您可能应该将消息发布到交换器,然后为站点的每个用户附加一个队列到交换器。然后让交换将消息路由到正确的用户/用户队列。

您需要更好地了解与使用 RabbitMQ 相关的消息传递模式

这些教程将是最相关的

发布/订阅 http://www.rabbitmq.com/tutorials/tutorial-three-python.html

路由 http://www.rabbitmq.com/tutorials/tutorial-four-python.html

如果您需要,这些教程也可以在 c# 中获得。

【讨论】:

  • 先生,请更详细地给出您的回答。因为这对我这个初学者来说是不够的
猜你喜欢
  • 2013-01-13
  • 2016-10-04
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多