0

我正在尝试将 Redis 持久性添加到我的传奇中,它正在管理对路由单的调用(以及根据路由单的结果向其他消费者发送的附加消息),希望它能解决我不断收到的另一个超时问题.

但是,我收到一条错误消息,该消息进入 RabbitMQ 中的 saga_error 队列。

消息中显示的错误是:

来自程序集“AutomatonymousGreenPipes.DynamicInternalc83411641fad46798326d78fe60522c9, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”的“GreenPipes.DynamicInternal.Automatonymous.State”类型中的方法“Accept”没有实现

我的相关配置代码是:

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。

当 saga 正在读回从我的路由单发送的事件(无论是成功还是失败事件)时,问题似乎就会发生。

一个不工作的示例事件接口是:

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

如果我切换回 InMemorySagaRepository 一切正常(本地)。我已经尝试了很多不同的组合,现在已经碰壁了。

我已将所有软件包更新到最新版本。我也一直在检查我的 redis 数据库,并且可以看到状态机实例每次都正确进入。

我还看到 Google 群组中的某个人遇到了同样的问题,但他们的帖子没有回复。

4

2 回答 2

0

这里的问题是请求-响应。

它是这样工作的:

  1. MT 将请求 id 放入 saga 状态属性UrlRequestId
  2. 请求已发送
  3. 你得到一个响应,响应包含请求者地址和请求 id 在它的头
  4. MT 使用 saga 存储库来查找您的实例repo.Find(x => x.UrlRequestId == message.Headers.RequestId)(因此这不是真正的代码,但这就是发生的情况)
  5. Redis(或任何其他 KVS)不支持查询,因此我们也不支持 saga 存储库中的查询,您会得到“未实现”异常

您的响应相关规范没有任何效果,因为Request始终使用标头来查找响应所属的 saga 实例。

context.Publish(new LinkCreatedEvent { ... , CorrelationId = context.Message.CorrelationId })您可以通过不使用请求响应来解决此问题,而是使用和使用通常的相关性发出事件。

于 2018-08-08T09:28:10.690 回答
0

因此,回答我自己的问题,也许可以阐明我自己的愚蠢。这个问题实际上是由我设置 StateMachineInstance 的方式引起的。

而不是具有如下 State 类型的 CurrentState:

public State CurrentState {get; set;}

我应该将它指定为这样的字符串:

public string CurrentState { get; set;}

现在它可以正确地反序列化到对象中。我怀疑这也可能导致我的登台服务器上的 InMemorySagaRepository 出现超时问题。

于 2018-08-23T05:47:20.013 回答