io.realm:rea_使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述...

io.realm:rea

如今,人们需要具有高用户体验的高响应性,交互式应用程序,这通常意味着要处理异步性,尤其是当应用程序涉及高负载,实时数据和多用户时。

由于Java是一种固有的语言,它固有地支持命令式编程风格,因此异步性是一个很麻烦的问题,它会使代码变成完全的地狱。 解决异步问题的一种可能方法是在编码级别( React性编程 )或设计和体系结构级别(React性系统)引入“React性”。

让我们遍历最受欢迎的框架和工具包,以了解我们今天有哪些选择可以在Java中进行响应以及它们之间的差异(如果有的话)。 但是,从“React”上下文中刷新一些基本术语开始是一个好主意。

1.快速梳理“React性”

Reactive Streams规范于2015年出现,旨在为具有无阻塞背压的异步流处理提供标准,以确保React库的互操作性。 该计划未引入任何新内容,而是汇集了一组规则和协议,以简化和标准化跨多个工具的“React性”。 它介绍了四个核心接口( 发布者订阅者订阅处理器 )。 发布者产生一系列事件并将其定向到订阅者订阅服务器发布 服务器接收数据并产生副作用。 订阅发布者订阅者之间的连接。 处理器包括发布者订阅者协议。

非阻塞环境意味着永远不会浪费线程以等待其他操作完成。

背压是一种“重要的反馈机制” ,它可以管理情况,即数据的生成速度快于接收方消耗数据的速度。 它使数据生产者有可能保持正确的步伐,并且在高负载下不会失败。

消息驱动和事件驱动的方法。 使用消息驱动的方法,生产者可以确切地知道向谁发送消息,而事件驱动的方法意味着接收者只订阅数据生产者,它保留了所有订户的列表,并在有任何订户的情况下通知他们状态改变。

2. JavaReact式编程

有两种最常用于在Java应用程序中实现React式编码的框架: RxJavaSpring Reactor

RxJava第一个完整的 Java React工具 。 在遥远的2009年,埃里克·梅耶(Erik Meijer)引入了这种新的编程风格,其中包括Reactive Extensions,该扩展是作为Microsoft库集实现的,这些库通过默认使用.NET 4.0的可观察序列来创建异步和事件驱动的程序。 很快,Rx.NET赢得了开发人员的热爱,全世界看到了其他实现:RxJava(2014年11月),RxSwift,RxScala,RxJS,Rx.Kotlin等。RxJava2.0从零开始重新编写了Reactive Streams规范,并添加了新的类型。数据生产者介绍。

2013年,世界上第一次看到Spring Reactor 。它与RxJava非常相似,并且代表Spring 5的API实现。尽管两者有很多共同点,但是这两个框架之间还是存在一些差异。 让我们使用下面的图表快速探索它们。

  RxJava的 弹簧React堆

第四代图书馆

最新版本,至2018年 2017年6月21日-RxJava 2.1.1。 2017年11月16日– Reactor Core 3.1.2。
环境 React性X 春天5
Java版本 Java 6(Java和Android版Java) Java 8

默认情况下单线程非阻塞

事件驱动

支持React流 部分支持React式流* 完全支持React流
数据产生者的类型 RxJava 1 –可观察

RxJava 2 –可观察(多个值),可流动(多个值,支持背压),单个(一个值或错误),可能(一个值,错误或无排放),可完成(完成并带有错误或成功)

控制器:

磁通量表示0-n值和Mono的异步序列-0-1值的异步序列(均支持背压)

运营商数量 超过100名运营商** 一组核心运营商

* RxJava只有Flowables作为Publisher的真实体现。 其余数据生产者(即Single,Maybe,Observable,Completable)不支持背压。

** RxJava和Reactor都允许应用操作员的沉浸式功能(地图,zip,过滤器等)来转换和修改主流。 大理石图极大地说明了操作员( 在此处查找一些娱乐内容)。 它们不属于最初的React式编程理论,看起来像函数式编程的一部分。 操作员极大地简化了代码编写,因为它们代表了转换数据流的便捷方法,而在“常规” Java中,开发人员必须耐心地编写计算机将执行的每个步骤。 另一方面,操作员允许将具有特定功能的大量步骤融合在一起,这使代码更加清晰,精简和易于理解。 此外,操作员彼此兼容

3. JavaReact系统

React性系统代表了“React性”的下一个层次。 AkkaVert.x是通常用于构建这些系统的框架,这些框架最常实现为React式微服务 。 在IT世界中,这个新术语从字面上意味着微服务架构和React性系统原理的结合。 “React性”的获得对于这些分布式系统来说是完美的,这使它们更加灵活,可靠,并提高了性能。

Lightbend于2009年7月推出Akka (最新版本:2018年1月11日-Akka 2.5.9)。 该工具包最初是用Scala编写的,但如今也可以在Java中使用。 Akka是开源的,并支持Reactive Streams规范。 该工具箱的想法是将Erlang平台的高可用性和可伸缩性引入JVM。

演员模型是Akka的基础。 参与者是独立的代码集,它们通过消息相互通信。 演员的邮箱接收消息,并通过单个控制线程使消息入队。

此外,Akka在演员树层次结构中脱颖而出-演员组织的一种特殊形式,它暗示着不同级别的演员之间存在父子关系,从而确保了特定的容错能力和自我恢复能力。 父角色负责处理子块:当父角色收到有关子项崩溃的通知时,它可以继续,重新启动,停止其子进程或自行停止,以将错误处理责任转移到下一个层次。 由于演员代表完全孤立的单位并且不共享任何可变状态,因此其中一个的突然停止不会影响其他演员,他们将能够照常继续工作。

Vert.x的第一个版本是2012年(最新版本:2018年2月13日– Vert.x 3.5.1)。 Vert.x是一个开放源代码工具箱,其背后是Node.js。 Vert.x支持Reactive Streams,并提供垂直而非角色。 与Akka不同,Vert.x是一个完全事件驱动的环境,并以简单的请求-响应方式进行通信。 消息被发送到EventBus,以便通过单个控制线程排队。 Vert.x是一个多语言版本,可轻松与任何JVM或非JVM语言配合使用。

Akka(在ActorRef的帮助下)和Vert.x(在Service Proxies的帮助下)都简化了对分布式系统的远程调用。 由于它们的组件通过类似于URL的ActorRef / Service Proxies进行通信,因此没有理由关心它是否是本地电话。

外卖:

  • Akka是一组具有良好知识库的成熟库,这意味着执行它的时间和精力更少。
  • x比Akka还要年轻,因此它不那么受欢迎,而且描述也不那么好。
  • Vert,x是一个多语言版本,因此在开发过程中组合不同语言时更加方便。
  • Akka参与者形成一个树形层次结构,可以对高负载和故障进行优雅的管理。
  • Akka是消息驱动的,这使其组件(演员)之间的耦合更加松散。

4.最后一点

在本文中,我们快速回顾了Java世界中使用的“React式”框架和工具包。 他们不断获得关注,并证明“React性”不仅是一个过度炒作的概念,而且还是在编码和体系结构级别上进行Java应用程序开发的一种可行方法。

Java开发人员可以在React性上下文中选择彼此非常相似的各种角色,尽管它们也保留了一些独特的功能。 好消息是它们都支持Reactive Streams标准,从而使它们可以互操作。 因此,开发人员可以选择适合自己特定需求的内容,也可以针对自己的应用尽力而为。

翻译自: https://www.javacodegeeks.com/2018/08/frameworks-toolkits-make-java-reactive-rxjava-spring-reactor-akka-vert-x-overview.html

io.realm:rea

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决postman请求乱码问题

在请求头里加入 Content-Type:application/json;charsetUTF-8

vim如何开启256色

相同的colorschema,vim 和 gvim 的颜色差距还是很大的,因为 gvim 使用 X 的颜色,而 vim 只能使用终端提供的颜色,所以造成了二者的显示差异。所以 vim 开启 256 色,必须开启终端的 256 色,另请参见《Linux系…

spring boot分层_只需5分钟即可启动并运行分层架构:: Spring Boot第1部分

spring boot分层这是一个分为两部分的系列,其中我将展示如何使用Spring Boot创建分层体系结构。 什么是分层体系结构:简而言之,当我们构建企业应用程序时,我们维护不同的层以封装特定于层的逻辑,这样就不会溢出到另一…

java相除保留两位小数_Java:Java快速入门

源代码组织方式Java程序由packageclass组成,package对应目录的相对路径。1 package com.happyframework.javastudy.hello;2 3 public final class Hello {4 public static void hello(){5 System.out.println("hello!");6 }7 }关于class有如下几点规则&am…

Linux系统下与终端相关的命令

文章目录一、命令 who or w 可以显示有哪些终端登录二、命令 who am i 用来显示当前终端是哪一个三、命令 tty 显示当前终端的设备文件四、命令 chvt 用来切换虚拟终端五、命令 last 显示每个终端的登录时间和持续时间等信息六、命令 toe -a 列出系统支持的所有终端类型七、命令…

jdk switch 枚举_JDK 12开关表达式遇到意外的枚举值

jdk switch 枚举正如我在“ 玩JDK 12的Switch表达式 ”一文中所写的那样, JDK 12 Early Access Build使JEP 325 [“ Switch Expressions(Preview)”)实现的实验变得容易。 我的帖子“ JDK 12:实际中的切换语句/表达式 …

MacBook/MacOS如何写入MacBook特有的符号(例如:⌘/⌥/⎋/⇪)

文章目录步骤说明图文说明步骤说明 1.打开「表情与符号」 按快捷键 Ctrl Command Space 打开「表情与符号」窗口;你也可以在顶部菜单栏中的输入法,然后点击下拉的菜单列表中的「显示表情与符号」。如果找不到这个菜单项,你需要在电脑的「系…

java-jar jvm_使用Java流和In-JVM-Memory的超低延迟查询

java-jar jvm自然界的基本规则(例如光速和通用信息论)对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制。 了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级。 例如,如果应用程序服务器和数据库服务器相距…

关闭进程

查看端口是否被占用 netstat -ano|findstr “2181” 关闭进程 tskill port

iTerm2 for MacOS(终端模拟器/终端仿真器/命令终端工具)设置详解

文章目录General 通用Startup 启动Closing 关闭MagicSelectionWindowtmuxAppearanceGeneral隐藏程序图标theme 主题tab bar location 选项卡栏位置status bar location状态栏位置WindowsTabsPanesDimming 调光Profiles 配置文件General自定义终端界面的标志自定义标签页标题Sho…

dcdc芯片效率不高的原因_研学丨燃料电池车的典型效率及能耗

燃料电池的一大优势是高效率,能够更高效的利用能源。现在燃料电池车的研发已经持续了相当长一段时间(世界上第一辆燃料电池车为1966年通用的Electrovan),燃料电池车也迭代了许多,那么燃料电池车的效率、氢耗水平都怎么样呢?这里通…

groovy lambda_Java Lambda流和Groovy Clouse的比较

groovy lambda这篇博客文章将研究List数据结构上的一些谚语操作,并对Java 8/9和Groovy语法进行一些比较。 因此,首先是数据结构。 这只是一个简单的橄榄球球员,具有名字和等级。 Java class RugbyPlayer {private String name;private Inte…

Maven定制化打包后的包名(加入时间戳)

在对应的pom文件中加入配置 设置时间戳格式 <properties> <maven.build.timestamp.format>yyyy-MM-dd_HH_mm</maven.build.timestamp.format> </properties> 定制包名字 <build> <finalName>${project.artifactId}-${project.versio…

MacOS/MacBook设置短语快捷键

打开电脑的系统偏好设置 → 键盘 → 文本&#xff0c;如下图所示&#xff1a;

mhd格式三维图像显示_给你的家乡做个三维地图模型,满满的成就感,快来学习下...

以上三维地图模型&#xff0c;利用卫星影像高程数据&#xff0c;实现地图立体三维效果&#xff0c;自己就可以在电脑上个3D沙盘&#xff0c;是不是很酷呢&#xff1f;想要制作三维地图模型必须两样素材&#xff0c;第一是卫星影像&#xff0c;第二是高程数据&#xff0c;之前的…

纹理和基元_Java的精妙之处,包括基元和变量参数数组

纹理和基元在我最近的博客文章Arrays.hashCode&#xff08;&#xff09;与 DZone联合版本的评论中提出了一个有趣的问题。 Objects.hash&#xff08;&#xff09; “。 该评论的作者建立了一些示例&#xff0c;这些示例与我的博客文章中使用的示例相似&#xff0c;并且显示出与…

ORACLE数据库常用命令总结

SELECT * FROM all_tables WHERE ownericore_prdtdb; --查询当前用户下所有的表名 SELECT table_name FROM user_tables; --查询当前用户下所有的表 SELECT * FROM user_tables; --查询当前用户下所有的索引 SELECT * FROM USER_indexes; --查询当前用户下所有的序列 SEL…

MacOS使用brew无法安装Python_无法安装gdbm_无法安装autojump

文章目录出现的问题解决无法安装gbdm的问题解决无法安装Python的问题GNU 程序国内下载源&#xff1a;https://mirrors.ustc.edu.cn/gnu/ brew 下载的软件安装包存放在下面的目录&#xff1a; liaowenxiongdeMacBook-Air:Homebrew liaowenxiong$ brew --cache /Users/liaowenx…

客户说发货慢怎么回复_?沐言恋爱学:当女生说“我累了”,怎么回复最合适?...

沐言恋爱学&#xff1a;当女生说“我累了”&#xff0c;怎么回复最合适&#xff1f;学员提问&#xff1a;沐言解答&#xff1a;01兄弟你在考虑该怎么回复她之前你需要做的不仅仅是直接读懂她的字面意思而是需要了解事情背景比如&#xff1a;时间她经历的事情是不是身体不太舒服…

react 线程_React式服务中的线程本地状态可用性

react 线程任何架构决策都需要权衡。 如果您决定采用React式&#xff0c;也没有什么不同&#xff0c;例如&#xff0c;一方面使用React式流实现几乎可以立即获得更好的资源利用率&#xff0c;但另一方面会使调试更加困难。 引入React式库也对您的域产生巨大影响&#xff0c;您的…