【问题标题】:How to pass in stateful client to lambda function?如何将有状态客户端传递给 lambda 函数?
【发布时间】:2019-08-06 09:16:41
【问题描述】:

我正在处理一个简单的 Lambda 函数,我想知道是否可以将客户端(这次是 dynamodb)传递给处理程序,因此我们不会为每个请求重新连接。

宏在这里定义:

https://docs.rs/lambda_http/0.1.1/lambda_http/macro.lambda.html3

到目前为止我的功能:

fn main() -> Result<(), Box<dyn Error>> {
    simple_logger::init_with_level(log::Level::Debug)?;
    info!("Starting up...");
    let dynamodb_client = DynamoDbClient::new(Region::EuCentral1);
    lambda!(router);
    return Ok(());
}

fn router(req: Request, ctx: Context) -> Result<impl IntoResponse, HandlerError> {
let h_req = HReq {
    http_path: req.uri().path(),
    http_method: req.method(),
};

match h_req {
    HReq {
        http_path: "/login",
        http_method: &Method::POST,
    } => user_login(req, ctx),

    _ => {
        error!(
            "Not supported http method or path {}, {}",
            h_req.http_path, h_req.http_method
        );
        let mut resp = Response::default();
        *resp.status_mut() = StatusCode::METHOD_NOT_ALLOWED;
        Ok(resp)
    }
}

}

是否可以将此宏扩展为具有第二个选项,以便我可以将客户端一直添加到实际与数据库对话的函数?

【问题讨论】:

  • 哪个宏?您能否更具体地说明您的实际要求?没听懂,抱歉。
  • 你看到问题中的链接了吗?
  • stackoverflow.com/help/how-to-ask : “但也将代码复制到问题本身。不是每个人都可以访问外部站点,并且链接可能会随着时间的推移而中断”请这样做。您还链接到宏的文档,而不是代码本身。

标签: http rust aws-lambda


【解决方案1】:

DynamoDB 是一种 Web 服务,对它的每个请求都被视为不同的 API 调用。

没有像使用常规数据库连接(例如 MySQL)一样保持客户端连接活动的功能。

我的rust知识有点欠缺,所以不知道DynamoDBClient是否默认设置了http keepalive,但是确保设置了http keepalive对性能有帮助。

【讨论】:

  • K Mo 的回答非常准确。 DynamoDB 只是一项服务。所有低级调用(物理插入磁盘的数据)都由 AWS 处理。您使用的 SDK 只是一个 API,将在内部连接到他们的服务,因此您无需担心。此外,如果 Lambda 和 DynamoDB 表都在同一个区域中,那么在其中保存/获取数据应该相对较快(低于 100 毫秒)。即使使用http keepAlive=true 有一些好处,在大多数情况下也是无关紧要的。
  • 也许 DynamoDB 不是正确的例子,但总的来说,我只想有一个有状态的连接,我想一直传递给其余的代码。不过感谢您的帮助。
  • 最简单的方法是缓存连接而不是到处注入。我不是在寻找任何赞成票,但我过去曾回答过一个关于在 Lambda 函数中缓存连接的问题。在这里:stackoverflow.com/questions/54947095/aws-lambda-mysql-caching/…
  • 长话短说:在函数处理程序之外打开数据库连接,以便它们可以在热启动中重用。
  • 这正是我想做的,但Rust在这方面不太友好。我想我会使用 Arc 并引用它。
【解决方案2】:

在考虑了所有选项后,我决定使用lazy_static 来实现。

#[macro_use]
extern crate lazy_static;

lazy_static! {
    static ref DYNAMODB_CLIENT: DynamoDbClient = DynamoDbClient::new(Region::EuCentral1);
}

这是在运行时实例化的,可以在模块内部使用,没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多