检查 Tibco Rendezvous 收件箱是否有效

Check if a Tibco Rendezvous Inbox is valid

有没有办法判断 RV 收件箱是否有有效的活动端点?

我有一个系统,客户可以在其中创建 RV 收件箱。然后将这些传递给系统中的其他组件,这些组件可以使用收件箱向客户端发送消息。

我希望我的系统中有一个监控进程来了解客户端是否已死亡。监视器将有客户端收件箱。

我可以实施心跳机制,但我想知道 RV 中是否有一种机制可以告诉我收件箱是否仍然有效 - 即,在其上发送的消息是否会路由到活动客户端。

我想 RV 本身肯定知道这一点——因为它会知道它是否可以向收件箱发送消息。有没有办法让我的代码能够访问此信息,或测试收件箱在给定时间是否有效?

收件箱使用直接连接。来自 documentation:

Transport objects can create inbox names, designating a destination that is unique to that transport object and its process. Rendezvous software uses point-to-point techniques to deliver messages with inbox subject names.

而且,直接通信实际上只是 UDP

Direct communication uses RPTP over a UDP channel.

所以你有两个问题 - 第一,将收件箱映射到 IP 地址和 UDP 端口,第二,判断它是否是你想要的。

我一直没能找到解决第一个问题的任何方法 - 这些收件箱是不透明的,但大概有人聪明能弄明白。

对于第二个问题,一般来说似乎不是那么容易解决的问题 - 来自我们的 sister site

UDP ports only have two states: listening or not. That usually translates to "having a socket open on it by a process" or "not having any socket open". The latter case should be easy to detect since the system should respond with an ICMP Destination Unreachable packet with code=3 (Port unreachable). Unfortunately many firewalls could cut those packets so if you don't get anything back you don't know for sure if the port is in this state or not. And let's not forget that ICMP is session less too and doesn't do retransmissions: the Port Unreachable packet could very well be lost somewhere on the net.

我猜想,最简单的方法是使用心跳机制。过去,我们有一个围绕 RV 的库,它会发布所有客户端和订阅的任何主题(包括收件箱),用于各种管理流程。

(没有真正回答我自己的问题 - 这是来自同事。)

我在处理我们去年必须编写的 RV 桥时遇到了这个问题,因为它正在代理和重写收件箱。事实证明,RV 会为某些操作(阻塞操作)创建“一次性”收件箱,并且不会发送任何消息(无论如何在该多播上)表明收件箱已消失。收件箱的工作方式似乎是:

  • 收件箱对主机的 IP 地址、该 host/transport 上客户端的唯一进程 ID 和递增计数器进行编码
  • 发件人只是将一个单播数据包发送到正确的 IP 和端口(服务)
  • 守护程序(如果它在该服务上有客户端)检查它是否有关于该主题的任何活动订阅(就像多播一样),并将其传递给客户端

换句话说,它是接收守护进程必须丢弃在关闭的收件箱上发送的消息,并且没有与常规订阅结束时伴随的“LISTEN.STOP”消息等效的消息。