1

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

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

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

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

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

4

2 回答 2

1

收件箱使用直接连接。从文档中:

传输对象可以创建收件箱名称,指定该传输对象及其进程唯一的目的地。Rendezvous 软件使用点对点技术来传递带有收件箱主题名称的消息。

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

直接通信通过 UDP 通道使用 RPTP。

所以你有两个问题 - 首先,将收件箱映射到 ip 地址和 UDP 端口,第二个,告诉它是否是你想要的。

我还没有找到解决第一个问题的任何方法——那些收件箱是不透明的,尽管大概聪明的人可以弄清楚。

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

UDP 端口只有两种状态:监听或不监听。这通常翻译为“进程在其上打开套接字”或“没有任何套接字打开”。后一种情况应该很容易检测到,因为系统应该使用代码=3(端口不可达)的 ICMP 目标不可达数据包进行响应。不幸的是,许多防火墙可以切断这些数据包,所以如果你没有得到任何回报,你就无法确定端口是否处于这种状态。我们不要忘记 ICMP 也少会话并且不进行重传:Port Unreachable 数据包很可能会在网络上的某个地方丢失。

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

于 2018-02-12T02:03:11.447 回答
1

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

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

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

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

于 2018-02-13T07:16:16.300 回答