Node.js或Java:性能,资源,流控制,受欢迎程度和个人经验

最近,我和我的同事们讨论了某些技术的流行-特别是Java和node.js。 在短暂的Internet浏览之后,事实证明,正是这些技术使许多信息巨头在网络上开发和维护其站点。 下面,我将只给出一小部分。

使用Java的公司:

图片

使用node.js的公司:

图片

同样不那么有趣的是,根据Java开发人员(30272个职位空缺)和node.js开发人员(7401个职位空缺)的要求,在确实网站06/28/2019 )上进行搜索时,对这些技术的需求非常旺盛。

图片

但这仅仅是关于普及的一般信息。 促使我深入研究该主题并推测技术特征主题的信息导致撰写本文。

为什么要比较它们


Java是一种语言,node.js可以称为基于JS构建的生态系统,首先是基于V8(来自Google的引擎)构建的生态系统。

但是,当我们谈论Java时,我们不仅在谈论语言,还在谈论Java虚拟机,以及围绕该机器构建的整个生态系统和基础架构。 至少可以在此基础上进行比较-结果, 在两种情况下,我们都有一个runtime 。 就Java而言,它是一个虚拟机。 对于node.js,它是一个V8引擎,可在大多数操作系统(例如Windows,Linux,MacOS和不太知名的操作系统)上使用。

开发人员可以使用相同的语言编写代码,并且由于存在运行时,因此在不同的操作系统上,它或多或少会以相同的方式工作。 运行时环境会影响与操作系统的交互方式。 此外,由于 它们用于解决类似问题

V8和JVM


当JS代码进入v8时,只要及时将其编译为虚拟机中使用的字节代码,JS代码就会运行得越来越快。
字节码是一种高级中间语言,因此在Java虚拟机中,它们不仅使用Java编写,而且还使用Scala和Kotlin编写。

前提条件是在不久的将来,对于V8,不仅可以使用JS,而且可以使用TypeScript或其他语言。 目前,在JS中有这些语言的翻译。 将来,它们可能会立即获得支持,并且所有操作都将更快。

现在V8一直在不断发展,总的来说,新版本的node.js的出现与新版本的V8引擎的出现有关。 它们直接互连。

Node.js:优点和缺点


Node.js由Ryan Dahl在2009年创建。

Node.js本身包含几个主要组件:

  • V8引擎
  • libuv库,它负责节点的中心部分-一个事件循环,它与OS交互以及异步输入/输出(I / O);
  • 来自一组各种JS库,直接来自JS语言本身。

让我们继续探讨其优缺点。

优点:

  • 轻松快捷的写作
  • 轻盈
  • 相对简单(与Java相比)
  • npm(节点程序包管理器(可以在一行上安装大量库)
  • 每个库都属于依赖关系树,这很容易完成
  • 持续开发(正在积极开发TypeScript(将打字,装饰器引入JS,例如用于Angular)

缺点:

  • 灵活性和快速发展也会产生不利条件,因为 您需要不断监控更新,有些东西没有经过充分测试;
  • 在某些情况下,开发人员从NPM中删除了他的库,并且使用它的许多应用程序停止了工作;

Java的优缺点


相反,立即考虑Java的主要功能。

优点:

  • 工作速度
  • 流行(在许多学习Java的国家/地区的大学中,使用Java学习OOP也很方便),
  • 大量的图书馆。

缺点:

  • 重物
  • 一些Java范例已经很久以前创建并且已经过时,
  • JDK是专有的,因此Java发展缓慢。

最近,JS已开始超越Java(而且,Java越远越多)。
Java也离开了Android世界,它被Kotlin取代,尽管Kotlin使用JVM,但仍然是另一种语言。

甲骨文和谷歌的冲突


图片

Java是由Sun创建的,后来被Oracle收购了,但现在仍归Java所有。 因此,许多使用Java的公司都会遇到一些问题。

当甲骨文就在Android中使用Java提起诉讼时,Google遇到了问题。 因此,Google非常积极地采用了独立出现的Kotlin。 Java是专有的。 但是,这里有一个Oracle虚拟机以及一个开放Java虚拟机(开放JVM),该虚拟机在Linux中使用并以开放源代码编写。 有时存在一些不兼容性,但是最近它们越来越少。

顺便说一句,Google无法完全放弃Java。 在用作Android核心的Dalvik中,嵌入了JVM。 也许他们会离开这个,但是这样做会非常困难,因为 几乎整个Android生态系统都是基于Java构建的-主要是基于现代化JVM的使用。 在某些时候,这也是Oracle与Google之间发生冲突的原因,因为Oracle禁止仅更新JVM。 这是Java最重要的部分。 语言本身几乎可以不受限制地使用。

Java与Node.js:性能和资源消耗


首先,值得注意的是,Java性能要比JS以及相应的node.js更高。

图片
Node.js和Java性能

如果您执行一些简单的任务(例如平方),那么在测试中,指标可能会变化多达10倍。 如果您在数百万个计算任务中运行循环,则Java几乎总是会超越node.js。 另外,Java和node.js之间的巨大区别是节点是单线程的,另一方面,这既是优点也是缺点。

Java可以使用OS级别支持的流,事实证明,用Java编写的程序可以充分利用OS的功能。 而且,如果您需要编写一个将使用大量计算的高负载应用程序,那么Java绝对会更好。 问题在于,即使是用Java编写的小型服务器,也会占用大量内存-磁盘和在线内存。

Node.js具有事件驱动的体系结构,因此是轻量级的。 它被构建为可以用作Web服务器,并且在处理轻量级任务方面做得很好。 例如,一个简单的查询(例如计算某些内容或写入数据库)会很快发生。 并且,如果有很多请求,并且我们想在节点中扩展系统,则可以使用Nginx或Apache Web服务器。 您可以有许多相同的节点实例。 然后,所有内容将通过循环负载平衡进行分配。 如果我们分别在16个内核上运行8个节点实例,则操作系统本身将在内核之间分配实例。 节点不控制它,它将只有一个线程。

Java和node.js中的流控制


在Java中,我们可以创建一个应用程序并在其中运行8个线程。 由于与操作系统之间存在更紧密的交互作用,因此您可以分配负载。

如您所知,tomcat是用Java编写的Web服务器之一。 在那里您可以清楚地看到,当用户发出请求时,将启动其他线程。 当请求到达节点时,事件循环将被处理并发送回去,然后下一个请求将到达。 并且由于我们不期望第一个结果的事实,它也会被采用。 虽然请求是轻量级的,但一切都很好。 但是,在执行繁重的计算时,如果有一个实例,则该节点将停止并发生超时。

图片
Java线程管理

在节点上,您只需编写几行代码即可获得最简单的Web服务器。 自然,对于更广泛的功能,将有通知,授权,日志记录等。 实施起来比较困难,但是有一些框架可以解决这些问题。

图片
node.js中的流控制

Java有一个开发的API-并发api,它使您可以使用竞争性线程。 但与此同时,这是自 竞争力是一件非常复杂的事情,并不是每个开发人员都精通这一点。

在Web上,REST API是节点的元素,有时他们会使用它。 但是,如果我们要处理复杂的计算,那么使用Java还是更好。

我的Java项目


在Java中,我有一个有趣的项目-分布式应用程序,其主要任务是处理大量图形信息,以便在目录中进一步使用。 创建目录时,您需要准备用于创建目录的各种分辨率的大量图像集。 简而言之,这是一个用于自动化印前目录准备的应用程序。

摄影师过去不得不手动完成所有操作。 首先,您必须使用一些小型应用程序才能上传图像。 此外,创建目录的专家必须通过另一个应用程序来开发目录结构。 然后,在另一个应用程序中,创建了一个工作流,该工作流将图片放入创建的结构中。 总的来说,这个过程非常困难。 在Linux,Windows,MacOS上使用过ImageMagick。 我们正在处理Linux。

例如,将尺寸为200-300 mb的.tiff图片加载到应用程序中,并且需要从中制作各种分辨率的图片,裁切某些东西或制作基材。
该应用程序的第一个版本无法应对繁重的工作,即使缺少具有16个核心处理器的服务器。 我们改进了同时使用多个实例的应用程序体系结构,以免从根本上改变应用程序。 启动了许多相互交互的实例,每个实例处理了一部分任务。 很难,但是我们能够在短短几个月内成功实现所有功能。 而且系统仍然可以正常工作。 在此过程中,我们必须应对竞争和互动的各个方面。

该项目中的某些内容仍然可以移植到节点,但是仍然需要用Java完成一些事情,因为 有许多不同的计算。 基本上,我们可以在节点上制造零件,这些零件将调用Java中的某些零件并使用微服务架构。 您可以使用混合版本。 但是这种方法并不总是可行的,因为 专门从事节点的开发人员可能不是Java方面的专家,反之亦然。 寻找通用开发人员要困难得多。

来自Node.js的经验


有一个组织大量数据的项目。 与上述项目相似。 仅在这里,我们上载包含大量信息的文件,并需要多次通过第三方服务(用Java编写)进行验证,并根据不同的规则进行验证。 有必要处理数百GB的信息,而节点并不是为此目的而设计的。

设计系统架构特别有趣,因为 该应用程序由几种微服务组成,包括第三方微服务。 当与执行验证的第三方服务一起使用时,我们使用了RabbitMQ消息代理。 验证结束后,我们将必要的信息提供给了第三方服务器,并从RabbitMQ收到了一条消息,然后对数据进行了部分处理以避免内存不足。

如果最初该应用程序处理了包含10,000条记录的文件,那么现在它最多可以处理一百万条记录。 我们仍然设法使用node.js解决了这个问题,尽管在Java中可以更轻松地解决它,但是,客户希望使用确切的node,因为 我需要使用JS编写的微服务的统一基础架构和体系结构。 使用node解决问题要复杂得多,并且需要更多时间,但是node.js由于可伸缩性而获胜。 这就是为什么我们现在可以增加工人数量并处理越来越多的数据的原因。 在Java中,这将更加复杂。

实际上,任何问题都可以通过这种方式解决,但是值得在此重复:如果有大量计算,最好使用Java;如果有许多计算,则可以安全地使用node。

总结和前景:node.js能够取代Java吗?


现在事实是,node.js经常被用作包装器,并且填充物将以其他语言编写。 人们早已知道它的缺点。 例如,诸如单线程之类的条件缺陷已得到修复。 最新版本的节点引入了使用多个线程的功能。

Java最初是作为替代C ++的轻量级解决方案而创建的,如今已变得重量级。 就像进化。 也许总有一天会取代节点。

图片
模块 -Java开发与node.js

现在,根据订单数量和我的感觉,node.js已经领先于Java。
JS正在积极开发中,并且会发生变化-也许会有一些东西可以代替它。
现在没有潜在的竞争对手可以取代Java和node.js。

问题在于,Java开发近来进展缓慢,而node.js的发展速度使得在不久的将来无法替换它。

Source: https://habr.com/ru/post/zh-CN460125/


All Articles