关于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。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理