【发布时间】:2015-12-19 23:33:49
【问题描述】:
作为 Rx 的新手,我正在尝试实现一些在概念上看起来很简单的东西,但我已经苦苦挣扎了一天,试图弄清楚如何在 Rx 中实现它。
我有 2 个 observable,一个是 IObservable<Worker>,另一个是 IObservable<Work>。这个想法是一种工作平衡器设置,其中工作通过一个 observable 提交,并与另一个 observable 上提交的 worker 配对。
使用Observable.Zip 很容易实现简单的情况。但是还有一个额外的要求在工作中引发了麻烦。
每个工作人员只能在有限的时间内接受工作(有一个窗口关闭,工作人员不再有资格接受工作,不应与工作项配对)。
这是我要实现的目标的大理石图:
------A-----B-----C------D-----> (WORKERS IObservable总结一下,要求:
当工作进入时,它应该分配给第一个工作进入时窗口仍处于活动状态的工作人员。(在图中我们有 A1 对但没有 B2,因为工作人员 B 已过期工作项 2 进入和 C2 成为正确配对的时间)
当一个worker与一个工作项配对时,它不应该有资格与后续的工作项配对(从某种意义上说,它的窗口应该在使用时强制关闭,但这是我的部分'我最挣扎如何实现)。
如果工作进入并且没有可用的工作人员打开窗口,它应该等到下一个工作人员发出并与之配对(参见图中的 D3)。
我很确定这可以通过Join 或GroupJoin 以某种方式实现,但我正在努力弄清楚如何获得我正在寻找的确切语义。任何帮助将不胜感激。
【问题讨论】:
-
您已将其标记为 RxJava,但您的约定看起来让人想起 C#。这是用于 Java 还是 .NET?
-
特定示例是用 C# 编写的,但我们同时使用这两种语言。我对如何使用通用 RX 结构在概念上解决这个问题更感兴趣,而不必担心特定于语言的语法。我认为 rx-java 和 .net 社区都可以做出贡献。
-
对于工作人员的超时,您也许可以使用timeout 运算符,因为这符合语义。至于工作的配对,我可能建议不要试图将其硬塞到 Rx 运算符的组合中,因为这看起来逻辑很重。虽然如果练习是使用运算符,there are other combining operators 可能比
Zip/GroupJoin工作得更好(例如withLatestFrom)。 -
为了从运行中移除一个忙碌的工作人员,它的 observable 可以在它被分配工作时完成(如果你想让它成为一个自定义的 observable)或者你可以有一个中间人(各种各样的)配对而跟踪谁在忙(而不是使用组合运算符)。
标签: system.reactive reactive-programming rx-java