Как реализовать удаленный вызов процедур (RPC) с использованием Masstransit?

  • 10 августа 2023 г. 4:22
Ответы на вопрос 2
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 не мог обработать запрос, так как не совпадал пространство имен.
Похожие вопросы