Masstransit, это свободно распространяемый инструмент для .NET, который позволяет разработчикам использовать service bus архитектуры. С помощью Masstransit можно реализовать удаленный вызов процедур (RPC), что бывает полезно в ситуациях, когда нам нужно передать сообщение от одного приложения к другому и ожидаем в ответное сообщение. Вот простой пример того, как это можно сделать. 1. Определите интерфейс для запроса и ответа: ```csharp public interface ISimpleRequest { string CustomerId { get; } } public interface ISimpleResponse { string CustomerName { get; } bool Success { get; } } ``` 2. Создайте обработчик сообщений для обработки запросов: ```csharp public class SimpleRequestConsumer : IConsumer<ISimpleRequest> { public Task Consume(ConsumeContext<ISimpleRequest> context) { // Например, здесь мы просто возвращаем имя клиента на основе идентификатора клиента из запроса context.Respond<ISimpleResponse>(new {CustomerName = "John Doe", Success = true}); } } ``` 3. Сконфигурируйте Masstransit: ```csharp var bus = Bus.Factory.CreateUsingRabbitMq(sbc => { var host = sbc.Host(new Uri("rabbitmq://localhost/"), h =>{}); sbc.ReceiveEndpoint(host, "request_queue", ep => { ep.Consumer<SimpleRequestConsumer>(); }); }); ``` 4. Запустите bus: ```csharp bus.Start(); ``` 5. Отправьте запрос и ожидайте ответ: ```csharp var response = await bus.Request<ISimpleRequest, ISimpleResponse>(new { CustomerId = "123" }); ``` В этом примере мы создали простой запрос `ISimpleRequest` и ожидаемый ответ `ISimpleResponse`. Зарегистрировали consumer и конфигурировали Masstransit для использования RabbitMq. Наконец, мы отправили запрос и получили ответ.
MassTransit для запросов (через IRequestClient) создает временную очередь, которая привязывается к тому же обменнику, используемому для внутренних нужд. Обратите внимание, что очередь "exp" обычно существует в течение 60000 миллисекунд (1 минуты). Это нормальное поведение, так как MassTransit использует этот механизм для различения запросов от разных производителей. При публикации (publish) также создаются две очереди, например, Producer -> MyEntity (Exchange) -> MyEntityQueue (Exchange) -> MyEntityQueue (Queue) -> Consumer. Я не помню точно, что именно вызывает такое поведение, но в репозитории MassTransit утверждают, что это абсолютно нормальное поведение (я также задавал этот вопрос). UPD: Вопрос был решен через Telegram, ошибка заключалась в том, что человек создал два разных запроса с одинаковой структурой, поэтому consumer не мог обработать запрос, так как не совпадал пространство имен.