这是我正在尝试的简化方案:
http请求 - >(网关API + lambda A) - > SQS - >(lambda B ?????) - > DynamoDB
所以它应该如图所示:来自许多http请求的数据(例如,每秒高达500)被我的lambda函数A放入SQS队列.然后另一个函数B处理队列:最多读取10个项目(在某些期刊的基础上)并使用BatchWriteItem将它们写入DynamoDB.
问题是我无法弄清楚如何触发第二个lambda函数.它应该被频繁调用,每秒多次(或至少每秒一次),因为我需要队列中的所有数据进入DynamoDB ASAP(这就是为什么通过这里描述的预定事件调用lambda函数B 不是一个选项)
为什么我不想在没有SQS的情况下直接写入DynamoDB?
那对我来说完全避免使用SQS会很棒.我试图用SQS解决的问题是DynamoDB限制.甚至没有限制自己,而是在使用AWS SDK将数据写入DynamoDB时处理它的方式:当逐个编写记录并限制它们时,AWS SDK会静默重试写入,导致从http客户端的点开始增加请求处理时间视图.
所以我想暂时将数据存储在队列中,将响应"200 OK"发送回客户端,然后通过单独的函数处理队列,使用一个DynamoDB的BatchWriteItem调用写入多个记录(返回未处理的项目而不是自动重试)限制).我甚至宁愿丢失一些记录,而不是增加接收和存储在DynamoDB中的记录之间的延迟
UPD:如果有人感兴趣,我已经找到了如何在节流的情况下使aws-sdk跳过自动重试:有一个特殊参数maxRetries.无论如何,将按照以下建议使用Kinesis
无法弄清楚如何正确地将对象的方法作为参数传递。
这是我的代码:
var MyTest = function (p1) {
this.p1 = p1;
};
MyTest.prototype.getParam = function () {
return this.p1;
};
function doAction(getParamCallback) {
console.log(getParamCallback());
}
var mt = new MyTest(123);
console.log(mt.getParam()); // 123
doAction(mt.getParam); // undefined
Run Code Online (Sandbox Code Playgroud)
我发现正确传递方法的唯一方法是传递对象和方法并使用 call():
function doAction2(obj, getParamCallback) {
console.log(getParamCallback.call(obj));
}
doAction2(mt, mt.getParam); // 123
Run Code Online (Sandbox Code Playgroud)
有什么方法只需要传递方法,而不需要同时传递方法和对象?
不确定标题是否完全描述了问题,无论如何这是情况:假设我有一个如下所示的ActiveQuery后代类:
class OrderQuery extends ActiveQuery
{
public function expired() {
$this->andWhere(['<=', 'order.expiresAt', date("Y-m-d H:i:s")]);
return $this;
}
public function cancelled() {
$this->andWhere(['NOT', ['order.cancelled' => null]]);
return $this;
}
}
Run Code Online (Sandbox Code Playgroud)
我想添加一个额外的方法archived()来查找已过期或已取消的订单.
public function archived() {
$this->andWhere(["OR",
['<=', 'order.expiresAt', date("Y-m-d H:i:s")],
['NOT', ['order.cancelled' => null]],
]);
return $this;
}
Run Code Online (Sandbox Code Playgroud)
上面的方法工作正常,但我想知道,是否可以在新的archived()方法中重用现有方法expired()和cancel()?
或者,换句话说,是否有可能结合使用和/或以某种方式使它们像这样一起工作:
// pseudocode, not a real code!
$this->orWhere([
$this->andWhere([...]),
$this->andWhere([...]),
]);
Run Code Online (Sandbox Code Playgroud)
谢谢!