小编xtx*_*xtx的帖子

如何使用lambda函数处理SQS队列(不是通过预定事件)?

这是我正在尝试的简化方案:

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

amazon-sqs amazon-web-services aws-lambda

59
推荐指数
5
解决办法
4万
查看次数

如何在Javascript中将对象的方法作为参数传递

无法弄清楚如何正确地将对象的方法作为参数传递。

这是我的代码:

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)

有什么方法只需要传递方法,而不需要同时传递方法和对象?

javascript function object parameter-passing

7
推荐指数
1
解决办法
4710
查看次数

Yii2 ActiveQuery:是否有可能将Where和Where结合在一起?

不确定标题是否完全描述了问题,无论如何这是情况:假设我有一个如下所示的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)

谢谢!

yii2

5
推荐指数
2
解决办法
288
查看次数