Я пытаюсь использовать темы служебной шины Azure, чтобы разрешить службам получать сообщения с помощью MassTransit. Сообщение отправляется в тему, и каждая служба, имеющая подписку на эту тему, получает копию сообщения. Каждому типу сообщения соответствует тема.
Проблема в том, как поступать с ошибками после обращения к источнику исключения. Как только сообщение выходит из строя и попадает в очередь _error, я хотел бы вернуть сообщение для обработки после исправления сообщения и / или службы. Я не могу переместить сообщение из очереди _error в тему, потому что каждая служба в этой теме снова получит сообщение.
Я попытался создать вторую очередь с помощью метода ReceiveEndpoint под названием _errorecovery, но это привело к тому, что очередь подписалась на тему, что означает, что очередь _errorrecovery получает каждое сообщение, опубликованное в этой теме.
Мне интересно, есть ли способ настроить очередь с помощью MassTransit, который будет обрабатывать только сообщения в этой очереди без добавления дополнительной подписки.
Вот мои текущие настройки для создания тем.
TEvent - это тип сообщения, а TConsumer - это связанная реализация IConsumer для этого типа сообщения.
public void ConfigureType<TEvent, TConsumer>(IServiceBusBusFactoryConfigurator busConfig, Container container, MessageHandlingOptions options) where TConsumer : class, IConsumer
{
string subName = NameHelper.GetSubscriptionName(@namespace, _serviceName);
var topicName = NameHelper.GetTopicName(@namespace, typeof(TEvent));
busConfig.SubscriptionEndpoint(subName, topicName, configurator =>
{
configurator.ConfigureConsumer(container, typeof(TConsumer));
if (!(options is null))
{
ConfigureRetry(configurator, options);
}
});
}
И построить очередь _errorrecovery. С каждым событием также связан IConsumer, специально предназначенный для обработки сбойных событий.
var subName = NameHelper.GetSubscriptionName(@namespace, _serviceName);
busConfig.ReceiveEndpoint(subName + "_errorrecovery", config =>
{
config.ConfigureConsumer(_simpleContainer, faultConsumers.Select(i => i.GenericType).ToArray());
});
Это создает очередь с именем subname_errorrecovery и тему, названную в честь события. У службы есть подписка в теме, но также есть подписка на _errorrecovery. Таким образом, каждый раз, когда сообщение отправляется в тему, получатели события и получатели ошибки получают сообщения.
Поэтому я ищу способ подключить службу к очереди восстановления, а также к нескольким темам, без подписки на каждую тему.
Также очень возможно, что я поступаю неправильно. Возможно, мне нужно просто добавить проверку на наличие повторяющихся сообщений и просто переместить сообщение в тему, позволяя службам, которые изначально успешно обработали сообщение, просто игнорировать его. Я все равно планирую это сделать, но надеюсь получить некоторые рекомендации по обработке ошибок с помощью MassTransit.
Любая помощь будет оценена по достоинству.