- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这里的想法是在查询通过 GSI 运行时并行运行多个 DynamoDB 查询。截至目前 BatchGetItems doesn't support querying over Indexes推荐的方法是并行查询数据。我正在使用带有 wg 的 go routines 来并行处理例程的执行。
函数的输入是一个带有 ID 的字符串数组,输出是 ID 的属性。
当函数在本地运行时,没有问题,但是当函数在AWS-Lambda上运行时,返回的数据不断增长;
即;输入 2 项应输出 2 项。如果函数在 AWS-Lambda 上测试,
等等。这是代码片段。每次运行 lambda 时,是否有什么没有正确处理让 lambda 输出额外的数据集?
package main
import (
"context"
"fmt"
"os"
"sync"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
//Final Output Interface
var bulkOutput []interface{}
func exitWithError(err error) {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
//LambdaInputJSON input for the lambda handler
type LambdaInputJSON struct {
Ids []string `json:"ids,omitempty"`
}
//HandleRequest : Lambda entry point
func HandleRequest(ctx context.Context, data LambdaInputJSON) ([]interface{}, error) {
return DynamoDBBatchGetRecords(data), nil
}
func main() {
lambda.Start(HandleRequest)
}
func DynamoDBBatchGetRecords(a LambdaInputJSON) []interface{} {
var wg sync.WaitGroup
var mutex = &sync.Mutex{}
iterations := len(a.Ids)
wg.Add(iterations)
for i := 0; i < iterations; i++ {
go QueryOutput(a.Ids[i], &wg, mutex)
}
wg.Wait()
return bulkOutput
}
//QueryOutput GoRoutine
func QueryOutput(data string, wg *sync.WaitGroup, mtx *sync.Mutex) {
var outputData []interface{}
defer wg.Done()
sess, err := session.NewSession(&aws.Config{
Region: aws.String("aws-region"),
})
if err != nil {
exitWithError(fmt.Errorf("failed to make Query API call, %v", err))
}
ddb := dynamodb.New(sess)
queryInput := &dynamodb.QueryInput{
Limit: aws.Int64(1),
TableName: aws.String("table-name"),
IndexName: aws.String("gsi-index"),
ScanIndexForward: aws.Bool(false),
ConsistentRead: aws.Bool(false),
KeyConditions: map[string]*dynamodb.Condition{
"column_name": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(data),
},
},
},
},
}
output, err := ddb.Query(queryInput)
if err != nil {
exitWithError(fmt.Errorf("Failed to make Query API call, %v", err))
}
err = dynamodbattribute.UnmarshalListOfMaps(output.Items, &outputData)
if err != nil {
exitWithError(fmt.Errorf("Failed to unmarshal Query result items, %v", err))
}
mtx.Lock()
bulkOutput = append(bulkOutput, outputData)
mtx.Unlock()
}
最佳答案
根据 documentation ,全局变量独立于您的 Lambda 函数的处理程序代码。这导致缓冲区随着时间的推移而增加。
修正后的引用粘贴在下方。
package main
import (
"context"
"fmt"
"os"
"sync"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
func exitWithError(err error) {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
//HandleRequest : Lambda entry point
func HandleRequest(ctx context.Context, data LambdaInputJSON) ([]interface{}, error) {
output := DynamoDBBatchGetRecords(data)
return output, nil
}
func main() {
lambda.Start(HandleRequest)
}
func DynamoDBBatchGetRecords(a LambdaInputJSON) []interface{} {
var dataOut []interface{}
var wg = &sync.WaitGroup{}
var mtx = &sync.Mutex{}
iterations := len(a.Ids)
wg.Add(iterations)
for i := 0; i < i; i++ {
go func(i int) {
defer wg.Done()
var outputData []interface{}
sess, err := session.NewSession(&aws.Config{
Region: aws.String("aws-region"),
})
if err != nil {
exitWithError(fmt.Errorf("failed to make Query API call, %v", err))
}
ddb := dynamodb.New(sess)
queryInput := &dynamodb.QueryInput{
Limit: aws.Int64(1),
TableName: aws.String("table"),
IndexName: aws.String("index"),
ScanIndexForward: aws.Bool(false),
ConsistentRead: aws.Bool(false),
KeyConditions: map[string]*dynamodb.Condition{
"index-column": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(a.Ids[i]),
},
},
},
},
}
output, err := ddb.Query(queryInput)
if err != nil {
exitWithError(fmt.Errorf("E1 failed to make Query API call, %v", err))
}
err = dynamodbattribute.UnmarshalListOfMaps(output.Items, &outputData)
if err != nil {
exitWithError(fmt.Errorf("E2 failed to unmarshal Query result items, %v", err))
}
mtx.Lock()
dataOut = append(dataOut, outputData[0])
mtx.Unlock()
}(i)
}
wg.Wait()
return dataOut
}
关于go - 并行执行 DynamoDB 查询(全局二级索引的 BatchGetItems),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55002146/
我尝试使用 batchGetItem从表中返回多个项目的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项目怎么办?唯一的方法是创建没有范围键的表吗? // Add
是否可以使用batchgetitem api从dynamodb全局二级索引中检索行?如果我的目标是也基于某些非键属性从主表中检索数据,但应在 100 个项目的批次中检索数据 - GSI 索引是否不适合
我有一个名为 User 的表。它有一个用户 ID 的哈希键和一个组织 ID 的范围键。 如何返回所有组织 ID 为“3”的用户 (顺便说一下,这是一个 Lambda 函数) 这段代码给了我一个错误:
我正在尝试从Swift应用程序中的DynamoDB获取一些行。在下面代码的最后一行,我得到一个NSInvalidArgumentException。我认为一定是因为我的请求格式不正确,但是我不知道出了
方法 BatchGetItemRequest(Map requestItems) 不允许添加任何键或范围条件。如果没有范围键,BatchGetItemRequest 将失败。如何使用比较运算符指定范围
我有一个在 AWS DynamoDB 中执行 batchGetItem 的 Swift 函数。输出以 JSON 格式返回,但我无法解析它。下面是我试图用来解析数据的代码,以及 JSON 输出的样子。任
这里的想法是在查询通过 GSI 运行时并行运行多个 DynamoDB 查询。截至目前 BatchGetItems doesn't support querying over Indexes推荐的方法是
具体来说,什么时候使用一个或另一个更好?我现在正在使用 BatchGetItem,它看起来非常慢。 最佳答案 就检索单个项目的效率而言,您知道分区键(如果在表中使用了排序键,则为排序键),GetIte
我正在使用 GO SDK 并使用 DynamnoDB BatchGetItem API。 我看到了这个代码示例 - https://github.com/aws/aws-sdk-go/blob/mas
我们在过去几周开始在我们的项目中使用 DynamoDB,既作为缓存又作为系统中发生的事件的列表(请不要讨论为什么有更好的替代方案来实现这个,我已经争论过我自己在选择 DynamoDB 之前没有结果)。
哈希和范围都指定了,它还认为一个是空的?还是在谈论其他一些属性? 返回的 task.result() 为 nil,task.error() 表示: "Error Domain=com.amazonaw
使用 BatchGetItem 与并行发出多个 GetItem 有很大差异(在时间性能上)吗? 如果我可以使用 GetItem 并自己处理并行化,我的代码会更简洁。 但是,如果 BatchGetIte
我正在为我当前的应用程序构建一个无服务器后端,使用 dynamoDb 作为我的数据库。我使用 aws sam 将我的 lambda 函数上传到 aws。此外,我将所有表名作为全局变量传递给 lambd
我想调用 BatchGetItem 以使用集成请求中的 API Gateway json 映射模板从 DynamoDB 的简单表中获取多个文档。 使用 时,以下模板对我有用查询 获取单个项目的操作:
我想检索 500 个项目并且我知道它们的主键。 调用 BatchGetItem 是否比在 dynamodb 的循环中调用 GetItem 更有效? 最佳答案 是的。对于 GetItem,您将为每个项目
如果您请求超过 100 个项目,BatchGetItem 将返回一个 ValidationException 并显示消息“为 BatchGetItem 调用请求的项目太多。”有什么办法可以通过 bat
我一直在浏览 AWS DynamoDB 文档,但在我的一生中,我无法弄清楚 batchGetItem() 和 Query() 之间的核心区别是什么。两者都基于表和索引中的主键检索项目。唯一的区别在于检
我正在尝试使用 Node JS AWS-SDK 从 DynamoDB 表中获取项目。 getItem 函数工作正常,但 BatchGetItem 更难使用。 我使用官方文档: http://docs.
我在使用 Boto3/DynamoDB 时遇到困难 BatchGetItem 手术。我将不胜感激任何帮助或指导!如果这是一个新手问题,我对 python/aws 还很陌生,所以很抱歉。 当我执行操作时
我是一名优秀的程序员,十分优秀!