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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。