绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
RethinkDB的实时应用程序
2022-04-08 17:12:20

在过去的几年中,对企业应用程序提出了新的要求和期望,这些要求和期望极大地增加了应用程序代码的复杂性。 用户希望动态网站提供即时数据反馈或让多个用户同时处理同一文档。 新的框架和思想也随着要求的发展而发展,以帮助应对新的应用程序功能。

关于新的分布式系统设计(如微服务)和新的客户端框架(如AngularJS)的讨论主导了开发人员的讨论。 这种统治是有道理的。 他们为解决实际问题提供了很好的解决方案。

讨论中被低估的领域之一是持久层。 RethinkDB将提供讨论的火花。

新的应用程序功能使传统的数据存储技术紧张。 对于大多数企业应用程序而言,对整个数据存储使用单个数据库管理系统(例如RDBMS)并不是可行的解决方案。

多语言持久性

作为对这一变化的认可,马丁·福勒(Martin Fowler)在2011年发表了关于多语言持久性的文章。马丁·福勒(Martin Fowler)表示:“任何体面的企业都将针对不同种类的数据采用多种不同的数据存储技术”(MF 2011)。

传统上我们首先开始使用数据库技术并试图强迫其以所需的方式操作数据,但马丁·福勒(Martin Fowler)指出,新技术使我们能够确定我们首先要如何操作数据,然后确定哪种技术可以与之匹配好。

没有一种数据库技术可以为所有数据处理需求提供适当的解决方案。 RDBMS擅长存储数据,但是它不能提供与Elasticsearch相同的可扩展搜索功能。 微服务的另一个好处是,每个微服务都提供了特定的数据需求。 较小的服务边界使查找每种服务数据需求的存储技术变得更加容易。

对实时数据馈送的需求一直在稳定增长。 物联网(IoT),并发内容编辑以及快速变化的共享数据集正在推动对数据存储技术的新需求。 客户端轮询服务器以检查信息是否更改不是可伸缩的解决方案。 轮询会使服务器不堪重负。 更具扩展性的解决方案是在数据更改时将数据“推送”到客户端。 将此功能添加到应用程序服务会增加很多代码和复杂性。

重新思考数据库

RethinkDB的亮点在于提供实时数据提要。 RethinkDB是一个JSON数据库,可将查询结果推送到应用程序。 通过在数据库中具有“推送”功能,它可以大大简化应用程序服务。 通过使用JSON Documents,它使使用任何语言的数据处理变得非常容易。 RethinkDBJavaScript客户端与Node.JS集成良好。

在此示例应用程序中,我将使用:

  • RethinkDB作为数据库
  • Node.JS作为后端服务器
  • 服务器和客户端之间的通信通道的Socket.IO,反之亦然
  • 客户端上的jQuery只是为了保持简单。

入门

首先,请按照其网站上的RethinkDB安装说明进行操作 。 您还应该阅读30秒快速入门10分钟指南 。 Windows用户将需要从RethinkDB源进行构建,因为当前没有可用的安装程序。 Windows安装程序正在开发中。

RethinkDB带有一个Web界面(默认为http:// localhost:8080),该界面允许数据库管理和运行数据查询。

GitHub上提供了示例应用程序的源代码。 该应用程序需要NPM和NODE.JS。 请按照README.md中的说明进行操作。

./db/config.js文件设置数据库和表(如果它们不存在)并包含数据库API。 除此之外,实际上没有任何其他事情可以让RethinkDB使用默认配置在本地运行。 展望未来,我将专注于设置数据反馈接线。 RethinkDB文档很好地解释了所有内容。 :)

这是接收从RethinkDB推送的数据所需的所有代码:

  1. r.db('realtime').table('users').changes().run(connection, function (err, cursor) {
  2. cursor.each(function (err, row) {
  3. callback(row); //callback function passed in to do something with the data
  4. });
  5. });

我们的例子

在这个简单的示例中,我告诉RethinkDB我想接收对“ users”表的所有更改。 在一个真实的示例中,您将数据过滤到近的10个用户或一些小的子集。

提取代码并使应用程序运行后,启动两个浏览器(http:// localhost:3000)来模仿两个不同的用户。 每个用户都可以注册一个名称,并将消息发送给所有其他用户。 从服务器推送的每个消息都将显示给用户。

模拟两个用户:

图1_49955

当个用户通过单击“注册名称”按钮(1)注册用户名“ John”时。 这导致jQuery在Socket.IO通道上提交数据,该通道将数据发送到服务器。

一旦Socket.IO在服务器端接收到它,便会创建与RethinkDB实例的连接并保存用户名。 RethinkDB检测到Users表上的更改,然后异步将新数据推送到反馈侦听器。

“ John”用户名注册:

图2_49955

为了简洁起见,我只显示感兴趣的日志。

保留用户名后,RethinkDB返回一个JSON文档,该文档描述操作结果以及新创建的密钥。

  1. {
  2. "deleted": ,
  3. "errors": ,
  4. "generated_keys": [
  5. "877503b1-e7d4-4cb0-a88b-da41340c5305"
  6. ],
  7. "inserted": 1,
  8. "replaced": ,
  9. "skipped": ,
  10. "unchanged":
  11. }

正如预期的那样,新持久的用户导致对“用户”表的更改。 检测到更改后,RethinkDB将推送一个包含新值和旧值的JSON文档。 由于它是一个插入,因此我们不会在'old_val'属性中获取任何数据。

  1. DB---->registerRealtimeUserFeed pushing....
  2. {
  3. "new_val": {
  4. "id": "877503b1-e7d4-4cb0-a88b-da41340c5305",
  5. "username": "John"
  6. },
  7. "old_val": null
  8. }

在应用程序中,只有“用户名”信息通过Socket.IO发送到客户端,并立即广播给所有连接的用户(2)。

应用程序数据流:

图3_49955

“ Sam”用户名注册:

图4_49955

与“ John”类似,当“ Sam”注册时,我们会收到通知。

  1. {
  2. "new_val": {
  3. "id": "0b9e6987-b389-4256-87ca-3f780004029a",
  4. "username": "Sam"
  5. },
  6. "old_val": null
  7. }
  1. DB---->registerRealtimeUserFeed emit....: John
  2. {
  3. "deleted": ,
  4. "errors": ,
  5. "generated_keys": [
  6. "0b9e6987-b389-4256-87ca-3f780004029a"
  7. ],
  8. "inserted": 1,
  9. "replaced": ,
  10. "skipped": ,
  11. "unchanged":
  12. }

约翰发送一条消息:

图5_49955

山姆发送一条消息:

图6_49955

后的想法

对于我刚开始时使示例应用程序运行起来有多么容易,我有些悲观。 对于其他一些产品,该文档仅用几行代码就可以保证万无一失。 一旦进入,您会发现它实际上有多少工作。 让一个简单的应用程序与RethinkDB,Socket.IO和Node.JS一起使用非常容易,这令人耳目一新。

持久层负责推送数据,从而消除了服务中的许多代码和复杂性。 RethinkDB提供了针对特定数据需求的解决方案。 就像多语言编程表达了您应该使用适合该问题的编程语言的想法一样,多语言持久性也表示要使用适合该数据问题的佳数据库。

  • GitHub上提供了示例应用程序的源代码。

翻译自: https://www.javacodegeeks.com/2015/12/real-time-applications-rethinkdb.html

分享好友

分享这个小栈给你的朋友们,一起进步吧。

RethinkDB介绍
创建时间:2022-04-08 17:02:34
RethinkDB
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~