如何减少代码中的 Lambda 冷启动时间?

问题描述

我正在为移动应用开发 REST API。该移动应用预计将拥有数百万用户,并且每天都在使用。

我为此使用了 AWS LambdaAPI GatewayAmazon RDS (MysqL) 技术。此外,我正在使用 CloudFormation 文件来配置所有内容

我注意到这里的每个函数都有3 秒到 3.8 秒冷启动时间。这需要尽可能减少。

HikariCPDataSource

import java.sql.Connection;
import java.sql.sqlException;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class HikariCPDataSource {
    
    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;
    
    static {
        config.setJdbcUrl("jdbc:MysqL://gfgf.ffgfg.us-east-1.rds.amazonaws.com:3306/aaaa");
        config.setUsername("admin");
        config.setPassword("admin123");
        config.addDataSourceProperty("cachePrepStmts","true");
        config.addDataSourceProperty("prepStmtCacheSize","250");
        config.addDataSourceProperty("prepStmtCachesqlLimit","2048");
        ds = new HikariDataSource(config);
    }
    
    public static Connection getConnection() throws sqlException {
        return ds.getConnection();
    }
    
    private HikariCPDataSource(){}
}

GetAllAccountTypesLambda

import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.peresiaapp.beans.AccountingType;
import java.util.ArrayList;
import java.util.List;
import java.sql.*;
public class GetAllAccountTypesLambda {
   ObjectMapper objectMapper = new ObjectMapper();
   static final String QUERY = "SELECT * from accounting_type";
   static Connection conn = null;
   static {
      try {
         conn = HikariCPDataSource.getConnection();
      } catch (sqlException e) {
         e.printstacktrace();
      }
   }
   public APIGatewayProxyResponseEvent getAllAccountTypes(APIGatewayProxyResponseEvent request)
         throws JsonProcessingException,ClassNotFoundException {
      List<AccountingType> list = new ArrayList<>();
      AccountingType acc = new AccountingType();
      try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(QUERY);) {
         // Extract data from result set
         while (rs.next()) {
            // Retrieve by column name
            acc.setIdaccountingType(rs.getInt("idaccounting_Type"));
            acc.setType(rs.getString("type"));
            list.add(acc);
         }
      } catch (sqlException e) {
         e.printstacktrace();
      }
      String writeValueAsstring = objectMapper.writeValueAsstring(list);
      return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody(writeValueAsstring);
   }
}

template.yaml

AWstemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  aaaa-restapi

  Sample SAM Template for aaaa-restapi

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 100

Resources:
  GetAllAccountTypesLambda:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: aaaa-restapi
      Handler: com.peresiaapp.dao.accountingtype.GetAllAccountTypesLambda::getAllAccountTypes
      Runtime: java11
      MemorySize: 1024
      Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
        Variables:
          ParaM1: VALUE
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /accounttype
            Method: get
      Role: !GetAtt LambdaRole.Arn
      VpcConfig:
        SecurityGroupIds:
          - sg-041f2459dcd921e8e
        subnetIds:
          - subnet-0381dfdfd
          - subnet-c4ddf54cb
  
  GetAllRolesLambda:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: aaaa-restapi
      Handler: com.peresiaapp.dao.accountingtype.GetAllRolesLambda::getAllRoles
      Runtime: java11
      MemorySize: 1024
      Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
        Variables:
          ParaM1: VALUE
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /roles
            Method: get
      Role: !GetAtt LambdaRole.Arn
      VpcConfig:
        SecurityGroupIds:
          - sg-041f2459dcd921e8e
        subnetIds:
          - subnet-0381sds2d
          - subnet-c4d5sdsb
  
  LambdaRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - ec2:DescribeNetworkInterfaces
                  - ec2:CreateNetworkInterface
                  - ec2:DeleteNetworkInterface
                  - ec2:DescribeInstances
                  - ec2:AttachNetworkInterface
                Resource: '*'
        

*更新

几条评论建议我使用预配置并发。我确实尝试过。没看出多大区别。但是,如果你们中的任何人都可以解释900 可用是什么,那就太好了。我有成百上千的功能,这是否也意味着如果我打开并发,我必须花费巨额资金?因为 pricing 页面中的数字似乎不同,这对我来说没问题 - https://aws.amazon.com/lambda/pricing/

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)