嵌套 RPC 调用的 RpcDispatcher 超时

Timeout on RpcDispatcher on nested RPC calls

我目前正在 WildFly 中创建集群应用程序,它通过自定义 JGROUPS 通道进行通信。应用程序向协调器发送 RPC 调用,协调器检查是否可以进行所需的更改。

协调器再次向所有集群成员发送 RPC 调用以同步其状态(告诉他们,将进行更改)。协调器无法处理第二个调用的响应,因为第一个调用仍在处理中('max one thread per sender' 逻辑),因此整个过程因超时而失败。类似于线程死锁。

如何克服这个限制?在我的例子中,只有两个嵌套调用,该解决方案也应该适用于更多嵌套调用(我不能确保,将来可能会发生更多嵌套调用)

--

我正在使用 RPC 调用,因为它们是同步的,所以我可以确保所有节点始终具有相同的状态。

  1. 节点A发送'change request'给协调器
  2. 协调器发送'change done'到所有节点
  3. 节点A将'something requiring the previous change'发送给所有节点
  4. 如果没有同步,#3 可能会在#2 之前被节点 B 接收到,对吗?据我所知,只有每个发件人的消息是有序的,但除了使用 SEQUENCE 协议之外,没有所有发件人的总订单,它总是将消息转发给为真正的发件人发送消息的协调器。

一个可能的解决方案是基于 asyncDispatching=true 实现自己的 RpcDispatcher 及其请求处理程序方法 handle(Message req, Response response)。自己的实现只是将响应对象添加到方法调用的args

这样您就不会阻塞发件人的 JGROUPS 线程。