我在我们的 BTS 生产环境中遇到了无法在其他环境中重现的问题。在这里忍受我。
作为我们解决方案的一部分,编排 (orch1) 将直接绑定的消息发送到消息框,然后进入侦听形状,其中一个分支上的相关接收形状和另一个分支上的延迟(实现接收超时)。延迟设置为 10 分钟。
直接绑定请求由不同的编排(orch2)处理,然后将响应(再次通过直接绑定)返回到消息框,以便 orch1 可以接收它。
发生的情况是,大约每 50 次这种类型的操作中,orch1 中的超时被击中,当来自 orch2 的响应返回时,我们会遇到路由失败(这是您所期望的 orch1 上的实例订阅消息已被删除)。
奇怪的是,orch2 甚至在 orch1 中超时后才初始化(请参见以下屏幕截图)
在这里您可以看到 orch1 将直接绑定请求发送到消息框,10 分钟后超时被击中。请求在 11:26:31 发送,超时时间在 11:36:32。
这显示了 orch2 的时序。如您所见,接收形状仅在 orch1 中触发超时后才被击中(在 11:36:45)
奇怪的是 orch1 和 orch2 都托管在同一个主机上。此外,我们有一个负载平衡的集群,并且我们有 2 个该主机的实例可用于工作。所以我希望 orch2 上应该总是有可用性来处理传入的工作。然而,情况似乎并非如此。
我目前的怀疑是两个主机实例的线程饥饿。但是我的问题是
- 这是一个明智的怀疑吗?
- 我在做一些根本错误的事情吗?
- 有什么关于使用影响线程的听形状吗?
请注意,我们已经将主机线程设置配置为推荐级别(MaxIOThreads = 100,MaxWorkerThreads = 100,MinIOThreads = 25,MinWorkerThreads = 25)