AWS Lambda Java多线程

4

您好,我已经为Kinesis流创建了一个AWS Lambda函数,批处理大小为100,并尝试在多线程环境下执行它,但问题是在多线程环境下,与单线程相比速度非常慢。例如可以分享以下数字:对于512 MB和60秒超时,Lambda函数在684毫秒内执行了955条记录,以及在435毫秒内执行了1031条记录,而对于多线程,则在相同的内存(即512 MB和60秒超时)下,在878808毫秒内执行430条记录,并在893862毫秒内执行433条记录。

以下是我的Lambda函数代码,它正在以多线程行为执行:

public String myHandler(final KinesisEvent kinesisEvent, final Context context) {
      Thread thread = new Thread(new Runnable(){

            //@Override
            public void run() {
                int singleRecord=0;
                long starttime=System.currentTimeMillis();
                //LambdaLogger lambdaLogger=context.getLogger();
                for(KinesisEventRecord rec : kinesisEvent.getRecords())
                {
                    singleRecord=0;
                    System.out.println("Kinesis Record inside is:"+new String(rec.getKinesis().getData().array()));
                    //count++;
                    singleRecord++;
                    //  System.out.println(new String(rec.getKinesis().getData().array()));
                }
                count=count+singleRecord;
                long endtime=System.currentTimeMillis();
                long totaltime = endtime-starttime;
                time=time+totaltime;
                System.out.println("Time required to execute single Lambda function for "+singleRecord+" records is"+" :: "+totaltime+" milliseconds");
                System.out.println("Total time required to execute Lambda function for "+count+" records is"+" :: "+time+" milliseconds");
            }
        });
        thread.start();
        return null;
    } //end of handler method

在多线程环境下,Lambda函数是否执行缓慢?我想知道这个多线程的Lambda函数处理缓慢背后的原因是什么?如果我希望这个函数比单线程函数更快地工作,那么我应该在这段代码中进行哪些修改?


1
现在更清楚了,谢谢。但是仍然有疑问——每个执行元素启动一个新线程的好处在哪里? - Jan
1
@Jan http://docs.aws.amazon.com/lambda/latest/dg/java-gs.html != Java 8 lambda函数,尽管概念类似,因为你要定义一个在云端运行的函数。 - zapl
@Akshay:你能分享一下单线程代码以便比较吗?count是在哪里定义的? - Jan
我不知道为什么使用线程会变得如此缓慢,但将代码从接收请求的线程移动到新线程并等待该后台线程完成并不能使其更快。如果您想使用多线程使其更快,则必须并行执行某些操作。您的代码仍然只有1个活动线程-加上创建新线程的开销。AWS将尽可能并行地调度您的Lambda。没有必要编写非阻塞处理程序方法。 - zapl
是的,我已经分享了下面的单线程代码..... - AKSHAY SHINGOTE
顺便说一下,我想澄清一下:AWS Lambda函数是否支持多线程? - AKSHAY SHINGOTE
1个回答

2

另外还有两个选项:

  1. 使用SDK异步启动进一步处理工作的Lambda函数(扇出)
  2. 使用Lambda调度,设置调度偏移量和长时间超时,以便同时运行多个Lambda函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接