【问题标题】:Is it good idea to use Thread.sleep in AWS lambda java在 AWS lambda java 中使用 Thread.sleep 是个好主意吗
【发布时间】:2020-03-28 08:42:12
【问题描述】:

我正在使用带有 Java 编程语言的 AWS Lambda,由于某些要求,我必须在我的 lambda 函数中休眠 2-3 秒,或者在某些情况下最多 12 秒,将 Thread.sleep() 放入lambda 函数,否则它会产生任何技术后果。

【问题讨论】:

  • 你能多加一点上下文吗?或者分享一下代码?
  • 请注意,AWS lambda 确实有一个超时,您可能会为您的用例牢记这一点。如果在您的代码完成处理之前达到超时,则函数终止。
  • 您还在等什么?该事件的结束本身是否不会触发 Lambda 函数(可能通过 SNS 或 SQS 间接触发)?
  • 在任何异步代码中使用sleep 是个坏主意,到底为什么要这样做?解释为什么需要这样做。
  • @KarolDowbecki,我在基于“电信”的应用程序中遇到了问题。在我向用户拨打自动电话的情况下,他可能会或可能不会在给定时间或任何其他情况下接听电话,例如用户忙等,如果用户忙或没有,我不会立即从电信系统获得响应-回答。所以,我想在睡眠 20 秒后再试一次。我的系统中的最大重试次数只是一种情况,这就是为什么我会这样做,如果您有更好的想法,请告诉我。

标签: java amazon-web-services aws-lambda aws-serverless


【解决方案1】:

在少数情况下执行 Thread.sleep 是合理的。

  • 每隔几秒轮询一次并检查某些不受您的代码控制的状态是否已更改。例如。考虑检查某处的远程进程是否已完成。
  • 您想模拟某段代码,使其“花费”比实际更多的时间。
  • 限制每秒执行多个操作的代码段。例如。从远程服务器请求多个资源,但限制您的请求,以免使其过载。

我相信还有很多正当理由。不要害怕让你的代码睡觉。确保你有正当理由睡觉。还要确保您确实需要在代码中休眠的线程模型不会导致deadlocks

请注意,在 AWS Lambda 中运行时,您应该将睡眠优化到尽可能少,因为您需要为那甜蜜的 CPU 时间付出代价。

【讨论】:

  • 感谢您的回复,是的,就我而言,在我制作电信应用程序时,它们是我无法控制的某种状态。我正在拨打自动电话,最终用户可能会或可能不会接听或忙等,所以我只想在 20 秒后重试,在我的应用程序及其解决的目的的上下文中,这对我来说似乎是合理的和对 lambda 的付款对我来说也是合理的。
  • 你的职责太多了。您需要支付更多费用的事实是一个危险信号,您当然可以忽略:-)
【解决方案2】:

如果您的 Lambda 使用大量内存,那么启动两个不同的 Lambda 会比等待 12 秒更好(也更便宜)。

如果您有某种工作流程,或者您需要等待特定条件,您可以评估 AWS Step Functions 的引入,或者(可能更好)将上下文发送到 SQS 队列,并将 visibility timeout 设置为 12 秒。这样,第二个 lambda 将在启动前至少等待 12 秒。

【讨论】:

    【解决方案3】:

    基本上你可以做任何你想做的事,在这种情况下你只需付出更多:-)

    Lambda 函数的整个想法是拥有一个接受输入并产生输出并具有单一职责的函数,类似于普通的旧函数。

    让我们想想为什么你需要使用Thread#sleep

    1. 您执行操作 #1。
    2. 等待此操作完成。
    3. 执行操作 #2。

    这是 3 个不同的职责。这对任何函数来说都太多了,包括 Lambda :-)
    这两个操作都可以是单独的 Lambda 函数。最近添加了 Destination,您的 Lambda #1 可以触发 Lambda #2。
    在这种情况下,根本不需要轮询。

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 1970-01-01
      • 2017-08-15
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多