轴突事件处理超时

Axon Event Processing Timeout

我正在使用 Axon 事件跟踪处理器。有时事件需要超过 10 秒的时间来处理。

这似乎导致消息被再次处理,并且出现在日志中“释放令牌 X/0 失败。它由另一个节点拥有。”

如果我增加了段数,它不会记录此事件,但事件仍被处理两次,所以我认为这可能会产生误导。(我想我弄错了)

我试过调整fetchDelay、cleanupDelay和tokenClaimInterval。 None of which has fixed this.是否有 属性 或我遗漏的东西?

编辑

用时超过 10 秒的情况是向外部服务发出 HTTP 请求。

我在使用 Spring 自动配置时使用所有默认配置的 axon 4.1.2。我看不到 Releasing claim on token and preparing for retry in [timeout]s 日志。

我在应用程序的单个段和 2 个实例中遇到了这个问题。我意识到我并没有像我想象的那样增加段数。

经过进一步调查,我发现添加一个额外的段似乎可以阻止这种情况。例如,即使我有 2 个细分市场和 6 个应用程序,它仍然不会重新出现,但是我不确定这与我原来的 1 个细分市场和 2 个应用程序的场景有何不同?

我没有意识到多个线程可以获取相同的跟踪令牌并处理相同的事件。听起来最好的做法是在 HTTP 调用之前进行一次效力检查?

Releasing claim of token [event-processor-name]/[segment-id] failed. It was owned by another node. 消息只能在三种情况下出现:

  1. 您正在执行两个段的合并操作失败,因为给定线程不拥有这两个段。
  2. TrackingEventProcessor的主事件处理循环已停止,但释放令牌失败,因为令牌已被另一个线程声明。
  3. 主事件处理循环捕获了一个 Exception,使其以指数 back-off 重试,并尝试释放声明(可能因给定消息而失败)。

我猜这不是选项 1 和 2,所以我们只能选择选项 3。这也意味着您看到了其他 WARN 级别的消息,例如:

Releasing claim on token and preparing for retry in [timeout]s

是否可以分享一下?这样我们就可以更好地确定您遇到的确切问题。

顺便说一下,您很可能有多个进程(TrackingEventProcessor 的事件处理线程)相互窃取 TrackingToken。由于他们正在窃取 un-updated 令牌,因此两者(或更多)将处理同一事件。因此,为什么您会看到事件处理程序被调用两次。

明显不受欢迎的行为,我们应该为您解决。我想请您回答我在问题下的评论,因为现在我几乎没有什么可以继续的了。让我们来解决这个问题@Dan!

更新

感谢@dan 更新你的问题,这很有帮助。 根据您分享的内容,我相当有信心这两个实例都在窃取彼此的令牌。这确实取决于两者是否为 token_entry table 使用相同的数据库(尽管我假设它们是)。

如果他们使用相同的 table,那么他们应该“很好地”分享他们的工作,除非其中一个花费很长时间。如果花费很长时间,令牌将被另一个进程占用。在这种情况下,其他进程是其他应用程序实例的 TEP 线程。 “claim timeout”默认为10秒,也对应漫长的运行事件处理过程。

这个 claimTimeout 是 adjustable,通过调用 JpaTokenStore/JdbcTokenStoreBuilder(取决于您使用的是什么 / auto wiring) 并调用 JpaTokenStore.Builder#claimTimeout(TemporalAmount) 方法。而且,我认为这对你来说是必需的,因为你有一个很长的 运行 操作。

当然有不同的方法来解决这个问题。比如,确保 TEP 仅在单个实例上 运行(虽然不是真正的故障容忍运行t),或者将这个长 运行 操作卸载到由事件。

但是,我想我们至少已经找到了问题,所以我建议调整 claimTimeout 看看问题是否仍然存在。 让我们知道这是否解决了您的问题@dan!