原文:https://dzone.com/articles/the-reactive-universe-for-java-devs
想了解更多关于反应式编程的知识吗?看看这篇关于反应式编程和Java开发人员的文章。
不可否认的是,在Dev(以及最近的OPS)领域出现的数以千计的创新中,最受讨论的话题之一是响应式编程(ReactiveProgramming)。无论是新的FWS(框架)的开发,例如ReactiveX的Java语言(RxJava)的实现,Spring 5最近使用的响应式编程的启动,还是甚至lambdas和流在Java 8中的启动(自2014年以来),很明显,在我们使用的代码和FWS中出现了越来越多的响应式思维。
因为我是一个Java开发人员,所以我将尝试在这里评论一下Java开发人员今天在创建他们的应用程序时所依赖的主要选项。在日常编程的各种情况下,这可能是一个很好的选择,永远记住评估使用复杂或昂贵的资源来解决问题的真正需要是很重要的(著名的大炮打蚂蚁)。然而,在对我为响应式编程技术的工具发表评论之前,我想简单地强调一下这个范例的著名支柱(根据“Reactive宣言”):
Elastic-对需求/负载的反应-应用程序可以使用多个核心和多个服务器;
Resilient-对故障的反应-应用程序对软件、硬件和连接故障的反应和恢复;
Message Driven-事件驱动-而不是跨多个同步线程组合应用程序,系统由异步和非阻塞事件处理程序组成;
Responsive-响应用户-应用程序提供丰富的,“实时”与用户的互动。
关于响应式编程模型,它们已经出现并得到了改进,以解决阻塞API、高延迟和同步处理等问题。按照本文的目的,目前在使用Java的项目中进行的主要搜索和使用的工具如下:
RxJava
尽管RxJava是Java社区著名的FW,但在我看来,RxJava仍然缺乏Java Web开发人员的深入使用和研究。时至今日,这种应用仍然只存在于Android应用程序开发中。
虽然RxJava没有使用消息定向作为FW的主要功能,比如Akka的参与者模型(下面我将对此进行论述),它提供了许多消息定向变得更加明显的特性。最好的例子就是Rx的subjects,简而言之,subjects 实现Publish / Subscrib 标准。
在RxJava中,Subject同时表示一个观察者和一个可观察对象,允许将事件从一个源播到多个订阅者。由于负责发布的组件不知道谁是消息的使用者,因此这个模型保证了应用程序组件之间的低耦合性。
一些Web FWS还使用Rx作为其实现的一部分,比如Vert.x,它实现了RxJava的可观察性,并且实现了一个接近反应流的结构(No Vert.x2.x)。最后,这个实现的亮点之一是RxJava也很好地处理了流的背压,允许开发人员(通过API中预定义的方法)决定如何处理被“阻塞”的流。
Akka
Akka是一个工具包和构建并发 Runtime,用于在JVM中构建并发的、分布式的、容错的、事件感知的应用程序。FW Akka可以与Java和Scala一起使用。Actors 是 Akka 的执行单位。参与者是抽象de ,它促进了同步、并行和分布式系统的创建。参与者背后的关键原则是应用程序只通过消息与他交互,而从不直接与他交谈。这种抽象允许基于角色的应用程序透明地扩展并保持低耦合级别。虽然这个FW不仅被描述为响应性的,它呈现了 reactive 解决方案的几个特性(resilience 和 elasticity),而且即使最初是用Scala编写的,它也很容易集成到Java中。除了RxJava和Vert.x(带有reactive-streams),Akka还在其流中实现了背压控制的概念,从而可以更好地管理和处理流中的错误。
Akka已经与java集成了一段时间,但是使用java 8(带有lambdas和流)集成已经取得了更高效和更加一致的形式,如可以看到的(虽然它是2014的,仍然有很多的内容可以查到!)
Reactor Project
该项目由一系列功能组成,这些功能允许使用fw spring 5在jvm中使用 reactive streams。该项目基于另一个已存在的项目,称为 Reactor Cor ,该项目允许关键改进并插入在spring 5中启动的功能。很多人已经利用了最初的设计,允许您用简化的方式编写高性能、可伸缩和容错代码。这都与java开发人员已经从spring中使用的许多特性结合起来。
Reactor project 由两种主要类型组成:Mono 以及Flux .两者都被视为数据流,最多为1(Mono)或更多(Flux)元素,并通过 Publisher —>Subscriber 模式流来工作。 Spring 5 已经发布,并列出了新的 reactive 特性,并讨论了这一点。
在今天的市场上,我相信这些是最实用和最著名的选项(有活跃的社区和全面的文档)来处理java语言中reactive programming 的概念。如果你有任何建议或一些用例来评论,我会更想知道!下次见。
有什么讨论的内容,可以加我微信公众号: