如何向aws lambda函数分发多个并发请求?

时间:2017-04-22 21:36:12

标签: go concurrency aws-lambda goroutine

我想构建一个类似于cronjob的系统,它可以从数据库中获取所有用户并为每个用户创建多个(我的意思是很多)并发请求并进行一些执行并将结果保存到db。它将在每天7/24每小时运行一次。

我提出了以下解决方案:

  1. 从db获取所有用户(这是容易的部分)
  2. 动态创建lambda函数并将所有用户分发到这些函数
  3. 每个lambda函数都会进行并发请求和执行 (处理结果并将其保存到db)
  4. 在需要时与SNS通信这些功能
  5. 那么,我的方法对这种情况有意义吗?

    这里最重要的是扩展(这就是为什么我认为将所有用户分配给lambda函数,限制并发请求和资源),我们如何为可指数增加的用户数量提供可扩展且高效的想法?

    或其他任何建议?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案:

如果100个并发的lambdas不足以满足您的需求,请创建一张增加限额的票证,您将收取使用费用。

但是,您仍然无法确定将来需要多少个lambda。没有必要在单独的lambda中处理每个用户,而是可以使用一大块用户数据调用lambda。例如比方说,你的最大值。 lambda limit是100并且有1000个用户然后你可以做某事(我不知道go,这里是一个python代码,可能不是100%语法正确)

users = get_users_fromdb()   # users = [1,2,3,... 1000]
number_of_users = len(users)
chunk_size = number_of_users / 100   # 100 is your lambda limit
for i in range(0, number_of_users, chunk_size)
    # e.g. chunk_users_data = [1,2,3 ... 10]
    chunk_users_data = users[i * chunk_size : (i + 1) * chunk_size ]
    invoke_lambda_to_process_users_chunk_data()

以下是您可以在其他lambda中执行的操作

users = event.get('users')
for user in users:
    try:
       process_user(user)
    except Exception as e:
        print(e)  # handle exception / error if you want

更新

默认情况下,100是并发运行lambdas的限制。如果你有100K用户,IMO,你应该去支持案例,将你的帐户的并发lambda限制增加到1000或更多。我正在研究lambda,我们有10K的限制。还有一件事要记住,你不确定你的一个lambda调用是否能够处理一个块中的所有用户,所以添加一些逻辑以在超时之前重新调用剩余用户。一个lambda可以运行到最大。 5分钟你可以在毫秒内从context物体获得剩余时间。