为什么当使用MassTransit将消息发布到RabbitMQ时,发送到另一个端点并跳过?

kzipqqlq  于 2023-02-19  发布在  RabbitMQ
关注(0)|答案(3)|浏览(328)

下面是我的发布者应用程序(一个netcore API)的代码。

services.AddMassTransit(masstransit =>
        {
            masstransit.UsingRabbitMq((context, cfg) =>
            {
                cfg.Host(new Uri("rabbitmq://srv-docker-dev-01"), "/", h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });

                cfg.ReceiveEndpoint("implantacao", e =>
                {
                    e.ConfigureConsumeTopology = false;
                    e.Bind<ClienteAlteradoEvento>();
                });
            });
        });

甚至在创建消费者之前,我的RabbitMQ就显示了一个跳过的队列。

并且消息被传递到这个__跳过。
有人能告诉我我做错了什么吗?
以下是几点:

  • 我的消费者将无法访问我的生产者的事件类。
  • 我将有2个队列必须使用我的API。我可能会配置另一个接收端点。
  • 我想我应该为每个微服务只创建一个交换。比如,所有由商业微服务发布的事件,应该使用相同的交换,但大众运输为每个类型创建一个交换。对吗?

任何想法和想法,将是受欢迎的。我只是了解RabbitMQ。
编辑
微服务A:拥有端点来接收客户的用户输入数据。用户发送姓名、合同和其他任何数据(许多不同类型的数据可以在不同的端点上更改)。每次更新客户时,此API也应发布消息来更新其他微服务。假设我们至少有3个不同的事件:客户数据更新事件、客户地址更新事件、客户合同更新事件。
微服务B:要使用由微服务A发布的来自客户的更新。我们无权访问CustomerDataUpdatedEvent、CustomerAddressUpdatedEvent、CustomerContractsUpdatedEvent类。我们应在其端生成类类型。
微服务C:要使用由微服务A发布的来自客户的更新。我们无权访问CustomerDataUpdatedEvent、CustomerAddressUpdatedEvent、CustomerContractsUpdatedEvent类。我们应在其端生成类类型。
B和C都不能访问微服务A上的类类型。
可能吗?有道理吗?
谢谢

cbjzeqam

cbjzeqam1#

您正在配置一个没有任何使用者的接收端点,因此所生成的任何到达队列的消息都将被复制到_skipped队列。
我建议使用reading some documentation来了解消息、使用者和端点是如何配置的。
我不建议对服务中的所有消息使用单个交换(甚至单个队列),但由于您刚刚开始学习,所以我真的不知道在没有细节的情况下还有什么建议。

au9on6nz

au9on6nz2#

Chris Patterson不推荐使用here,您可以使用RabbitMQ.Client,但这并非不可能。在本文档中,有两种方法可以更好地理解:

  • 使用ISendEndpoint Send<T>(...)
var endpoint = await busControl.GetSendEndpoint(new Uri("exchange:my-exchange"));
     await endpoint.Send(new {});
  • 使用IBus Publish<T>(...)
var bus = Bus.Factory.CreateUsingRabbitMq((cfgBus) =>
     {
         cfgBus.Host(host: eventbusoptions.Host);

         // Remove default wrapper message
         cfgBus.ClearSerialization();
         cfgBus.UseRawJsonSerializer();

         // Set exchange name
         cfgBus.Message<SubmitOrder>(top =>
         {
             top.SetEntityName(eventbusoptions.ExchangeName);
         });

         // Configurations per Publish
         cfgBus.Publish<SubmitOrder>(top =>
         {
             top.ExchangeType = eventbusoptions.ExchangeType;
             top.Durable = false;

             top.BindQueue(eventbusoptions.ExchangeName, eventbusoptions.QueueName, bind =>
             {
                 bind.RoutingKey = eventbusoptions.RoutingKey;
                 bind.ExchangeType = eventbusoptions.ExchangeType;
                 bind.Durable = false;
             });
         });
     });

     await _bus.Publish<SubmitOrder>(order, context => context.SetRoutingKey(_eventBusOptions.RoutingKey));
lfapxunr

lfapxunr3#

我刚刚意识到MassTransit并不是我现在想要的。我读到过RabbitMQ,人们告诉我MassTransit应该是一个不错的方法,但我不同意。也许对于某些场景来说,它是完美的,但当你不能在两个项目上使用相同的类型时,这是一个痛苦。“交换必须是类型”不够灵活。
我的问题是克里斯给出的答案。但是弥撒不会做我想要的。他的答案是正确的,顺便说一句。

相关问题