我有一个服务(ServiceA),客户端可以订阅该终结点,订阅后,此服务使用服务器发送的事件连续产生数据。
如果这很重要,那么我将Java与Project Reactor一起使用。
这可能很重要,因此我将解释此端点的作用。它每隔15秒从另一个服务(ServiceB)获取数据,检查15秒前获取的数据是否有更改,如果有更改,则使用该数据引发新事件,如果没有更改,则不更改发送任何内容(这样,给客户端的有效负载就越小)。
现在,该应用程序可以一次连接多个客户端,并且它们都要求提供相同的数据-用户未对其进行过滤等。
在多个客户端之间共享这种可观察到的产生输出是否明智?
当然,这可以节省我们对ServiceB的许多不必要的调用,但是我想知道这种方法是否有任何反对意见-这是我第一次在后端(来自RxJS)编写响应式程序,并且我不知道这是否会导致任何并发问题或任何其他类型的问题。
我看到的另一个好处是,新连接的客户端将立即获得从ServiceB接收到的最新数据(通常每次调用大约需要4s来检索此数据)。
我还想知道是否只有在有一些用户的情况下,这个可观察的对象才可能调用ServiceB-即直到有至少一个用户时,才调用该服务,如果没有用户停止,则当新的订户再次调用它,但首先获取客户端最后获取的数据(无论它有多旧或过时)。
答案 0 :(得分:0)
可以使用以下模式完美共享您的SSE源:
source.publish().refCount();
请注意,您需要存储该调用的返回值,并将同一实例返回给后续调用者,以便进行共享。
一旦所有订阅者都取消订阅,refCount
还将取消其对原始源的订阅。之后,第一个进入的订阅者将触发对source
的新订阅,您应该对其进行手工处理,以使其获取最新数据并每15秒重新初始化一个轮询周期。