从头开始构建用 Node.js 编写的数据库

2025-05-27

从头开始构建用 Node.js 编写的数据库

Node 轻量且可扩展,允许我们快速开发,并且 npm 拥有令人难以置信的包。

HarperDB 的创始团队构建了第一个也是唯一一个用 Node.js 编写的数据库。几个月前,我们的首席执行官Stephen Goldberg受邀在 Women Who Code 的聚会上发言,分享了这个(有些人称之为疯狂的)项目的故事。Stephen 讨论了数据库的架构层,演示了如何使用 Node.js 构建高度可扩展和分布式的产品,并演示了 HarperDB 的内部工作原理。您可以通过上面的链接观看他的演讲,甚至可以阅读他2017 年的一篇文章。但由于我们都热爱 Node.js,而且它是一个有趣的话题,所以我将在这里进行总结。

我们选择用 Node 构建数据库的主要原因(也是最简单的原因)是我们对它非常了解。我们因为没有选择 Go 而受到批评,但现在人们已经接受了 Go 和 Node 本质上是旗鼓相当的(在流行度和社区支持方面)。我们的联合创始人之一 Zach 意识到,考虑到学习一门新语言所花费的时间,这绝对不值得。

使用 Node.js 构建数据库的优点

  • 我们已经了解 Node.js
  • 轻的
  • 快速发展
  • 高度可扩展
  • npm

HarperDB 团队拥有大规模软件开发的背景。我们数据库的最初目标是创建一个工具,使开发人员能够专注于编码,而无需投入时间和精力进行数据库维护,同时仍然提供强大的解决方案。我们希望人们能够对所使用的产品感到舒适和自信。我们的团队在 Node 以外的其他语言方面拥有丰富的经验,但我们在 Node 编程方面取得了巨大的成功。(尽管 Stephen 之前是 Java 程序员,但他一开始觉得 Node 很糟糕,但大约 90 天后,他就爱上了它)。Node 轻量级,使我们能够快速开发,而且 npm 拥有非常棒的软件包。

在 Node.js 中构建数据库的缺点

  • 当时还不被接受为“企业级语言”
  • 无法直接控制操作系统/文件系统
  • 性能不如 C/C++
  • 以前没有原生线程(现在有了)

我们确实遇到了一些麻烦……作为第一个用 Node.js 编写的数据库,我们没有选择跟随任何人的脚步。我们可能是有史以来用 Node 构建的首批企业产品之一,至少是最以数据为中心的产品。人们对此提出了质疑。有人告诉史蒂芬,他宁愿用勺子挖出自己的心脏,也不愿用 Node.js 编写数据库。现在人们意识到这是一个好主意,因为我们的产品中拥有所有这些我们无需构建且与我们的工作固有功能相结合的令人难以置信的功能。我们确实遇到了无法直接控制文件系统中的操作系统的挑战。此外,C/C++ 速度更快,但可能更复杂,并且不一定具有水平可扩展性。这实际上取决于您是在寻找垂直计算还是水平计算。

技术栈

替代文本
我们的技术栈如下。我们将Management Studio视为HarperDB 堆栈的一部分,该堆栈基于 React 构建,后端为 Node。绿色方框表示任何基于 HarperDB 构建的应用程序,例如,我们的Node-RED 节点可用于构建自定义工作流。HarperDB 技术完全基于 Node.js 构建,这涵盖了我们的接口和 HarperDB 核心。

我们的产品以 REST API 的形式呈现,其底层本质上只是一个 Express 应用程序,它是您与 HarperDB 交互的主要接口。我们的 NoSQL 解析器是我们内部构建的自定义解决方案。我们使用 AlaSQL 实现 SQL 解析功能(您可以在此处了解更多信息),并在其基础上使用自定义代码扩展其功能,这是一个非常棒的 SQL 解析 npm 包。我们提供由合作伙伴构建的驱动程序,例如 ODBC 和 JDBC。最后,我们使用 SocketCluster 进行分布式计算和集群,我们的首席技术官在 8 月份对此进行了介绍

HarperDB 核心技术蕴含着“秘诀”。这使我们能够实现完全索引,避免数据重复,并为单一数据模型提供各种接口选项。核心中实现了众多 npm 软件包来扩展我们的功能。

最后,我们有多种存储介质选项。我们默认捆绑 LMDB,因为它比其他选项性能显著提升。HarperDB 核心包含可扩展代码,允许我们将来添加其他存储介质选项。

REST API

  • HarperDB 是一组微服务
  • 单个端点
  • 所有操作均在后期进行
  • 无状态/RESTful

替代文本(示例代码位于https://harperdb.io/docs/overview/

在之前工作的公司,我们团队曾面临数百个 API 和不同端点的难题,简直让人抓狂。有人可能会觉得 HarperDB 只有一个端点很奇怪,但如果你仔细看看代码主体,就会发现,对于每个操作,你只需要修改代码主体,也就是最开始的几行。这非常简单,在编写基于 REST 的应用程序时,可以让它变得非常简单。你可以从我们这里学到这个,并将其应用于任何应用程序!基本上,你只需向 API 发送一条消息,我们就能看到你正在执行的操作,并使用一组标准方法进行处理。在过去的几年里,我们重写了应用程序的很多部分,但这部分基本保持不变。

管理工作室

  • 基于 HarperDB REST API 构建
  • 使用 React Native 编写
  • 允许通过 GUI 控制您的 HarperDB 实例

替代文本

HarperDB Management Studio是一个基于我们微服务构建的 React 前端(所以我们自己开发)。JavaScript的一大优势在于它非常轻量,无论你使用什么框架(Node、React 等),你都可以轻松地将这些不同的层级组合在一起。React非常棒,它改变了前端开发的质量,并让我们的应用程序更容易访问。通过在此基础上构建,我们同时也在测试我们自己的 API——这使得它非常强大。我们的产品副总裁 Jaxon 为 Studio 选择了 React,而 Stephen 则使用 E​​xpress 编写了我们的后端报告。

AlaSQL

我们选择 AlaSQL 作为 HarperDB 的后端功能,它拥有一些我们没有的优秀功能,并允许我们连接 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 是无状态的,专为 Web 设计,旨在实现水平扩展和点对点连接。使用 Node 框架的一个惊人优势是,我们能够接入 SocketCluster 来支持我们的集群和复制。HarperDB 使用简单的发布-订阅模型,因此我们通过将数据发布到不同的聊天室来复制数据,不同的节点订阅这些聊天室,并能够水平分发数据。与其他语言相比,Node 可以水平扩展,并且资源占用更低,其无状态特性使其非常稳定。通过将 Node 部署到大量计算机上(水平扩展),您可以显著增强框架的功能,同时降低成本、简化开发流程,并成为一个优秀社区的一部分。

LMDB 和文件系统

  • 最初在文件系统上构建我们的爆炸数据模型
  • 由于生成大量文件占用 inode 和过多磁盘空间以及其他问题而存在问题
  • 在 LMDB 上重建数据模型
  • 大幅提升性能

替代文本

最初,我们直接将文件系统与上述 HarperDB 数据模型一起使用,这就是该产品的独特之处。当数据进入时,我们将其映射到我们的数据模型,它不是 SQL 引擎或 NoSQL 引擎。我们将数据分解为各个属性,并将它们存储在文件系统上的文件夹结构中。我们以原子方式存储每件事,您可以通过 SQL 和 NoSQL 进行查询。我们确实遇到了一些规模上的挑战,所以最近我们连接了一个名为 LMDB 的包,这是一个我们在其上操作的键值存储。我们能够在其基础上实现我们精确的数据模型,并且它带来了令人难以置信的性能提升。在最近的基准测试中,我们的速度比 MongoDB 快 37 倍,这在很大程度上要归功于 LMDB。

再次,通过利用令人惊叹的 Node 社区,我们能够专注于我们擅长的领域。



您现在可能已经看出我们热爱 Node。希望本文对您有所帮助,并希望您从中有所收获,或者仅仅激发了您对 Node.js 的热爱。我们非常乐意听取您的意见,如果您有不同意见,也欢迎与我们探讨! :)

文章来源:https://dev.to/harperdb/building-a-database-writing-in-node-js-from-the-ground-up-2hgm
PREV
数据库架构和用例 - 解释
NEXT
Ruby 中的方法