如果反应式编程避免线程并使用对象之间的异步消息传递,那么如何管理可伸缩性?
如何决定何时需要新实例?是否有一些 api 可以透明地管理这个?
根据反应宣言:
“反应式系统可以通过增加或减少分配用于服务这些输入的资源来对输入速率的变化做出反应。”
如果组件彼此隔离并且不共享资源,则可以复制它们 - 即您可以一次运行组件的多个实例并在它们之间拆分输入。
这是可能的,因为输入采用异步消息的形式。从任何一个实例的角度来看,它只需要处理它接收到的消息。它不关心消息相对于其他消息的顺序,也不关心其他实例如何处理它们的消息。
因此,您可以根据需要同时运行尽可能多(按比例放大)或尽可能少(按比例缩小)的组件实例,并且因为它们都独立接收不同的消息 - 即问题的不同部分 - 它们不会发生冲突,加倍或相互竞争。这种向上或向下可扩展性的特性称为“弹性”。
有许多库、框架和 API 可以帮助您实现反应式系统,例如根据工作负载扩展组件,只要您正确配置它们并使用它们提供的结构。目前最大的一个似乎是ReactiveX API,包括 RxJS、RxJava 和其他特定于平台的框架。
注意:反应式编程不一定针对线程 - 仅针对竞争共享资源的线程。如果您将线程彼此分离,例如,通过拆分工作负载并将其不同部分分配给不同的线程,这就是一种复制形式,一种被反应式编程认可的技术。