本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢!
我喜欢带着目标来学习新知识。因此学习nodejs过程中,不喜欢只看枯燥的语法和概念,喜欢做一些有实际应用意义的事情。这样写出来的代码更加的接地气,同时边写边学可以避免学习疲劳,算是寓教于乐。
所以在第四节课中,我开始尝试在nodejs中使用DynamoDB。为什么选择DynamoDB呢? 一方面它是目前云环境中最具代表性的NoSql数据库,另外一方面它在国外实在非常火,估计国内也会慢慢升温。因此后下手不如先下手,现在就开始接触使用DynamoDB,免得以后被动。
在使用DynamoDB之前,我们先了解一下DynamoDB。
Amazon DynamoDB 是一项快速灵活的 NoSQL 数据库服务,适合所有需要一致性且延迟低于 10 毫秒的任意规模的应用程序。它是完全托管的云数据库,支持文档和键值存储模型。其灵活的数据模型和可靠的性能令其成为移动、Web、游戏、广告技术、物联网和众多其他应用的不二之选。
如果使用DynamoDB,那么就要再Amazon中创建DynamoDB实例。哎,这都是钱啊。 虽说学习都是要成本的, 但这个成本有点高。Amazon也想到了这个问题,因此提供了一个DynamoDB Local版本,用于开发和测试。 Amazon也算业界良心~
OK,那就使用DynamoDB Local版本吧。 在Amazon中是这样介绍DynamoDB Local的,请看下面:
DynamoDB Local版本是一个自由免费下载,可以在本地计算机中运行的DynamoDB服务工具。通过DynamoDB Local,开发人员可以在本地使用DynamoDB API脱离真实的DynamoDB Web服务来开发应用。但可以获取到几乎和使用真实DynamoDB Web服务相同的效果。开发人员可以在本地任意的创建表,修改数据。这些变化都会被DynamoDB Local记录并跟踪起来。有了DynamoDB,开发人员就可以完全脱离DynamoDB Web服务,甚至连网络连接都可以不需要了。
DynamoDB Local如此之好,但只能用于本地开发和测试用途。当应用发布上线之时,还是需要将数据库切换到真实的DynamoDB Web Service中。但仅仅是需要切换数据库服务而已,应用中的代码都不需要做任何变更。
DynamoDB Local介绍完了,我们看一下如何下载和使用DynamoDB Local。
点击这里下载DynamoDB Local。请注意:目前DynamoDB Local仅支持JRE6.X及其以上版本。如果读者当前机器JRE版本过低,呵呵,执行upgrade吧。
下载下来的DynamoDB Local是一个压缩包。解压后放在任意目录都可以(说是这样说,但还是建议放到一个比较好找的目录为好。免得时间一长,找不到。)
打开一个终端,或者CMD窗口。切换到解压后的目录。执行下面的命令,简单测试一下是否正常:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
正常情况下,会显示dynamodb服务已经绑定到本地的8000端口。如下图:
{ dynamodb_local_2013-12-12 } » java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb /d/workspaces/workspaces-nodejs/dynamodb_local_2013-12-12 2015-09-11 09:27:27.416:INFO:oejs.Server:jetty-8.1.12.v20130726 2015-09-11 09:27:27.549:INFO:oejs.AbstractConnector:Started [email protected]0.0.0.0:8000或者是下面的输出:
Initializing DynamoDB Local with the following configuration:
Port: 8000
InMemory: false
DbPath: null
SharedDb: true
shouldDelayTransientStatuses: false
CorsParams: *
这取决于JDK版本。
DynamoDB可以接受其他命令参数,主要有以下几个:
-cors value -dbPath value -delayTransientStatuses -help -inMemory -optimizeDbBeforeStartup -port value -sharedDb
如果想看DynamoDB的使用说明,可以执行java -jar DynamoDBLocal.jar -help来查看,如下图所示:
[email protected]:~/team/andy/nodejs/src/dynamodb$ java -jar DynamoDBLocal.jar -help usage: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar [-port <port-no.>] [-inMemory] [-delayTransientStatuses] [-dbPath <path>][-sharedDb] [-cors <allow-list>] -cors <arg> Enable CORS support for javascript against a specific allow-list list the domains separated by , use ‘*‘ for public access (default is ‘*‘) -dbPath <path> Specify the location of your database file. Default is the current directory. -delayTransientStatuses When specified, DynamoDB Local will introduce delays to hold various transient table and index statuses so that it simulates actual service more closely. Currently works only for CREATING and DELETING online index statuses. -help Display DynamoDB Local usage and options. -inMemory When specified, DynamoDB Local will run in memory. -optimizeDbBeforeStartup Optimize the underlying backing store database tables before starting up the server -port <port-no.> Specify a port number. Default is 8000 -sharedDb When specified, DynamoDB Local will use a single database instead of separate databases for each credential and region. As a result, all clients will interact with the same set of tables, regardless of their region and credential configuration. (Useful for interacting with Local through the JS Shell in addition to other SDKs)
但实际情况中发现,在JDK1.8中,执行help命令不显示。在其他JDK版本中,可以正常显示。暂不清楚是否和JDK有关系,但不影响DynamoDB的使用。
下面开始讲解各个参数:
-cors <arg> 用于运行javascript的跨域访问。如果启动用了这个参数,那么就必须提供allow参数。 默认情况下是*,即允许所有请求。
-dbPath <path> 设定存放数据库数据文件的路径。如果不指定,那么就使用当前目录存放数据。请注意:此选项和--inMemory冲突,不可同时使用。
-delayTransientStatuses 启用DynamoDB延时操作。DynamoDB Local在本地执行时,几乎所有操作都是实时完成的,没有延时。但在实际的DynamoDB Web Service中,是存在一定延时的。因此如果需要更加接近实际DynamoDB的场景,就建议使用此项参数。但请注意,此项参数只能尽可能的接近实际情况,但不会百分百的模拟实际情况。
-help 没啥好说的,输出帮助信息。内容请见上面。
-inMemory DynamoDB Local可以将数据保存到本地,也可以将数据保存到内存中。上面的-dbpath就是保存到本地,这里就是保存到内存。至于区别嘛,就是一个可以持久化,一个没法持久化。呵呵,除此之外,没啥区别。
-optimizeDbBeforeStartup 如果启用了此项参数,就可以在DynamoDB Local启动时首选初始化底层数据库。背后的事情,就是将持久化的数据加载到服务中。因此使用此项参数时,必须同步使用-dbPath参数。
-port <port-no.> 默认端口是8000.如果8000被占用了,就可以通过这个参数绑定其他端口。
-sharedDb DynamoDB默认为每个用户标示一组数据库文件。用户之间是隔离,无法访问的。但通过这个参数,就可以允许其他用户访问此用户的数据库。
好了,说完参数的用法,开发人员就可以愉快的使用DynamoDB了。
剩下的一点时间,简单说一下DynamoDB Local和实际的DynamoDB Web service有什么不同:
- DynamoDB Local不判别用户注册区域和AWS账户有效性
- DynamoDB Local没有吞吐量限制。API中的相关参数都会被忽略。例如,用户可以无限制的使用CreateTable,一天之内无限的UpdateTable。所有的吞吐量限制在Local模式都会被忽略。
- DynamoDB的执行速度,仅仅与本地机器配置有关。即便采用了延时参数,那么有些操作也会比实际DynamoDB Web Service要快得多。例如CreateTable和DeleteTable几乎都是瞬间完成,数据库中的表几乎都是ACTIVE状态。只有当UpdateTable影响到全局二级索引时,会有短暂的CREATING和DELETING状态,很快就会恢复为ACTIVE状态。而在实际DynamoDB服务中,这些都会消耗大量的时间。
- 在DynamoDB Local模式中,会有很强的读一致性。这是因为所有本地操作都是在本地完成的,几乎可以忽略脏数据的影响。除非用户的机器性能有点低....
- Local模式不记录占用的容量。如果API要求返回此值,那么就是nulls
- Local模式也不记录项目记录信息。 如果API要求返回,那么也是nulls
- 在实际的DynamoDB Web Service中,每次只会返回1MB的数据。在Local模式,同样存在此项限制。但在查询索引时有一些区别,DynamoDB Web Service仅计算Key和Value所占数据量,而Local会计算所有项目数据。
- 在使用DynamoDB数据流时也有区别:DynamoDB Web Service所创建的分片会受到表分区的影响。而在Local模式中,不存在表分区。所有的分片都是临时,因此在Local模式中,程序不应过分依赖分片结果。
恩。好了,DynamoDB Local的基本情况讲解完毕了,下节课可以尝试在Nodejs中使用DynamoDB了。
OK,下课。起来~