Можем ли мы использовать RabbitMQ и Mediatr вместе с помощью masstransit?

Я создал микросервисное приложение, в котором микросервисы используют MassTransit и RabbitMQ для связи.
Каждый микросервис разработан с использованием чистой архитектуры, поэтому у нас есть MediatR внутри каждый микросервис.
Можно ли использовать MassTransit и для внутреннего общения? поэтому я могу использовать одну и ту же подпись для всех сервисов, и когда я хочу предоставить сервис для использования между микросервисами, это будет легко сделать. Итак, MediatR используется для внутренней коммуникации, а RabbitMQ - для взаимодействия, и вся вселенная находится в системе MassTransit.
[Обновление] Мой вопрос в том, как мы можем настроить потребителей, чтобы некоторые из них можно было использовать для внутренняя связь (через MediatR), а некоторые могут использоваться для внешней связи (через RabbitMQ) и легко изменять их изнутри на внешнюю.
[Update2] например, вот моя регистрация на MassTransit:

services.AddMassTransit(x =>
        {
            x.AddConsumers(Assembly.GetExecutingAssembly());

            x.AddBus(provider =>
                Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(new Uri(config.RabbitMQ.Address), h =>
                    {
                        h.Username(config.RabbitMQ.Username);
                        h.Password(config.RabbitMQ.Password);
                    });

                    cfg.ReceiveEndpoint("my-queue", ep => { ep.ConfigureConsumers(provider); });
                }));


            x.AddMediator((provider, cfg) => { cfg.ConfigureConsumers(provider); });
        });

Чем я могу отличаться во внутреннем общении и внешнем общении? другими словами, как я могу зарегистрировать некоторых потребителей в MediatR, а некоторых в RabbitMQ?


person Mahdi    schedule 29.05.2020    source источник
comment
В зависимости от вашего обновления вам нужно будет использовать посредник MassTransit, чтобы иметь единый интерфейс для потребителей, который можно было бы переместить либо на конечные точки посредника, либо на RabbitMQ.   -  person Chris Patterson    schedule 31.05.2020


Ответы (2)


Их можно использовать вместе, и MassTransit также имеет собственную реализацию посредника, поэтому вы можете написать свои обработчики один раз и использовать их либо через посредник, либо через надежный транспорт, такой как RabbitMQ.

Доступны видео, в которых вы познакомитесь с возможностями, начиная с посредника и заканчивая RabbitMQ. .

person Chris Patterson    schedule 29.05.2020
comment
Спасибо за ваш комментарий. На самом деле я знаю, что можно использовать и то, и другое. Я хочу знать, как мы можем настроить потребителей, которые некоторые использовали для внутренней связи (через MediatR), а некоторые - для внешней связи (через RabbitMQ). - person Mahdi; 30.05.2020
comment
можем ли мы использовать основную библиотеку mediatR с общественным транспортом? @Крис - person mohammadmahdi Talachi; 18.01.2021
comment
Конечно? Я не использовал MediatR, поэтому понятия не имею, как он работает, но полагаю, что их можно использовать в одном проекте. Однако они не интегрированы для совместной работы. - person Chris Patterson; 18.01.2021

Я обнаружил, что мне нужно создать отдельную шину для каждого. тогда внешние службы наследуются от интерфейса, такого как IExternalConsumer, поэтому я могу отделить их от внутренних и добавить их в соответствующую шину: ОБНОВЛЕНО для версии 7

        // find consumers
        var types = AssemblyTypeCache.FindTypes(new[]{Assembly.GetExecutingAssembly()},TypeMetadataCache.IsConsumerOrDefinition).GetAwaiter().GetResult();
        var consumers = types.FindTypes(TypeClassification.Concrete | TypeClassification.Closed).ToArray();
        var internals = new List<Type>();
        var externals = new List<Type>();
        foreach (Type type in consumers)
        {
            if (type.HasInterface<IExternalConsumer>())
                externals.Add(type);
            else
                internals.Add(type);
        }

        services.AddMediator(x =>
        {
            x.AddConsumers(internals.ToArray());
            x.ConfigureMediator((provider, cfg) => cfg.UseFluentValidation());
        });
        services.AddMassTransit<IExternalBus>(x =>
        {
            x.AddConsumers(externals.ToArray());
            x.AddBus(provider =>
                Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(new Uri(config.RabbitMQ.Address), h =>
                    {
                        h.Username(config.RabbitMQ.Username);
                        h.Password(config.RabbitMQ.Password);
                    });

                    cfg.ReceiveEndpoint(apiProviderName, ep => { ep.ConfigureConsumers(provider); });

                }));
        });

        services.AddMassTransitHostedService();
person Mahdi    schedule 04.06.2020
comment
Просто для обновления с v7 .AddMediator () и .AddMassTransit () можно настроить в одном контейнере без использования отдельной шины. - person Chris Patterson; 23.07.2020
comment
Я пытался использовать MassTransit.AspNetCore 7.0.3, но не могу сделать .AddMediator (). services.AddMassTransit (cfg = ›{cfg.AddConsumer ‹SubmitOrderConsumer› (); cfg.AddMediator (); //‹ - эта строка не работает. определение не найдено.}); - person Ceemah Four; 15.08.2020
comment
При таком подходе мне следует использовать интерфейсы MassTransit в своих контроллерах или в контроллерах MediatR? Можете ли вы поделиться каким-нибудь образцом решения? - person SzymonB; 17.12.2020