Rx java RXJava是服务器端工程师需要的东西吗?

Rx java RXJava是服务器端工程师需要的东西吗?,rx-java,reactive-programming,system.reactive,rx-java2,Rx Java,Reactive Programming,System.reactive,Rx Java2,我可以看出RX对于Android和UI事件处理都很好。我正在努力了解RX在后端提供了哪些好处 RxJava是为后端处理而设计的,还是这个概念已经走得太远了?实际上,RxJava最初是为了解决服务器端问题而实现的。反应式扩展源于.NET world,Netflix将其后端移植到Java。RxJava在Android上采用之前几年就已经成为服务器端Java编程的一种东西 当时,异步和非阻塞处理被证明可以极大地提高服务器性能。可以使用回调来实现这一点,但回调组合不好,会导致回调地狱。RxJava及其功

我可以看出RX对于Android和UI事件处理都很好。我正在努力了解RX在后端提供了哪些好处


RxJava是为后端处理而设计的,还是这个概念已经走得太远了?

实际上,RxJava最初是为了解决服务器端问题而实现的。反应式扩展源于.NET world,Netflix将其后端移植到Java。RxJava在Android上采用之前几年就已经成为服务器端Java编程的一种东西

当时,异步和非阻塞处理被证明可以极大地提高服务器性能。可以使用回调来实现这一点,但回调组合不好,会导致回调地狱。RxJava及其功能性调用链接风格提供了一个(好的)解决方案,并开始被采用

然后,它扩展到Android系统来处理网络调用或UI事件。虽然我在Android上使用并享受它,但我总是发现RxJava在Android上比在服务器上更不自在。由于总体设计在概念上更接近于其他服务器技术IMHO,即使我知道在.NET世界中从一开始就在客户端使用了反应式扩展。但也因为Android中RxJava的使用有它的缺陷。如果不跟踪订阅,则很容易泄漏上下文。你必须在几乎所有地方添加
.observeOn(AndroidSchedulers.mainThread())
,你会时不时地忘记并导致崩溃。我敢打赌,这就是领导Android团队对“观察者”模式有自己看法的原因

除了解决回调地狱,RxJava还为开发人员提供:

  • 观察者模式:该模式非常适合向其他模块公开数据。它给出了生产者和消费者之间的合同,包括明确的标准行为、终止处理以及控制生产者对消费者的方式(退订、背压)。当然,您不需要RxJava来实现这个模式,但RxJava可以将它提升到另一个层次
  • 错误处理:在异步系统中,错误处理很棘手
  • 一套完整的运算符:用于变换、过滤和合并流的数百个运算符。当您需要执行数据操作,并且通常是后端操作时,RxJava会将代码简化为几个标准的显式运算符
总而言之,RxJava非常适合后端处理,甚至比Android IMHO更适合。您可以找到更多关于Netflix为何在Java中实现反应式扩展以及其后端的好处


至于说如果服务器端工程师需要它,我会说它不是必需的,但我知道它会大大增强您的工具箱。现在的趋势是越来越异步,越来越多的中间件、库和框架只提供异步API。例如,Couchbase Java数据库API基于RxJava。另外,反应式扩展不仅仅是Java,您将能够在大多数语言中利用这些知识。

我在API网关和更传统的微服务中使用RxJava。Rx使并行计算(或I/O调用)既有局部约束又有全局约束变得微不足道,而我还没有找到一个非反应式的解决方案

这就是说,没有一个微服务是孤立存在的,所有的微服务都需要联系其他东西——而改型+rx使这变得微不足道

根据我的经验,测试并不是特别复杂;你确实需要一些额外的工具,但这是一次性的投资


我注意到,大多数rx教程侧重于向您展示如何
订阅
;我认为这是错误的抽象级别。IMO操作员级别的思考和测试更有用。

IMO,如果您有一个好的旧的单片web应用程序,您可能不会从反应式编程中受益匪浅。据我对本主题的了解,在处理I/O或许多异步任务时,反应式风格确实非常出色。我能想到的一些用例是流应用程序、WebSocket、分布式系统、游戏服务器、聊天/消息应用程序……Spring WebFlux是一款“节点式”web服务器,感谢您的洞察力。当然,Netflix会从中受益,因为他们需要对大量负载做出反应。对于不需要大规模扩展的普通应用程序,您的答案有多重要?为了进一步阐述,我认为RX适合异步负载。确实,Netflix的优势在于他们需要用最少的硬件(这仍然是大量的硬件)来应对大量负载。在我的问题中,我没有正确地表达(我的错误)的是RX对于不需要大规模应用的正常应用有多大的相关性?设置异步调用链和错误处理是一件痛苦的事情,而且与声明相反,很难测试。根据我的经验,如果你进入了回调地狱,那么你将使你的代码变得比它需要的更复杂。我编辑了我的答案,现在我更好地理解了你的担忧。