乐趣区

关于javascript:一个用Nodejs从头开始编写的数据库

Node 是轻量级和可扩大的,让咱们能够疾速开发,而且 npm 有令人难以置信的包。

HarperDB 的开创团队建设了第一个也是惟一一个用 Node.js 编写的数据库。几个月前,咱们的 CEO Stephen Goldberg 应邀参加了在 Women Who Code meetup 上发言,分享了这个_(有些人称之为疯狂的)_致力的故事。Stephen 探讨了数据库的架构层,演示了如何在 Node.js 中构建一个高度可扩大的分布式产品,并演示了 HarperDB 的外部工作原理。你能够在下面的链接中观看他的演讲,甚至能够浏览一篇 2017 年的文章,但因为咱们都喜爱 Node.js,而且这是一个乏味的话题,我在这里总结一下。

咱们抉择用 Node 构建数据库的次要(也是最简略的)起因是咱们对它十分理解。咱们因为没有抉择 Go 而受到了鞭挞,但当初人们曾经承受了 Go 和 Node 基本上是头对头的关系(_在风行度和社区反对度上_)。咱们的联结创始人之一 Zach 意识到,如果花工夫学习一门新的语言,那是不值得的。

用 Node.js 构建数据库的长处

  • 咱们曾经晓得 Node.js

* 轻量级

  • 疾速倒退
  • 高度可扩展性
  • npm

HarperDB 团队领有大型软件开发的背景。咱们数据库的最后指标是创立一个工具,使开发人员可能专一于编码,而不用将工夫和精力投入到数据库保护中,同时依然提供一个弱小的解决方案。咱们心愿人们对本人应用的产品感到舒服和自信。咱们的团队在 Node 以外的其余语言方面有着丰盛的教训,但咱们在 Node 编程方面获得了微小的胜利。尽管来自 Java,Stephen 一开始认为 Node 很可怕,但在大概 90 天后,他学会了喜爱它)。Node 是轻量级的,让咱们能够疾速开发,而且 npm 有令人难以置信的包。

在 Node.js 中构建数据库的弊病

* 过后未被承受为 “ 企业级语言 ”。

  • 不间接管制操作系统 / 文件系统。
  • 性能不如 C /C++
  • 以前没有本地线程(当初有了)。

咱们的确遇到了一些麻烦 …… 作为第一个用 Node.js 编写的数据库,咱们没有抉择追随任何人的脚步。咱们可能是有史以来第一批用 Node 构建的企业产品之一,至多是最以数据为核心的产品。人们对此提出了质疑。有一个人对 Stephen 说,他宁愿用勺子把本人的心挖出来,也不违心用 Node.js 来编写数据库的程序。 当初,人们曾经意识到这是一个平凡的想法,因为咱们的产品中有所有这些令人难以置信的性能,咱们不用构建,并且是咱们所做的事件的固有性能。 咱们的确遇到了挑战,围绕着不能间接管制文件系统中的操作系统。此外,C/C++ 的速度更快,但可能更简单,而且不肯定能横向扩大。这真的取决于你是在寻找垂直计算还是程度计算。


Free NodeJS Tutorial for Beginners:

](https://leanpub.com/tutorial-…

Download: Tutorial for node js


Tech Stack

这是咱们的技术栈的样子。咱们认为咱们的治理工作室是 HarperDB 堆栈的一部分,那是用 React 与 Node 后端构建的。绿框示意任何建设在 HarperDB 之上的利用,比方咱们的【Node-RED 节点】(https://harperdb.io/blog/were…。HarperDB 技术齐全用 Node.js 构建,它蕴含了咱们的接口和 HarperDB 外围。

咱们的产品以 REST API 的模式出现,而在实质上,它只是一个 Express 利用,那是你如何与 HarperDB 交互的次要接口。咱们的 NoSQL 解析器是咱们外部构建的定制解决方案。咱们应用 AlaSQL 来实现咱们的 SQL 解析性能,你能够在这里浏览更多信息,咱们在此基础上用自定义代码来扩大他们的性能,这是一个了不起的解析 SQL 的 npm 包。咱们提供驱动,比方 ODBC 和 JDBC,由咱们的一个合作伙伴构建。最初,咱们应用 SocketCluster 进行分布式计算和集群,咱们的 CTO 将在几周内介绍。

HarperDB 的核心技术蕴含了 “ 秘籍 ”。这就是让咱们可能在没有数据反复的状况下进行齐全的索引,并为繁多数据模型提供各种接口选项的起因。在外围外部,实现了许多 npm 包来扩大咱们的性能。

最初咱们有各种存储介质的抉择。咱们默认捆绑 LMDB,因为它比其余选项提供了显著的性能晋升。HarperDB 外围蕴含可扩大的代码,容许咱们在将来增加更多的存储介质选项。

REST API

  • HarperDB 是一套微服务。
  • 一个繁多的端点
  • 所有业务均为员额。
  • 无状态 / 劳动型

(代码样本见 https://docs.harperdb.io/__)_。

在以前的一家公司,咱们的团队要解决上百个不同端点的 API,这几乎是疯了。大家可能会感觉 HarperDB 只有一个端点很奇怪,但如果你看一下代码的主体,你做的每一个操作 – 你所要扭转的只是主体,也就是后面那几行。这是超级简略的,当你编写一个基于 REST 的应用程序时,你能够把它变得十分间接。这是你能够从咱们这里学到的货色,并且能够在任何应用程序中应用。基本上,你向 API 公布一条音讯,咱们就会看到你在执行什么操作,而后用一套规范的办法来解决它。在过来的几年里,咱们重写了很多利用,但这部分根本放弃不变。

治理工作室

  • 以 HarperDB REST API 为根底。
  • 用 React Native 编写
  • 容许通过 GUI 管制 HarperDB 实例。

HarperDB 治理工作室是建设在咱们微服务之上的 React 前端(所以咱们吃本人的狗粮)。JavaScript 有一个很赞的中央就是它的轻量级,不论你用的是什么框架(Node、React 等),你都能够很容易地把这些不同的层耦合在一起。React 很神奇,它扭转了前端开发的品质,让咱们的利用更容易上手。通过在此基础上进行构建,咱们也在同时测试咱们本人的 API– 这让它变得十分弱小。Jaxon,咱们的产品副总裁抉择了 React 作为 Studio,而 Stephen 则用 Express 编写咱们的后端报告。


AlaSQL

  • SQL 搜寻是建设在 AlaSQL 根底上的。
  • https://github.com/agershun/alasql
  • 容许加强的 SQL
  • 咱们的开发人员为我的项目做出了奉献

咱们抉择了 AlaSQL 来实现 HarperDB 的后端性能 ](https://dev.to/harperdb/alasq…,它外面有一些咱们没有的好货色,并且容许咱们把 Math.js 和 GeoJSON 这样的货色接入进来,所以它是一个不堪设想的包。 应用 Node 做这样的语言有一个惊人的益处,那就是随着技术的提高,你想要和须要的大部分酷炫的货色都在 npm 上。 如果咱们必须建设本人的 SQL 解析器,咱们可能还在建设 HarperDB。咱们的竞争对手之一 FaunaDB 花了大概 4 年工夫才进入市场,但咱们在 6 个月内推出了咱们产品的测试版,12 个月内推出了原始版本,几个月前咱们刚刚公布了咱们的云产品(大概 3 年后)。** 咱们并不是说咱们是蠢才,然而通过在 Node 中开发,咱们失去了站在像 AlaSQL 开发者这样的人的肩膀上,这也是咱们感觉 npm 社区的神奇之处。

Maths.js

  • HarperDB 在咱们的 SQL 中应用了 math.js 函数。
  • 容许加强数学能力,同时利用 npm 社区的能力。

Maths.js 是另一个令人难以置信的包,用于平均数、数据迷信等方面,咱们把它接入了咱们的 SQL 性能。它并不难用,与 AlaSQL 联合起来十分弱小。

集群 / 复制

  • 基于 SocketCluster.io 建设的。
  • 容错
  • 点对点
  • 表层复制
  • 寰球共享模式
  • 分布式计算

在 Node.js 中构建一些货色的另一个十分酷的个性是,它的实质是无状态的,这意味着它不须要在内存中持有对跨会话服务客户至关重要的数据,这十分节俭资源。大多数企业级利用都有后盾过程和有状态的变量,会变得十分不稳固。Node 是无状态的,专为网络设计,设计成程度扩大,并且是点对点的。应用 Node 框架的一个惊人的益处是,咱们可能连贯 SocketCluster 来反对咱们的集群和复制。HarperDB 应用简略的 pub-sub 模型,所以咱们通过将数据公布到不同的聊天室来复制数据,不同的节点订阅这些数据,并且可能程度散布。Node 能够进行程度扩大,比其余语言的资源密集度更低,而且它的无状态个性使它的稳定性十分高。 通过将 Node 放在很多电脑上(程度扩大),你能够使框架的性能大大加强,同时降低成本,领有更容易的开发,并成为一个很棒的社区的一部分

LMDB 和文件系统

* 最后在文件系统上建设了咱们的爆炸数据模型。

  • 因为产生许多文件占用节点和过多的磁盘空间以及其余问题,存在问题。
  • 在 LMDB 上重建数据模型
  • 大幅提高性能

原本咱们是间接用文件系统与下面的 HarperDB 数据模型,这就是产品的独特之处。当数据进来的时候,咱们把它映射到咱们的数据模型上,它不是一个 SQL 引擎或者 NoSQL 引擎。咱们把这些数据分解成各个属性,而后存储在文件系统的文件夹构造中。咱们把每个货色都原子化地存储,你能够通过 SQL 和 NoSQL 来查问。咱们的确在规模上遇到了一些挑战,所以最近咱们在一个叫 LMDB 的包里接入了一个键值存储,咱们在下面操作。咱们可能在下面实现咱们准确的数据模型,它提供了令人难以置信的性能晋升。在最近的一次基准测试中,咱们比 MongoDB](https://harperdb.io/harperdb-…,这次要得益于 LMDB。

退出移动版