Сага MassTransit с сохранением Redis дает метод Accpet не имеет исключения для реализации

Я пытаюсь добавить постоянство Redis в мою сагу, которая управляет вызовами в квитанции маршрутизации (а также дополнительными сообщениями другим потребителям в зависимости от результата квитанции маршрутизации) в надежде, что это решит еще одну проблему тайм-аута, которую я продолжаю получать,

Тем не менее, я получаю сообщение об ошибке, которое поступает в мою очередь saga_error в RabbitMQ.

Ошибка, показанная в сообщении:

Метод 'Accept' в типе 'GreenPipes.DynamicInternal.Automatonymous.State' из сборки 'AutomatonymousGreenPipes.DynamicInternalc83411641fad46798326d78fe60522c9, Version=0.0.0.0, Culture= нейтральный, PublicKeyToken=null' не имеет реализации

Мой код конфигурации корреляции:

InstanceState(s => s.CurrentState);

Event(() => RequestLinkEvent, x => x.CorrelateById(context => context.Message.LinkId).SelectId(y => y.Message.LinkId));
Event(() => LinkCreatedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => CreateLinkGroupFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => CreateLinkFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => RequestLinkFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));

Request(() => LinkRequest, x => x.UrlRequestId, cfg =>
            {
                cfg.ServiceAddress = new Uri($"{hostAddress}/{nameof(SelectUrlByPublicId)}");
                cfg.SchedulingServiceAddress = new Uri($"{hostAddress}/{nameof(SelectUrlByPublicId)}");
                cfg.Timeout = TimeSpan.FromSeconds(30);
            });

LinkId в приведенном выше коде всегда является уникальным Guid.

Кажется, проблема возникает, когда сага читает событие, которое было отправлено с моего бланка маршрутизации (будь то событие успеха или сбоя).

Пример интерфейса событий, который не работает:

public interface ILinkCreated
{
    Guid? CorrelationId { get; set; }
    int DatabaseId { get; set; }
    Guid LinkId { get; set; }
    string LinkName { get; set; }
}

Если я переключаюсь обратно в InMemorySagaRepository, все работает (локально). Я пробовал очень много разных комбинаций вещей и теперь попал в кирпичную стену.

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

Я также видел, что у кого-то из групп Google была такая же проблема, но нет ответа на их сообщение.

2 ответа

Решение

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

Вместо CurrentState типа State, как показано ниже:

public State CurrentState {get; set;}

Я должен был указать его в виде строки как таковой:

public string CurrentState { get; set;}

Теперь его можно десериализовать в объект правильно. Я подозреваю, что это могло быть причиной моих проблем с тайм-аутом с InMemorySagaRepository на моем промежуточном сервере.

Проблема здесь - запрос-ответ.

Это работает так:

  1. MT помещает идентификатор запроса в государственную собственность саги UrlRequestId
  2. Запрос отправлен
  3. Вы получаете ответ обратно, ответ содержит адрес запрашивающего и идентификатор запроса в его заголовке
  4. MT использует репозиторий саги, чтобы найти ваш экземпляр, используя repo.Find(x => x.UrlRequestId == message.Headers.RequestId) (следовательно, это не настоящий код, но это то, что происходит)
  5. Redis (или любой другой KVS) не поддерживает запросы, поэтому мы также не поддерживаем запросы в репозиториях саги, и вы получаете исключение "не реализовано"

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

Вы можете обойти это, не используя запрос-ответ и вместо этого отправлять событие, используя context.Publish(new LinkCreatedEvent { ... , CorrelationId = context.Message.CorrelationId }) и используя обычную корреляцию.

Другие вопросы по тегам