如何在.Net中使用不同类型的消费者使用RabbitMq消息?

时间:2015-03-22 04:22:01

标签: c# .net rabbitmq masstransit

MessageType:“PublishX”

消费者:

Type1ConsumerX

Type2ConsumerX

Type3ConsumerX

所有消费者必须立即捕捉消息,但在他们自己内部同步消费..

例如,队列中有100条“PublishX”消息。 Type1ConsumerX消耗30条消息(同步),Type2ConsumerX消耗50条消息(同步),Type3ConsumerX消耗100条消息(同步)。 我怎么知道“所有类型的消费者”消费消息

  • RabbitMQ / MassTransit PUSH 消息可以发送给消费者吗?

  • RabbitMQ / MassTransit能否以间隔(1s)推送消息(合并它们)以减少网络流量?

  • RabbitMQ / MassTransit可以将相同的消息推送给不同类型的消费者吗?

2 个答案:

答案 0 :(得分:1)

如果我已正确理解了这个问题,您只需要设置一个基本的pub/sub模式。这将允许您向多个消费者传递相同的消息。

示例发布商:

public static void PublishMessageToFanout()
{
    var factory = new ConnectionFactory { HostName = "localhost" };

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        channel.ExchangeDeclare("messages", "fanout");

        var message = new Message { Text = "This is a message to send" };

        var json = JsonConvert.SerializeObject(message);
        var body = Encoding.UTF8.GetBytes(json);

        channel.BasicPublish("messages", string.Empty, null, body);
    }
}

消费者示例:

SubscribeToMessages("sms-messages", (s) => Console.WriteLine("SMS Message: {0}", s));
SubscribeToMessages("email-messages", (s) => Console.WriteLine("Email Message: {0}", s));

public static void SubscribeToMessages(string queueName, Action<string> messageAction)
{
    var factory = new ConnectionFactory() { HostName = "localhost" };

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        channel.ExchangeDeclare("messages", "fanout");
        channel.QueueDeclare(queueName, true, false, false, null);
        channel.QueueBind(queueName, "messages", string.Empty);

        var consumer = new QueueingBasicConsumer(channel);

        channel.BasicConsume(queueName, true, consumer);

        while (true)
        {
            var ea = consumer.Queue.Dequeue();

            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            messageAction(message);
        }
    }
}

如果您在单独的进程或控制台应用中运行SubscribeToMessages循环,您会看到他们在您调用PublishMessageToFanout时都会打印出该消息。您还会看到队列中的RabbitMQ Management中存在两个队列。

答案 1 :(得分:1)

关于问题的MassTransit部分

  1. RabbitMQ / MassTransit向消费者发送PUSH消息? 是的,MassTransit将消息发布到总线,然后消费者处理它们

  2. RabbitMQ / MassTransit能否以间隔(1s)推送消息(合并它们)以减少网络流量? 不知道是否有这方面的功能,你可以写自己的,但你必须非常小心丢失消息。

  3. RabbitMQ / MassTransit可以将相同的消息推送给不同类型的消费者吗? 是的,多个消费者可以使用相同类型的消息。

  4. 我写了一个简单的hello world应用程序,显示基础知识 - http://nodogmablog.bryanhogan.net/2015/04/mass-transit-with-rabbitmq-hello-world/