我正在尝试评估SNS是否正在构建一个实时应用程序,并且需要在传递消息时快速转换时间<2秒.
由于我位于亚太地区,我在新加坡有一个SNS,在位于Us-east-1的Lambda有一个订户.
鉴于此设置,我运行了一个代码,试图找出调用lambda的延迟并进行零处理并记录时间.有人可能会说你在这种情况下也考虑了lambda调用延迟.这是真的.我需要调用Lambda并执行并在<2秒内回复.
我发送了23914条消息,其中我有平均653.520毫秒的传输+ lambda调用.峰值大约600995毫秒(约10分钟),这是像pubsub这样的技术的潜在延迟.
lambda在<653毫秒内发送和接收大约20117条消息,这意味着3797个数据包或15%的消息比平均时间多.
2958条消息或12.36%消息需要1秒才能执行.调用和执行379条消息或1.59%需要超过2秒(这意味着1.6%的消息不能被视为实时且必须被忽略)超过10秒的82条消息64条消息超过20秒直到~45秒后延迟是10分钟.我有3包,延迟10分钟.
困扰我的是,我的消息中大约2%(如果你也包括处理时间)不能实时处理一小部分~24K消息.
在我试图呈现的比例计算中,要求我每月处理大约2160亿条消息.在这种规模上,我担心我将无法实时处理43亿条消息.
鉴于这种经验,我不确定SNS的扩展程度.那些#of不到实时的消息(读取> 2秒延迟)会更多吗?还是会减少?
现在可能有人质疑我的互联网连接可靠性,我在EC2上重新做了这个实验并得到了非常相似的结果.
事实上,在同一时间内匹配的时间延迟类型.
具体问题
- 什么是SLA到SNS的性能?
- 间接地:这些SLA如何转换为AWS Lambda服务?
- 有关这些延误可能发生在何处的任何理由?
我需要使用aws iot从aws lambda通过mqtt协议发布数据.我用node.js代码创建了一个lambda函数.像这样
exports.handler = (event, context, callback) => {
var awsIot = require('aws-iot-device-sdk');
var device = awsIot.device({
keyPath: 'samplepath/test.pem.key',
certPath: 'samplepath/test.crt',
caPath: 'samplepath',
clientId: 'sampleId',
region: 'us-east-1'
});
device
.on('connect', function () {
console.log('connected');
device.publish('test_topic', JSON.stringify({ "test_name": "hello", "test_value": 1001 }));
console.log('published successfully');
callback(null, 'item added');
});
}
Run Code Online (Sandbox Code Playgroud)
我在订阅者身上收到了mqtt消息.但是lambda产生这样的错误信息
Task timed out after 10.00 seconds
Run Code Online (Sandbox Code Playgroud)
我使用了context.succeed()而不是回调,lambda正确退出.我无法收到订阅者的任何消息.
在这两种情况下,控制台打印成功发布消息.
与我的发布代码有关的问题是什么?
我在postgresql中使用下面的命令创建一个表.
CREATE TABLE someTable (
id serial primary key,
col1 int NOT NULL,
col2 int NOT NULL,
unique (col1, col2)
);
Run Code Online (Sandbox Code Playgroud)
然后我执行2个插入语句.
insert into someTable (col1,col2) values(1,11),(1,12);
它的工作
insert into someTable (col1,col2) values(1,13),(1,14),(1,11);
得到错误(key(col1,col2)=(1,11)已经存在.
但我需要避免重复对.怎么可能?
我试试这个
x86_64-pc-linux-gnu上的PostgreSQL 9.5.0,由gcc编译的gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2,64位和PostgreSQL 9.3,由gcc编译(Ubuntu 4.8. 2-19ubuntu1)4.8.2,64位
但我得到了错误
执行两个语句后我需要这样做.
(1,11),(1,12),(1,13),(1,14)
Run Code Online (Sandbox Code Playgroud) iam使用Web控制台在amazon dynamoDB中创建了一个表.添加一些数据后,这是我的表结构.
101 | manaf | haaaai
102 | manaf | 你好
我需要在两个res限制之间获取数据.
这是我在js中的代码.
var AWS = require("aws-sdk");
AWS.config.update({
region: "regionName",
});
var docClient = new AWS.DynamoDB.DocumentClient()
var table = "testTable";
var params = {
TableName: table,
FilterExpression :['userid = :id','res >= :val1','res <= :val2'],
ExpressionAttributeValues : {':id' : 'manaf','res':101, 'res':102}
};
docClient.scan(params, function(err, data) {
if (err) console.log(err);
else console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
但我得到这样的错误.
{ [InvalidParameterType: Expected params.FilterExpression to be a string]
message: 'Expected params.FilterExpression to be …
Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services amazon-dynamodb amazon-dynamodb-streams
我需要使用AWS API网关来传达elasticache(Redis引擎).我在同一个VPC中成功连接了lambda函数的ElastiCache.我无法从外部VPC连接.
所以我尝试创建一个API网关,并选择集成类型作为AWS Service Proxy和AWS Service作为ElastiCache.
这是创建API网关的屏幕截图
但我不知道,如何测试这个创建的API来执行Redis命令.
eg: SET A FOO
Run Code Online (Sandbox Code Playgroud)
是否可以使用API网关传达ElastiCache?
amazon-web-services amazon-elasticache aws-lambda aws-api-gateway
我需要将一个大文件上传到aws s3存储桶.在每10分钟我的代码从源目录中删除旧文件并生成一个新文件.文件大小约为500 MB.现在我使用s3.putObject()方法在创建后上传每个文件.我也听说过aws s3同步.它带来了aws-cli.它用于将文件上传到s3存储桶.
我使用aws-sdk for node.js进行s3上传.node.js的aws-sdk不包含s3-sync方法.是s3-sync比s3.putObject()方法好吗?我需要更快上传.
我需要从json字符串打印键和值.我已经解析了一个简单的json字符串
{
"Name": "test1",
"CreateDate": "2016-08-30T10:52:52Z",
"Id": "testId1",
}
Run Code Online (Sandbox Code Playgroud)
我的代码是这样的
q1=$(echo $x | grep -Po '"Name":.*?[^\\]",'| perl -pe 's/"Name": //; s/^"//; s/",$//');
q2=$(echo $x | grep -Po '"Id":.*?[^\\]",'| perl -pe 's/"Id": //; s/^"//; s/",$//');
echo $q1 "," $q2;
Run Code Online (Sandbox Code Playgroud)
但是这段代码不适用于像这样的json字符串
x='{ "TestNames":
[{
"Name": "test1",
"CreateDate": "2016-08-30T10:52:52Z",
"Id": "testId1"
},
{
"Name": "test2",
"CreateDate": "2016-08-30T10:52:13Z",
"Id": "testId2"
}]
}';
Run Code Online (Sandbox Code Playgroud)
我需要像这样打印
test1 , testId1
test2 , testId2
Run Code Online (Sandbox Code Playgroud)
是否可以使用grep命令获取这样的数据?
我需要从lambda函数读取请求参数.在我的api网关上配置Body Mapping模板得到这样的方法
{
"val1": "$input.params('val1')",
"val2": "$input.params('val2')"
}
Run Code Online (Sandbox Code Playgroud)
我的Lambda函数代码是
exports.handler = (event, context, callback) => {
// TODO implement
var val1 = require('querystring').parse(event.params.val1);
var val2 = require('querystring').parse(event.params.val2);
callback(null, 'Hello from Lambda' + val1 +'test'+val2);
};
Run Code Online (Sandbox Code Playgroud)
但是在测试我的api方法时,我在 日志中收到错误"在完成请求之前退出进程"
TypeError: Cannot read property 'val1' of undefined
Run Code Online (Sandbox Code Playgroud)
与此设置相关的实际问题是什么?
我需要使用aws客户端创建一个api网关.我使用Web控制台成功创建并集成了我的aws-lambda函数.但我与aws-client混淆了.这些是我遵循的步骤.
使用aws-cli使用导出的json文件创建新的api网关.像这样的命令.
aws apigateway import-rest-api --body file://tmpfile.json --region us-east-1;
Run Code Online (Sandbox Code Playgroud)但它只创造了资源和方法.
用我的lambda函数集成api方法.我执行这样的命令
aws apigateway put-integration --rest-api-id 42ku123id8u3a --resource-id core-api-dev --http-method DELETE --type AWS --integration-http-method POST --uri 'arn:aws:lambda:us-east-1:my-lambda-function-arn' --region us-east-1
Run Code Online (Sandbox Code Playgroud)
但它产生这样的错误信息
调用PutIntegration操作时发生错误(NotFoundException):指定了无效的资源标识符
是否可以使用aws客户端将api网关方法与现有的lambda函数集成?什么是资源标识符?
aws-lambda ×5
node.js ×4
amazon-s3 ×1
amazon-sns ×1
aws-cli ×1
aws-iot ×1
aws-sdk ×1
bash ×1
grep ×1
javascript ×1
json ×1
mqtt ×1
nosql ×1
npm ×1
shell ×1
sql ×1
sql-insert ×1
unix ×1