一个用Node.js从头开始编写的数据库

Node 是轻量级和可扩展的,让咱们能够快速开发,并且 npm 有使人难以置信的包。javascript

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

咱们选择用Node构建数据库的主要(也是最简单的)缘由是咱们对它很是了解。咱们由于没有选择Go而受到了抨击,但如今人们已经接受了Go和Node基本上是头对头的关系(_在流行度和社区支持度上_)。咱们的联合创始人之一Zach认识到,若是花时间学习一门新的语言,那是不值得的。java

用 Node.js 构建数据库的优势

  • 咱们已经知道Node.js

*轻量级node

  • 快速发展
  • 高度可扩展性
  • npm

HarperDB团队拥有大型软件开发的背景。咱们数据库的最初目标是建立一个工具,使开发人员可以专一于编码,而没必要将时间和精力投入到数据库维护中,同时仍然提供一个强大的解决方案。咱们但愿人们对本身使用的产品感到温馨和自信。咱们的团队在Node之外的其余语言方面有着丰富的经验,但咱们在Node编程方面取得了巨大的成功。虽然来自Java,Stephen一开始认为Node很可怕,但在大约90天后,他学会了喜欢它)。Node是轻量级的,让咱们能够快速开发,并且npm有使人难以置信的包。git

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

*当时未被接受为 "企业级语言"。github

  • 不直接控制操做系统/文件系统。
  • 性能不如C/C++
  • 之前没有本地线程(如今有了)。

咱们确实遇到了一些麻烦......做为第一个用Node.js编写的数据库,咱们没有选择跟随任何人的脚步。咱们多是有史以来第一批用Node构建的企业产品之一,至少是最以数据为中心的产品。人们对此提出了质疑。有一我的对Stephen说,他宁愿用勺子把本身的心挖出来,也不肯意用Node.js来编写数据库的程序。如今,人们已经意识到这是一个伟大的想法,由于咱们的产品中有全部这些使人难以置信的功能,咱们没必要构建,而且是咱们所作的事情的固有功能。咱们确实遇到了挑战,围绕着不能直接控制文件系统中的操做系统。此外,C/C++的速度更快,但可能更复杂,并且不必定能横向扩展。这真的取决于你是在寻找垂直计算仍是水平计算。sql


Free NodeJS Tutorial for Beginners:mongodb

Image for post

](https://leanpub.com/tutorial-...数据库

Download: Tutorial for node jsnpm


Tech Stack

Image for post

这是咱们的技术栈的样子。咱们认为咱们的管理工做室是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

咱们选择了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创建的。
  • 容错
  • 点对点
  • 表层复制
  • 全球共享模式
  • 分布式计算

Image for post

Image for post

在Node.js中构建一些东西的另外一个很是酷的特性是,它的本质是无状态的,这意味着它不须要在内存中持有对跨会话服务客户相当重要的数据,这很是节省资源。大多数企业级应用都有后台进程和有状态的变量,会变得很是不稳定。Node是无状态的,专为网络设计,设计成水平扩展,而且是点对点的。使用Node框架的一个惊人的好处是,咱们可以链接SocketCluster来支持咱们的集群和复制。HarperDB使用简单的pub-sub模型,因此咱们经过将数据发布到不一样的聊天室来复制数据,不一样的节点订阅这些数据,而且可以水平分布。Node能够进行水平扩展,比其余语言的资源密集度更低,并且它的无状态特性使它的稳定性很是高。经过将Node放在不少电脑上(水平扩展),你可使框架的功能大大加强,同时下降成本,拥有更容易的开发,并成为一个很棒的社区的一部分

LMDB和文件系统

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

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

贴图

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

相关文章
相关标签/搜索