- 数据库
- 文档数据库
- 分布式数据库
【免费下载链接】rethinkdb
The open-source database for the realtime web.
RethinkDB 是一个面向实时 Web 应用的开源分布式数据库,其核心能力是「把数据库的更新结果持续推送给应用」,而不是让客户端轮询。本文以仓库根目录的 README.md 为主体,结合 changefeed 源码、构建系统文档 与 Windows 构建说明 等仓库证据,系统讲解 RethinkDB 的定位与实时订阅模型、驱动生态,以及从源码完成编译安装的完整流程,读完即可动手构建并理解其实时数据推送的底层机制。
一、RethinkDB 是什么:面向实时 Web 的开源数据库
README 开篇用四句话概括了 RethinkDB 的定位:
- 开源(Open-source):面向实时 Web 应用构建的数据库;
- NoSQL:存储无需预定义模式(schemaless)的 JSON 文档;
- 分布式(Distributed):易于横向扩展;
- 高可用(High availability):支持自动故障转移(automatic failover)与健壮的容错能力。
README 中将其描述为"第一个为实时应用构建的开源可扩展数据库"(first open-source scalable database built for realtime applications)。它引入了一种全新的数据库访问模型:开发者可以告诉数据库持续把更新后的查询结果推送给应用(push updated query results to applications),无需轮询(polling)变更。这一模型让开发者以更少的时间和精力构建可扩展的实时应用。
这一「推送模型」在仓库源码中有明确对应的实现——即changefeed(订阅变更流)机制,下面一小节深入展开。
二、实时数据推送的核心机制:Changefeed 订阅模型
2.1 从概念到实现:客户端与服务器的分工
在 src/rdb_protocol/changefeed.hpp 中,changefeed命名空间把实时推送拆分为两类角色:
client_t(客户端侧):存在于处理 changefeed 查询的服务器上,位于rdb_context_t中。当查询订阅某张表的变更时,它会调用new_stream返回一个数据行流(stream of rows)。client_t内部维护了一张从表 UUID 到real_feed_t的映射,保证每个 <表, 客户端> 组合最多只有一个real_feed_t,从而避免产生冗余的集群消息(见 changefeed.hpp#L203-L210 的注释说明)。server_t(分片侧):作为store_t的成员变量存在(见 src/README.md 对 changefeed 处理流程的描述),负责把写入事件推送给订阅的客户端。
具体的数据流是:处理查询的服务器把其changefeed::client_t的 mailbox 地址封装进read_t发送给各分片,分片随后将变更数据直接推回该地址;feed_t与subscription_t这两个类(见 changefeed.cc#L1345-L1346)承载了订阅与分发写入的实际逻辑。
2.2 订阅选项:控制推送内容与节奏
从 changefeed.hpp 中keyspec_t::range_t的构造参数可以看到,订阅变更流时可以配置以下选项:
include_initial:是否在订阅时先推送当前表/查询的已有数据;include_offsets:是否包含变更偏移量信息;include_states:是否推送状态事件;include_types:是否标注每条变更的类型;squash:写入合并(聚合)策略——仓库的 README 捐赠者一节提到,squash支持按表配置写入聚合,甚至可将写入延迟设为无限以构造纯内存表。
这些参数决定了 changefeed 推送的内容粒度,是使用 ReQLchanges()命令时的核心控制面。
2.3 典型实时应用场景
README 给出了一批基于 RethinkDB + changefeed 的真实场景样例,可用于判断这类数据库适合解决哪些问题:
- 用 RethinkDB 与 PubNub 构建实时直播博客(realtime liveblog);
- 创建协作式图片分享白板;
- 用 Go 编写基于 changefeed 的IRC 机器人;
- 实时查看Instagram 上的猫咪图片流;
- 教育平台 Platzi 使用 RethinkDB 支撑实时教学场景。
它们的共同点都是:数据一变,界面立刻响应,无需前端定时刷新。
三、快速上手与驱动生态
3.1 三分钟快速入门
README 指向官方 Quickstart 文档(rethinkdb.com/docs/quickstart),同时提供了四种官方语言的十分钟上手指南:
- JavaScript
- Python
- Ruby
- Java
3.2 官方与第三方驱动
除了四个官方驱动外,RethinkDB 社区还维护了大量第三方驱动。需要说明的是,驱动代码已不在本仓库内——mk/README.md 明确注明 "Drivers have been removed from this repository",本仓库只包含服务器本体。以下是 README 中列出的社区驱动清单:
| 语言 | 驱动 |
|---|---|
| C#/.NET | RethinkDb.Driver、rethinkdb-net |
| C++ | librethinkdbxx |
| Clojure | clj-rethinkdb |
| Elixir | rethinkdb-elixir |
| Go | GoRethink |
| Haskell | haskell-rethinkdb |
| PHP | php-rql |
| Rust | reql |
| Scala | rethink-scala |
3.3 继续探索 ReQL
如需深入 RethinkDB 的能力清单与 ReQL(Realtime Query Language)API 细节,README 指引读者查阅官方文档与 ReQL API 页面。ReQL 查询在仓库中的执行入口是 rdb_protocol/term.hpp 中的ql::compile_term()——客户端消息被编译为ql::term_t语法树后逐节点求值;求值结果最终通过ql::datum_t(见 rdb_protocol/datum.hpp)表示。
四、从源码构建 RethinkDB
4.1 安装系统依赖
以 Ubuntu / Debian 为例,README 给出的依赖安装命令为:
sudo apt-get install build-essential protobuf-compiler \ # python \ # for older distros python3 python-is-python3 \ libprotobuf-dev libcurl4-openssl-dev \ libncurses5-dev libjemalloc-dev wget m4 g++ libssl-dev一般而言,构建需要以下组件:GCC 或 Clang、Protocol Buffers、jemalloc、Ncurses、Python 2 或 Python 3、libcurl、libcrypto (OpenSSL)、libssl-dev。这份依赖清单与 snap/snapcraft.yaml 中声明的build-packages完全一致,可作为跨平台参考。
4.2 三步骤构建流程
README 给出的标准构建流程:
./configure --allow-fetch # or run ./configure --allow-fetch CXX=clang++ make -j4 # or run make -j4 DEBUG=1 sudo make install # or run ./build/debug_clang/rethinkdb关键点解析:
--allow-fetch:允许自动抓取并构建缺失的第三方依赖。在 configure 脚本中,该选项被解析为allow_fetch=true(configure#L288),当检测到缺失依赖时会提示"Try running ./configure with --allow-fetch"(configure#L451)。snap 打包配置同样以configflags: ['--allow-fetch']方式使用它。make -j4:并行编译,-j后数字可按 CPU 核数调整;mk/README.md 建议取"核数 + 1"。DEBUG=1:构建调试版本,产物路径为./build/debug_clang/rethinkdb;release 版默认产物在build/release/rethinkdb。CXX=clang++:指定使用 Clang 而非默认的 GCC 编译器。
4.3 常用 make 目标与变量
构建系统细节记录在 mk/README.md,常用目标速查如下:
| 目标 / 变量 | 作用 |
|---|---|
make clean | 删除整个build/目录 |
make rethinkdb | 仅构建服务器可执行文件 |
make unit | 构建并运行单元测试 |
make test | 运行单元测试、ReQL 测试与集成测试 |
make support/make fetch | 构建 / 抓取尚未就绪的依赖 |
make install-binaries | 仅安装服务器可执行文件 |
make VERBOSE=1 | 显示每条被执行的命令及输出 |
make SHOW_COUNTDOWN=0 | 关闭[3/301]形式的进度计数前缀 |
make DEBUG=1 | 调试模式构建 |
make SYMBOLS=0 | 剔除调试符号 |
make ALLOW_WARNINGS=0 | 启用-Werror,编译器产生警告即失败 |
./configure --ccache | 用 ccache 加速重复构建 |
./configure --prefix | 指定make install的安装前缀目录 |
make var-<VAR> | 打印某个构建变量的值 |
此外,mk/README.md 还提到一些面向旧发行版与跨平台移植的选项:THREADED_COROUTINES=1、NO_EVENTFD=1、NO_EPOLL=1、BUILD_PORTABLE=1、LEGACY_LINUX=1。所有可传给make的变量清单见 mk/defaults.mk,完整 configure 选项可用./configure --help查看。
4.4 FreeBSD 与 Windows 构建
FreeBSD(mk/README.md,已在 FreeBSD 13 上验证):
pkg install git gcc gmake python ./configure --allow-fetch CXX=g++ gmake注意:尽管指定了
CXX=g++,QuickJS 依赖仍固定用 Clang 编译,若改用CXX=clang++会导致链接异常。Windows:详见 WINDOWS.md。需要 Visual Studio 2022(桌面 C++ 工作负载 + MSVC v141 + Windows 10 SDK 10.0.19041.0 + CMake)、Cygwin(务必不要安装 perl 包,需 make/curl/wget/patch)、Strawberry Perl(供 OpenSSL 使用)与 Premake5(供 quickjspp 使用)。在 Cygwin shell 中执行:
./configure make -j$(nproc)产物位于
build\Release_x64\rethinkdb.exe。若 make 报mk/gen缺文件,手动执行mkdir mk/gen后重新make -j即可。
4.5 版本与变更日志
本仓库的版本序列可通过两个文件交叉确认:src/version.hpp 中的cluster_version_t与reql_version_t枚举显示当前最新为v2_4(v2_4_is_latest);NOTES.md 的变更日志首条为Release 2.4.4(Night of the Living Dead),记录了 Data Explorer 自动补全修复、32 位 ARM 非对齐内存访问修复、zlib 下载地址替换等细节。升级方面,README 指向 NOTES.md 作为变更与功能说明的入口;从 2.4.x 内部升级无需迁移(见 NOTES.md 2.4.2 一节)。
五、许可、贡献与社区
- 许可:RethinkDB 由 Linux Foundation 以Apache 2.0开源协议发布,部分代码来自 Google 等第三方并依其许可协议使用。完整版权声明见 COPYRIGHT。
- 贡献:CONTRIBUTING.md 给出了参与方式:提交 issue、提交 pull request 或改进文档(文档在独立仓库)。合并 PR 前需接受Developer's Certificate of Origin(DCO)并对提交签名。管理界面(admin UI)的代码位于独立的
old_admin分支,其构建产物src/gen/web_assets.cc被编译进服务器可执行文件,供 Web UI 使用;开发期可用--web-static-directory参数直接指定静态资源目录而避免重编(见 mk/README.md)。编码规范见 STYLE.md。 - 帮助与社区:可通过官方社区页面提问、反馈 issue 或提交 bug;也可在 Slack、Twitter、IRC(Freenode 的
#rethinkdb)等渠道找到维护者。 - 支持者(Donors):README 感谢了 CNCF、Digital Ocean(提供基础设施与服务器)、Atlassian(OSS 许可证)、Netlify(OSS 许可证以维护官网)、DNSimple(DNS 服务)以及 ZeroTier(赞助了按表配置写入聚合的开发)。
六、从 README 出发的深入学习路径
如果你想从 README 继续深入,仓库内部文档给出了清晰的路线:
- mk/README.md:构建系统的完整目标与变量说明;
- WINDOWS.md:Windows 平台构建细节;
- src/README.md:服务器架构导览——线程池与协程(
arch/runtime/)、mailbox 与 directory 网络原语(rpc/)、查询执行链(rdb_protocol/)、每表一个 Raft 集群的元数据管理(clustering/generic/raft_core.hpp)等; - NOTES.md:各版本变更记录;
- src/rdb_protocol/changefeed.hpp 与 src/rdb_protocol/changefeed.cc:实时推送模型的核心实现;
- test/:单元测试与 ReQL 测试套件,可通过
make unit、make test运行。
总结
RethinkDB 的价值不在于"又一个 NoSQL 数据库",而在于它把实时推送做成了数据库的原生能力:应用通过 changefeed 订阅查询结果,数据变更由数据库主动推送而非客户端轮询。本文从 README.md 出发,覆盖了项目定位、changefeed 的源码级实现(client_t/server_t/feed_t/subscription_t与include_initial等订阅选项)、驱动生态,以及 Linux / FreeBSD / Windows 三端的完整源码构建流程。借助本文的命令与文档路径,你可以快速在本仓库中完成构建、运行,并顺着 src/README.md 的指引继续研读其线程池、B-tree 存储与 Raft 共识等内部实现。
- 数据库
- 文档数据库
- 分布式数据库
【免费下载链接】rethinkdb
The open-source database for the realtime web.
相关推荐
RethinkDB:实时Web的开源数据库革命
RethinkDB:实时Web的开源数据库革命 RethinkDB是一个专为实时Web应用设计的开源分布式数据库,始于2009年,由Michael Glukho
数据库文档数据库分布式数据库Geogramint高级功能:Extended Report与批量数据导出技巧
Geogramint高级功能:Extended Report与批量数据导出技巧 Geogramint是一款强大的Telegram开源地理定位OSINT工具,能够
AI小说生成入门指南:5分钟跑出第一部长篇,前后文不跑偏
AI小说生成入门指南:5分钟跑出第一部长篇,前后文不跑偏 写长篇最怕写到第10章,忘了第1章埋的伏笔。AI_NovelGenerator 是一款本地AI小说生成
人工智能大模型AI 应用AI 写作RAG桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考