使用数组为大数据设计 DynamoDB。超过 400k
Design DynamoDB for Large data using array. Over 400k
我在 node.js
工作,为了记录事件时间和事件数据,我想使用 AWS DynamoDB
Table.
单数据和一键数据模式示例如下。
var want_to_update_data = [ // contain json more or same than 1
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
];
var saved_data = { // DynamoDB Saved Data Sample with Key "ABCD"
"Key" : "ABCD",
"events" : [
...
{ "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
{ "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
]
}
以上数据仅供参考。 json 包含更多键值。
对于更新单json,我的服务器代码如下。
app.get('/insert', req, res) {
var update_key = req.body.update_key; // "ABCD"
var want_to_update_data = req.body.update_data; // [ {} ]
var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
AWS.config.update({
region: "region",
endpoint: "endpoint",
accessKeyId: "access_key",
secretAccessKey: "secret_key",
});
var params = {
TableName: "TableName",
Key: update_key,
UpdateExpression: updateExpression,
ExpressionAttributeValues: expressionAttributeValues,
ReturnValues: "UPDATED_NEW"
});
var dynamodbClient = new AWS.DynamoDB.DocumentClient();
dynamodbClient.update(params, function(err, data) {
if(err) { /* handle error */ }
else { /* handle after update complete */ }
});
});
简单地说,它可以工作,但 AWS DynamoDB 不能一次更改超过 4kb。
因此,如果数组数据大于 4k,list_append 无法使用 ValidationException: Item size to update has exceeded the maximum allowed size
错误消息。
我想保留所有事件并想对 event-time
个键进行排序。
如何更改我的 DynamoDB 架构?
下面的代码只是我的猜测。
可能吗?
{
"Key" : "ABCD",
/*
"events" : [
...
{ "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
{ "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
]
*/
"events" : { // is it possible events['some-date'] could be sort-key?
...
"2020-12-28 09:30:17" : 35,
"2021-01-01 19:11:12" : 16,
"2021-01-02 10:11:12" : 19,
...
}
}
/*
var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
*/
// under 2 line is just for sample. json key is not fixed
var event_time = '2021-01-02 10:11:12';
var single_json = want_to_update_data[event_time];
// if number-start key is not allow(event_time), prefix append could be like "D_2021~~"
var updateExpression = `SET events.${event_time} = :dl`;
var expressionAttributeValues = {':dl' : single_json }; // single json
感谢您阅读我的问题。
我想创建新的 table 来保存我的事件 json 数据。
(不是 S3。使用 DynamoDB)
DynamoDB 的项目大小限制为 400kb,包括属性名称。
根据the docs
Number of Values in List, Map, or Set
There is no limit on the number of values in a List, a Map, or a Set, as long as the item containing the values fits within the 400 KB item size limit.
听起来你的 4k 事件列表,加上你在项目中保存的任何其他内容,超过了这个 400kb 的限制。您可以查看此 nifty calculator 以了解商品的尺寸。
您可能不想将事件存储在列表项中,而是将它们存储在项目集合中。
例如,而不是这个:
您可以像这样存储事件数据
如果您需要按时间获取事件,您可以考虑将 event_time
作为您的排序键。
您无法在单个 Key 上的 DynamoDB
中存储无限大的数据量。
就像你写的一样,定期备份到S3。
在我的例子中,我使用 redis-cache
检查每个数组大小,并使用 node-schedule,将大数据备份到 S3
。
我在 node.js
工作,为了记录事件时间和事件数据,我想使用 AWS DynamoDB
Table.
单数据和一键数据模式示例如下。
var want_to_update_data = [ // contain json more or same than 1
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
];
var saved_data = { // DynamoDB Saved Data Sample with Key "ABCD"
"Key" : "ABCD",
"events" : [
...
{ "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
{ "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
]
}
以上数据仅供参考。 json 包含更多键值。
对于更新单json,我的服务器代码如下。
app.get('/insert', req, res) {
var update_key = req.body.update_key; // "ABCD"
var want_to_update_data = req.body.update_data; // [ {} ]
var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
AWS.config.update({
region: "region",
endpoint: "endpoint",
accessKeyId: "access_key",
secretAccessKey: "secret_key",
});
var params = {
TableName: "TableName",
Key: update_key,
UpdateExpression: updateExpression,
ExpressionAttributeValues: expressionAttributeValues,
ReturnValues: "UPDATED_NEW"
});
var dynamodbClient = new AWS.DynamoDB.DocumentClient();
dynamodbClient.update(params, function(err, data) {
if(err) { /* handle error */ }
else { /* handle after update complete */ }
});
});
简单地说,它可以工作,但 AWS DynamoDB 不能一次更改超过 4kb。
因此,如果数组数据大于 4k,list_append 无法使用 ValidationException: Item size to update has exceeded the maximum allowed size
错误消息。
我想保留所有事件并想对 event-time
个键进行排序。
如何更改我的 DynamoDB 架构?
下面的代码只是我的猜测。
可能吗?
{
"Key" : "ABCD",
/*
"events" : [
...
{ "event-time" : "2020-12-28 09:30:17", "event-data" : 35 },
{ "event-time" : "2021-01-01 19:11:12", "event-data" : 16 },
{ "event-time" : "2021-01-02 10:11:12", "event-data" : 19 },
...
]
*/
"events" : { // is it possible events['some-date'] could be sort-key?
...
"2020-12-28 09:30:17" : 35,
"2021-01-01 19:11:12" : 16,
"2021-01-02 10:11:12" : 19,
...
}
}
/*
var updateExpression = 'SET events = list_append(events, :dl)'; // dl means data-list
var expressionAttributeValues = {':dl' : want_to_update_data }; // dl means data-list
*/
// under 2 line is just for sample. json key is not fixed
var event_time = '2021-01-02 10:11:12';
var single_json = want_to_update_data[event_time];
// if number-start key is not allow(event_time), prefix append could be like "D_2021~~"
var updateExpression = `SET events.${event_time} = :dl`;
var expressionAttributeValues = {':dl' : single_json }; // single json
感谢您阅读我的问题。
我想创建新的 table 来保存我的事件 json 数据。 (不是 S3。使用 DynamoDB)
DynamoDB 的项目大小限制为 400kb,包括属性名称。
根据the docs
Number of Values in List, Map, or Set There is no limit on the number of values in a List, a Map, or a Set, as long as the item containing the values fits within the 400 KB item size limit.
听起来你的 4k 事件列表,加上你在项目中保存的任何其他内容,超过了这个 400kb 的限制。您可以查看此 nifty calculator 以了解商品的尺寸。
您可能不想将事件存储在列表项中,而是将它们存储在项目集合中。
例如,而不是这个:
您可以像这样存储事件数据
如果您需要按时间获取事件,您可以考虑将 event_time
作为您的排序键。
您无法在单个 Key 上的 DynamoDB
中存储无限大的数据量。
就像你写的一样,定期备份到S3。
在我的例子中,我使用 redis-cache
检查每个数组大小,并使用 node-schedule,将大数据备份到 S3
。