Tibco RV:消息生命周期 + 无扇出副本

Tibco RV: Message Lifetime + No Copy for fanouts

1、消息在侦听器队列中存活多长时间?直到调度程序在“1 发布者 1 消费者”场景中从队列中读取消息?

Listener listener = new Listener(Queue.Default, transport, subject, new object());
listener.MessageReceived += OnMessageReceived;
Dispatcher dispatcher = new Dispatcher(listener.Queue);

2、Tibco RV一般用于大fanout系统,对交付可靠性要求相对宽松,比如市场数据发布到企业20个应用。我听说 Tibco RV 为扇出实施了 "no copy" 解决方案 - 这怎么可能?我假设我们至少需要遍历该队列的所有已注册侦听器并通知每个侦听器,在该过程中消息被复制 20 次。请赐教

3,结合问题 1 和问题 2,在所有已注册的侦听器都使用了消息之前,将消息驻留在侦听器队列中是没有意义的 - 如果 20 个应用程序中的 1 个脱机会怎样?由于不断增加的消息,它将关闭 rv 守护进程。 Tibco RV 是否对每条消息都有生命周期限制 (ttl)?如何检查它并将其设置为新值?

Google相关信息不多,请大家帮忙

谢谢。

很好的问题。

  1. 请记住,除非您使用的是经过 RV 认证的消息传递,否则不会持久保存到磁盘。发送的消息将保留在发送 Rendezvous 守护程序的 内存 中,直到它们被传递给所有消费者。

    也就是说,另一件需要理解的事情是 RV 是一种乐观 协议,而不是说 TCP 是一种悲观 协议.使用 TCP 发送的每个数据包都必须得到确认。这种往返协议会减慢速度。另一方面,Rendezvous 使用位于 UDP 之上的协议,该协议是无会话且不需要确认的。因此,当 Rendezvous 守护进程发送消息时,假定已成功传递 ,除非收到重传请求。因此,为了完全回答您的第一个问题,Rendezvous 守护程序的默认行为是在发送消息后将已发送的消息保留在内存中 60 秒。这允许它接受重传请求。

  2. 扇出是在 UDP 之上使用广播或多播协议实现的。不鼓励使用广播,而鼓励使用多播。使用多播组使用的网络资源要少得多。在网络接口级别,只有那些已加入多播组的主机才会接收与 Rendezvous 流量关联的数据包。同样,在网络交换机级别,多播占用的资源要少得多。

    最重要的是,发送 Rendezvous 守护程序只发送一次消息,如果使用广播,网络将相关数据包的副本发送到子网上的每个主机,或者如果使用广播,则发送到已注册的主机使用多播。

  3. 在 pub-sub 中,通常消费者会接收到 在他们还活着并正在消费 时发送的消息。因此,对于纯 Rendezvous,如果一个消费者宕机,该消费者的订阅将​​被取消。如果我们考虑您的市场数据示例,这正是我们想要的行为。 IBM 以每秒数千次的速度进行交易,所以如果我错过报价也没什么大不了的。我会得到下一个。此外,我不想要过时的价格。

    也就是说,有时消费者确实希望在他们停机时发送消息。这可以使用经过认证的消息传递和设置持久通信者来实现。有关更多信息,请参阅 Rendezvous Concepts Guide. Lastly, the 60-second behavior that I mentioned in point #1 can be changed using the -reliability parameter when starting the Rendezvous daemon. There are some cases where this may make sense (although the default is best for most common cases). For more details on this take a look at the Rendezvous Admin Guide.