Запросы не выполняются с тайм-аутом, почему?

#rabbitmq #masstransit

Вопрос:

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

Моя проблема в том, что каждый второй запрос завершается ошибкой с исключением TimeoutException. Выполните его один раз, в следующий раз он выйдет из строя, а затем снова заработает.

Потребитель даже не вызывается при сбое.

В чем может быть причина этого?

У меня есть другие сервисы, которые имеют схожее название в своих запросах и потребителях. Я попытался выяснить, в этом ли проблема.

Ответ №1:

Вы должны опубликовать код конфигурации своего приложения, используя клиент запроса и тот, который настраивает потребителя.

Если у вас есть другие потребители с тем же именем, скорее всего , они находятся в той же очереди, если вы используете ConfigureEndpoints , что может быть основной причиной проблемы.

Поскольку время ожидания каждого другого сообщения истекает, это имело бы смысл, поскольку RabbitMQ будет балансировать нагрузку в очереди между различными службами с одинаковым именем очереди.

Комментарии:

1. ОК. Потребители разных услуг имеют одно и то же имя. У них одни и те же очереди. Я могу подтвердить. Теперь я должен выяснить, как различать их по названиям. Услуги. AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); x.AddConsumers(тип(Программа). Сборка); x.UsingRabbitMq((контекст, cfg) => { cfg.ConfigureEndpoints(контекст); }); }); службы. AddMassTransitHostedService();

2. В конструкторе форматирования имен конечных точек есть опции для добавления пространства имен, если это поможет.

3. ОК. Возможно, в этом случае мне следует вместо этого попытаться дать моим запросам и уведомлениям уникальные имена, которые говорят о том, о чем они, — тогда у меня не возникнет конфликта. Я попробую это в первую очередь. Спасибо!

4. Вы определенно не должны использовать одни и те же типы сообщений для несвязанных потребителей. И всегда рекомендуется использовать различные названия потребителей и саг.

5. Да, теперь это имеет смысл. Моя теория, высказанная до того, как я задал этот вопрос, оказалась верной. И я исправил это, так что теперь это снова работает на практике. Все началось с того, что я скопировал проекты, и вы знаете… имена. Теперь у меня есть AddOrderItem* и AddCartItem* соответственно. Мой тестовый проект.