代码之家  ›  专栏  ›  技术社区  ›  PeakGen

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

  •  0
  • PeakGen  · 技术社区  · 4 年前

    我正在为一个移动应用程序开发一个REST API。这款移动应用预计将拥有数百万用户,每天都在使用。

    我正在使用 AWS Lambda , API Gateway , Amazon RDS (MySQL) 技术。此外,我正在使用 CloudFormation 文件来配置所有内容。

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

    HikariCData来源

    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(){}
    }
    

    获取所有帐户类型Lambda

    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

    0 回复  |  直到 4 年前
        1
  •  0
  •   Mark Sailes    3 年前