如何通过MassTransit和RabbitMQ发送各种命令类型?

Moh*_*avi 6 c# masstransit rabbitmq microservices

我是使用消息代理的初学者.
我们有一个票务服务,有多个子服务.主管服务在Web API的帮助下获取请求,并将它们发送到子服务.
任何请求都有一个标头,用于检测命令类型(例如保留,退款,可用性等).我们使用json来序列化对象.
现在,如何通过MassTransit从发布者(如我们的主管系统)发送各种消息类型(不同的对象),消费者可以轻松地使用它?
通常,是否可以在MassTransit和rabbitMQ中发送各种消息类型?
每个消费者只有一个队列来处理收到的消息.

谢谢

更新

https://dotnetcodr.com/2016/08/02/messaging-with-rabbitmq-and-net-review-part-1-foundations-and-terminology/

我读过这篇帖子适合开始使用MassTransit进行消息传递,并没有看到在这些和其他资源上使用各种消息类型的任何示例:

我有多个命令,需要各种消息类型与它们一起发送,但在示例中只使用消息类型,如下所示:

寄件人

    private static void RunMassTransitPublisherWithRabbit()
    {
        string rabbitMqAddress = "rabbitmq://localhost:5672/Ticket";
        string rabbitMqQueue = "mycompany.domains.queues";
        Uri rabbitMqRootUri = new Uri(rabbitMqAddress);

        IBusControl rabbitBusControl = Bus.Factory.CreateUsingRabbitMq(rabbit =>
        {
            rabbit.Host(rabbitMqRootUri, settings =>
            {
                settings.Password("Kalcho^Milano");
                settings.Username("ticketadmin");
            });
        });

        Task<ISendEndpoint> sendEndpointTask = rabbitBusControl.GetSendEndpoint(new Uri(string.Concat(rabbitMqAddress, "/", rabbitMqQueue)));
        ISendEndpoint sendEndpoint = sendEndpointTask.Result;

        Task sendTask = sendEndpoint.Send<IRegisterCustomer>(new
        {
            Address = "New Street",
            Id = Guid.NewGuid(),
            Preferred = true,
            RegisteredUtc = DateTime.UtcNow,
            Name = "Nice people LTD",
            Type = 1,
            DefaultDiscount = 0
        });
        Console.ReadKey();
    }
Run Code Online (Sandbox Code Playgroud)

接收器

        private static void RunMassTransitReceiverWithRabbit()
    {
        IBusControl rabbitBusControl = Bus.Factory.CreateUsingRabbitMq(rabbit =>
        {
            IRabbitMqHost rabbitMqHost = rabbit.Host(new Uri("rabbitmq://localhost:5672/Ticket"), settings =>
            {
                settings.Password("Kalcho^Milano");
                settings.Username("ticketadmin");
            });

            rabbit.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.queues", conf =>
            {
                conf.Consumer<RegisterCustomerConsumer>();
            });
        });

        rabbitBusControl.Start();
        Console.ReadKey();

        rabbitBusControl.Stop();
    }
Run Code Online (Sandbox Code Playgroud)

IRegisterCustomer是一个接口,我只能获取消息内容 rabbit.ReceiveEndpoint并转换为可用对象.

现在,如何使用各种消息类型,例如IReserveTicket,IRefundTicketIGetAvailability发送和接收消息?

再次感谢

Ale*_*rev 9

如果您向端点添加更多使用者,请执行此操作

rabbit.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.queues", conf =>
{
    conf.Consumer<RegisterCustomerConsumer>();
    conf.Consumer<ReserveTicketConsumer>();
    conf.Consumer<RefundTicketConsumer>();
});
Run Code Online (Sandbox Code Playgroud)

并发送消息

await endpoint.Send<IReserveTicket>(new { TickedId = 123 });
Run Code Online (Sandbox Code Playgroud)

它会起作用.

上面的解决方案假设您没有负载,特别是不等负载,您可以获得一种类型的数百万条消息,并且可能有数百种其他类型.将所有这些都放在一个端点中会产生消费不平衡,因为所有这些消费者只有一个队列.在这种情况下,没有什么能阻止您根据需要定义尽可能多的端点,每个端点都应该有一个单独的队列.例如:

cfg.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.lowvolume", 
    c =>
    {
        c.Consumer<RegisterCustomerConsumer>();
        c.Consumer<RefundTicketConsumer>();
    });
cfg.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.highvolume", 
    c => c.Consumer<ReserveTicketConsumer>();
Run Code Online (Sandbox Code Playgroud)

请记住,由于您有不同的队列,您需要使用这些地址来获取发送端点.