缓冲rx.js可观察的多个订阅者

时间:2016-11-10 23:42:17

标签: javascript buffer rxjs observable subject

我有

  var subject = new rx.Subject();
  var stream =     rx.Observable.fromEvent(blah, 'event')
                  .filter(blah)
                  .map(blah)
                  .subscribe(subject);

                return subject;

然后我将主题传递给几个不同的处理程序,这些处理程序将以不同的方式和不同的速度处理事件 所以我在每个处理程序中都有

subject.subscribe(async function (x) {
        const func = self[x.eventName];
        if (func) {
          await eventHandlerWrapper(self.handlerName, func, x);
        }
      })

我有两个问题, a)如果事件以超快速进入,那么处理程序将按照我拥有的方式同步并以正确的顺序处理它们? b)如果不同的处理程序以不同的速度处理事件,它们是否会等到最慢的处理程序通过才提供下一个事件?或者他们会按照自己的节奏缓冲和处理?

谢谢你, [R

1 个答案:

答案 0 :(得分:1)

首先,主题的创建可以简化为:

const subject = rx.Observable.fromEvent(blah, 'event')
              .filter(blah)
              .map(blah)
              .share();

share方法将从流中创建一个Subject。如果您将此主题实例返回给每个订阅者,您将获得相同的行为并且看起来更好。

 a) if the events come in super fast is the handler going to process
 them synchronously and in the right order given the way I have it?

事件将以正确的顺序逐个推送到整个链中。意思是,在处理下一个值之前,通过'fromEvent'进入的事件将被推送到整个链中,直到您订阅它为止(除非在它们之间有异步运算符:))。 Ben Lesh在角度连接2015中解释了这一点:https://www.youtube.com/watch?v=KOOT7BArVHQ(你可以观看整个演讲,但是在17分左右,他将数组与可观测数据进行比较)。

b) if the different handlers handle the event at different speeds are 
they all going to wait till the slowest handler is through before the    
next event is provided? or will they all sort of buffer and handle at  
they're own pace?

他们将按照自己的节奏处理事件。请检查以下示例:

let interval$ = Rx.Observable.interval(1000).share();

interval$.concatMap((val) => {
    console.log('called');
    return Rx.Observable.of(val).delay(3000)
  })
  .subscribe((val) => console.log("slow ", val));

interval$.subscribe((val) => console.log("fast ", val));

这里我使用了一个可以转换为主题的区间observable。所以它会每秒发出一个事件。我有一个正在获取值的订阅,处理此值(需要2秒)然后采用下一个(使用concatMap)。另一个订阅,立即处理它们。如果您运行此代码(jsbin here:https://jsbin.com/zekalab/edit?js,console),您将看到他们都按照自己的节奏处理事件。

所以他们不等待最慢的处理程序,它将在内部缓冲。

如果最慢的处理器比抛出事件的频率慢,那么您所描述的情况可能会有一些危险的情况。在这种情况下,您的缓冲区将继续增长,最终您的应用程序将崩溃。这是一个称为背压的概念。您获得的事件比处理事件的速度快。在这种情况下,您需要在最慢的处理器上使用“缓冲”或“窗口”等运算符来避免这种情况。

相关问题