#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* соответственно. Мой тестовый проект.