RethinkDB的实时应用程序

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

关于新的分布式系统设计(如微服务)和新的客户端框架(如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推送的数据所需的所有代码:

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

我们的例子

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

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

模拟两个用户:

图1_49955

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

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

“ John”用户名注册:

图2_49955

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

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

{
  "deleted": 0,
  "errors": 0,
  "generated_keys": [
	"877503b1-e7d4-4cb0-a88b-da41340c5305"
  ],
  "inserted": 1,
  "replaced": 0,
  "skipped": 0,
  "unchanged": 0
}

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

DB---->registerRealtimeUserFeed pushing....
{
  "new_val": {
	"id": "877503b1-e7d4-4cb0-a88b-da41340c5305",
	"username": "John"
  },
  "old_val": null
}

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

高级应用程序数据流:

图3_49955

“ Sam”用户名注册:

图4_49955

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

{
  "new_val": {
	"id": "0b9e6987-b389-4256-87ca-3f780004029a",
	"username": "Sam"
  },
  "old_val": null
}
DB---->registerRealtimeUserFeed emit....:  John
{
  "deleted": 0,
  "errors": 0,
  "generated_keys": [
	"0b9e6987-b389-4256-87ca-3f780004029a"
  ],
  "inserted": 1,
  "replaced": 0,
  "skipped": 0,
  "unchanged": 0
}

约翰发送一条消息:

图5_49955

山姆发送一条消息:

图6_49955

最后的想法

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RethinkDB 设计用来存储 JSON 文档的分布式数据库,可通过简单操作实现多机分布式存储。支持表的联合和分组查询。什么是RethinkDB?RethinkDB 是从头打造的第一个开源、可扩展的JSON数据库,用于搭建实时网页。全新的访问模型颠覆了传统的数据库结构:开发者只需告诉RethinkDB实时连 续地将查询更新结果推送到应用就可以了,不用每次都去poll一遍。RethinkDB实时推送结构为搭建可扩展实时应用节省了大量时间精力。除了为实时应用提供了全新的设计之外,RethinkDB 还提供了一种灵活的查询语言、直观的操作和监控API,安装学习起来也非常容易。你可以查看这篇 Advancing the realtime web 得到更多RethinkDB计划的技术细节。什么时候RethinkDB是一个好的选择?当你的应用很大程度上有赖于数据的实时反馈时,RethinkDB 就会成为一个很棒的选择。“查询-响应”式的数据库访问模型在web上的确很有用,它可以直接映射到HTTP的“请求-响应”。而现代应用则需要将数据直接实时地传送到客户端。能够最大化得益于RethinkDB实时推送架构的例子包括:协作网站和移动应用数据流分析应用多人在线游戏实时交易场所设备联机举个例子:在协作设计一个app的时候,其中一个用户改变了某个按钮的位置,服务器就必须在第一时间通知所有在完成同一项目的其他用户。网页浏览器 能够通过WebSockets和http持久连接来支持这一功能,但数据库系统要迎合实时需求仍然是一个大的工程难题。而RethinkDB作为第一个开 源、可扩展的数据库,就是特别为实时推送数据到应用而设计的。哪些人在用 RethinkDB?RethinkDB 的用户包括上百个科技创业公司、咨询工作室和世界五百强企业。这里是其中的一些:Jive Software 和 Mediafly 使用RethinkDB搭建强大的响应式网页和移动应用Pristine.io 和 Narrative Clip 使用RethinkDB搭建用于设备连接的云架构Platzi 和 Workshape.io 使用RethinkDB进行实时分析CMUNE 和 NodeCraft 使用RethinkDB构建大规模可扩展多人游戏RethinkDB 拥有超过十万开发者的活跃社区和上百个来自世界各地的代码贡献者。RethinkDB是基于现有技术的吗?高效实现实时推送架构需要重新设计绝大部分的数据库成分,包括查询执行引擎、分布式系统、超高速缓存子系统和存储引擎。因为架构影响到每一个数据库 组成部分,RethinkDB不得不从C 开始一步步写起来。RethinkDB 是由数据库专家组成的团队花了五年时间做出来的,还得到了来自世界各地上百个代码贡献者的帮助。RethinkDB和realtime sync不同在哪里?和Firebase, PubNub 或者Pusher 这类实时同步API相比,RethinkDB主要不同在以下三个方面:首先,实时同步API是云服务,而RethinkDB 是开源项目。RethinkDB也有云端,可以通过我们的合作伙伴 Compose.io 和 Amazon AWS获得。它还可以部署在你自己的架构中,没有任何限制。其次,同步实时API只局限于同步文档,而RethinkDB是一个有着更普遍应用范围的数据库系统。 在RethinkDB中你可以运行任意query,包括table joins, subqueries, geospatial queries, aggregation, 还有map-reduce。实时同步服务有更多查询功能上的限制。最后,实时同步API的设计是直接从浏览器访问。这使得基本的app能够快速地跑起来,然而一旦app扩展了,灵活性就会受到限制。 RethinkDB的设计是从应用服务器进行访问,这一点上更像是传统的数据库。可能会要多花一点设置代码,但拥有足够的灵活性去适应应用的成熟。RethinkDB和MongoDB又不同在哪里?RethinkDB所基于的架构和MongoDB非常不同。开发者只需告诉RethinkDB实时连续地将查询更新结果推送到应用就可以了,不用 每次都去poll一遍。你同样可以在RethinkDB上用传统的“查询-响应”范式来书写应用。然后在你开始为app添加实时功能时再去订阅实时数据 流。举个例子,这是你让RethinkDB查询一个文件时的命令:r.table('users').get('coffeemug').run()然后这是你从RethinkDB订阅更新流时用到的语句,在任何时候文档发生了变化就会推送:r.table('users').get('coffeemug').changes().run()RethinkDB实时架构可以和MongoDB的oplog相提并论,但前者提供了更高层次的抽象。RethinkDB的数据流与查询计算引擎无缝整合,并允许你订阅查询结果的变化,而不仅仅是把数据复制过来。这种架构大幅度地减少了搭建实时app所需的时间和精力。除了实时推送架构,RethinkDB 还有许多胜过 MongoDB的地方:一种高级的查询语言,能够支持table joins, subqueries 和大规模并行式分布计算。融合了查询语言的操作和监控API,大幅度降低了RethinkDB扩展的难度。简洁美观的UI 易于复制转发,拥有在线文档支持和查询语言建议。可以看看这篇 technical comparison of RethinkDB and MongoDB 里面的评论比较中立一些。想听听个人观点的,请看@coffeemug 的what makes RethinkDB different.什么时候RethinkDB是一个不好的选择?当你需要用到完整ACID支持或者更强大的架构实施,RethinkDB就不大好用了。在这种情况下你最好用一些传统的MySQL或者PostgreSQL数据库。如果你需要做深度、密集型计算分析的话,你最好用Hadoop或者类似于Verticaa的面向列的存储工具。在某些情况下RethinkDB会在一定程度上牺牲书写可用性(write availability)来保证数据一致性(data consistency)。如果高要求的书写可用性对你来讲很重要,那你也不要纠结了,像Riak这样的Dynamo式系统可能更适合你。想要更多地学习RethinkDB?阅读 ten-minute guide 开始学习RethinkDB。对于熟悉分布式系统的程序员可以直接阅读 architecture overview 。走捷径用 cookbook,你可以看到许多常用的 RethinkDB查询例子。 标签:分布式数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值