Tag: amazon dynamodb

dynamodb的最大项目长度(64k)的实用解决scheme和no-sql缺乏表连接

首先,我认为可能非常相关的一些背景情况: 我正在certificatedynanodb作为一个即将到来的应用程序的可行的解决scheme。 这是一个学习实验,熟悉dynamodb产品。 我的平台是amazon EC2(Linux),node.js和dynode库。 在no-sql的上下文中考虑一对多关系(例如标签,关键字,类别等)时,我的问题就出现了,无法连接表。 起初,它似乎是一个简单的事情:把它们存储为一个属性列表。 但是后来我读到了64KB的限制。 所以我的问题: DynamoDB中的一个项目(包括属性)(即包含其所有列的db行)不能超过总计64KB的二进制大小。 那么如何检查数据以确保它不会违反这个长度呢? 显然数字很简单,但“使用UTF8二进制编码的Unicode”string将是一个挑战。 这个问题的第二部分对于非sql的忍者来说可能是显而易见的:我怎样避免碰到这个限制,同时减轻不能连接表的负担? 一个冗长的答案可能超出问答格式的范围,但如果有人有意见或可以提供替代scheme,我应该探索解决64K长度,我将不胜感激。 最好的,并提前感谢任何和所有的build议。

如何快速构build大型分析服务器?

我需要快速构build大规模(七位数以上)的分析服务器,而且价格便宜。 Piwik将会是一个很容易的select,但是到目前为止,Piwik相当难以扩展,可能需要相当大的服务器来处理负载。 我的第二个想法是创build一个快速而肮脏的Node.js服务器,它将所有内容都推送到Amazon DynamoDB,以便人们可以从第一天开始收集数据,然后再构buildUI。 这将很快创build和缩放(垂直和水平)。 但是,我想知道DynamoDB是否是这种使用的正确select? (收集数据,生成报告)

Node JS和AWS sdk – 具有多个Expected值的putitem不起作用

我正在使用下面的代码来查询node.js / express框架内的dynamodb实例。 代码是查询一个名为User的表,它有一个没有范围的用户名的散列键主键。 它没有本地二级索引和3个全局二级索引(last_name-first_name,email_last-name和company_ [no range])。 我想防止重复的用户名和重复的电子邮件地址。 我可以成功阻止重复的用户名,但不能重复的电子邮件地址 文档声明“ComparisonOperator”:“NULL”或Exists:false行应该这样做(它们是互斥的,我不会同时尝试它们)。 但是,只有用户名validation由AWS sdk“尊敬”,即。 下面的代码可以防止重复的用户名被input到系统中,但重复的电子邮件仍然存在。 如果我将两个“Expected:”键(用户名和电子邮件)都保留下来,putitem只需添加一条新logging或者用相同的用户名(如文档状态和我所期望的)更新现有logging,但是只保留电子邮件密钥在将不会防止在数据库中重复的电子邮件。 请帮忙。 谢谢 var d = new Date(); var dt = d.getTime(); params = { TableName: 'User', Expected: { "username": { Exists: false // tried this also -> "ComparisonOperator": "NULL" }, "email": { Exists: false // tried this also -> "ComparisonOperator": "NULL" […]

AWS SDK与DynamoDB和putItem有关

我正在尝试使用aws-sdk与AWS的dynamodb进行交互 这是我的代码: DynamoDB.putItem({ "TableName": tblName, "Item": { "UserId": { "N": obj.user_id.toString() }, "Identifier": { "S": obj.identifier }, "ReferralToken": { "S": obj.referral_token }, "CampaignId": { "N": obj.campaign_id.toString() }, "FirstName": { "S": obj.first_name }, "LastName": { "S": obj.last_name }, "Gender": { "S": obj.gender }, "BirthDate": { "S": obj.birthdate }, "Username": { "S": obj.username }, "MobileNumber": { "S": […]

DynamoDB应用程序体系结构

我们使用DynamoDB和node.js和Express来创buildREST API。 为了简化操作,我们已经开始在后端使用Dynamo了。 我们已经开始使用AWS实验室的DynamoDB Document SDK来简化使用,并使得使用JSON文档变得容易。 要实例化一个客户端使用,我们需要执行以下操作: AWS = require('aws-sdk'); Doc = require("dynamodb-doc"); var Dynamodb = new AWS.DynamoDB(); var DocClient = new Doc.DynamoDB(Dynamodb); 我的问题是,为了确保数据的完整性,最后两步需要在哪里进行? 我担心一个对象正在等待Dynamo中发生的事情,被另一个进程接pipe,并且交换数据,导致不正确的数据被发送回客户端,或者不正确的数据被写入数据库。 我们有三个部分给我们的REST API。 我们有主要的server.js文件,它启动express和HTTP服务器,并为它分配资源,设置日志logging等。我们执行前两个步骤创build到Dynamo的连接,创buildAWS和Doc需求那点。 这些variables在应用程序中是全球性的。 然后,根据通过API执行的路由,调用一个控制器来parsing来自其他调用的input。 然后调用一个模型文件,与Dynamo进行交互,然后将响应提供给控制器,控制器会将返回包与任何错误一起格式化,然后将其发送到客户端。 该模型只是一组基本覆盖应用程序的相同区域的方法。 例如,我们将拥有一个用户模型,该模型涵盖了应用程序中的login和帐户创build等内容。 我已经完成了上面两个步骤来创build两个地方的发电机对象。 一个,我只是把他们放在一个地方,在每个模型文件的顶部。 我不会在下面的方法中重新使用它们,我只是简单地使用它们。 我们还在方法中实例化了它们,当我们准备对Dynamo进行调用时,使它们完全局限于方法,并在需要时将它们传递给第二个函数。 第二种方法一直让我感到最安全的做法。 然而,在负载testing下,我遇到了一些情况,我们似乎已经不堪重负了传出的networking连接,并且我开始收到错误,告诉我DynamoDB端点在我运行的区域不可用。我相信这是从进行连接所需的额外呼叫。 所以,问题是,创build这些模型文件的本地对象,安全,还是需要在使用它们的方法本地创build? 任何想法将不胜感激。

当我试图在cloudsearch上传一个文档时,我无法处理这个错误

我正在尝试使用Aws lambda函数对cloudsearch进行上传testing。 该函数应该上传一个dynamodb表格作为JSON文件到cloudsearch当dynamodb更新被触发,但我得到一个错误,我想弄清楚是什么意思,如何摆脱。 目前,我正在configurationtesting事件 这里是lambda函数: var aws = require('aws-sdk'); exports.handler = function(event,context){ var cloudsearchdomain = new aws.CloudSearchDomain({endpoint: 'doc-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.cloudsearch.amazonaws.com'}); var documents = {id : event.Records[0].dynamodb.Keys.Id.N}; documents.type = "add"; documents.fields = { "message" : "Hello", "id" : "100", "name" : "name" } var params = {contentType: 'application/json', documents : JSON.stringify(documents) }; console.log('uploading documents to cloudsearch domain', params); […]

Amazon Web服务DynamoDB请求缓慢

我目前正在使用库dynamoose来处理Node.js中的DynamoDB。 我一直在做一些testing,说明为什么我的快速请求在某些情况下需要超过1000毫秒的时间,并将其指向dynamicfunction。 进行扫描或保存时,每个请求需要约240ms的时间。 所以如果我不得不在一个function上做一些function,它可能会变长。 根据AWS,我的FAR低于我configuration的读写容量。 另外我的一个表格显示10-40毫秒的扫描和延迟。 这似乎并不坏,但仍然似乎稍高(可能是完全正常的寿)。 任何想法如何提高所有这一切的速度,所以我的数据库请求不需要240ms?

避免与nodejs的竞争条件

我正在使用nodeJS 6.3.0和aws DynamoDB编写一个应用程序。 dynamodb拥有从10个不同的function(10种不同的统计量度)中被添加到dynamodb的统计信息。 间隔时间设置为10秒,这意味着每10秒钟,10次调用我的function正在添加所有的相关信息。 putItem函数: function putItem(tableName,itemData,callback) { var params = { TableName: tableName, Item: itemData }; docClient.put(params, function(err, data) { if (err) { logger.error(params,"putItem failed in dynamodb"); callback(err,null); } else { callback(null,data); } }); 现在…我创build了一个队列。 var queue = require('./dynamoDbQueue').queue; 它实现了一个固定大小的简单队列,我使用http://www.bennadel.com/blog/2308-creating-a-fixed-length-queue-in-javascript-using-arrays.htm 。 这个想法是,如果有networking问题..让我们说一分钟。 我希望所有的事件都被推送到队列中,当问题解决后,发送队列信息给dynamodb并释放队列。 所以我将我的原始function修改为以下代码: function putItem(tableName,itemData,callback) { var params = { TableName: tableName, […]

Dynamoose / DynamoDB更新将空数组保存为空

我正在使用Node.js包Dynamoose处理我的Web应用程序中的DynamoDB请求。 问题是当我尝试更新该项目,每当JSON对象包含一个空的数组Dynamoose似乎将其设置为null。 或者对于我所知道的,它可以是DynamoDB。 下面是我用于这个表的模式的一部分。 var NoteSchema = new dynamoose.Schema({ _id: String, details: Array }); 在下面的代码中,variablesbody被设置为{details: []} 。 我已经通过运行console.log(body);确认了这一点console.log(body); 。 Note.update({ _id: searchid }, body, function(err, note) { if (err) { console.log(err); } else { console.log(note); } }); 问题是在运行console.log(note);callback函数里面console.log(note); details甚至不显示。 所以它是空的或未定义的。 在amazon web services中,对于该条目再次不存在details 。 有什么奇怪的是,当创build一个新的注意,设置details = [] ,并保存,细节是一个空的数组,完美的作品。 所以对我来说,更新logging并将该属性设置为空数组似乎就像一个特定的问题,因为创build一个logging并将该属性设置为一个空数组是完美的。 如何更新logging并将详细信息设置为空数组?

AWS Lambda查询二级索引

以下是DynamoDB JSON对象上的AWS lambda中的node.js查询。 用户ID是没有sorting键的主键。 GeoHash是一个辅助键,索引名称为“GeoHash-index”。 调用成功没有错误,但不会导致返回任何内容。 有可能下面的testing数据是错误的,因为它没有提供与索引名称的任何连接,但是我是AWS / noSQL的新手,有点失落。 var AWS = require('aws-sdk'); var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'}); exports.handler = function(event,context,callback) { console.log(JSON.stringify(event, null, ' ')); var tableName = "table1"; // getItem docClient.getItem({ TableName: tableName, IndexName: "GeoHash-index", KeyConditionExpression: "GeoHash = :geohash", ExpressionAttributeValues: {":geohash": "dpz886gb0tb0"} }), function(err,data){ if(err){ callback(err); } else { callback(null,data); } } […]