开发者社区 > 云原生 > Serverless > 正文

在阿里函数计算中,http 异步调用返回500为什么不会自动重试3次啊?

在阿里函数计算中,http 异步调用返回500为什么不会自动重试3次啊?535e37a7b7ac1d40fe9738430e4a10e9.png

展开
收起
小小鹿鹿鹿 2023-10-30 22:44:40 109 0
7 条回答
写回答
取消 提交回答
  • 在阿里云的函数计算中,对于事件驱动的函数调用(如OSS事件、消息服务MNS等),当函数执行失败时(例如返回错误或超时),系统会自动重试。默认的重试次数是3次。但这并不适用于所有调用类型。

    对于HTTP触发器的函数调用,情况就略有不同。HTTP触发的函数计算调用默认情况下是同步的,也就是说调用者会等待函数执行完成并获得响应。如果函数返回了500错误,系统不会自动重试,因为这是一个同步调用,它将错误直接反馈给调用者,让调用者决定是否需要重试。

    如果你希望在HTTP触发的函数计算中实现自动重试,你可能需要在调用端实现重试逻辑,而不是依赖函数计算本身的重试机制。

    2023-10-31 18:43:07
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在阿里云 Function Compute 中,默认情况下,HTTP 异步调用是不支持自动重试的,也就是说,一旦调用失败,就需要人工介入才能重新发送请求。这是因为异步调用是一个“fire-and-forget”的模式,即在发送请求后,函数计算会立刻返回,不再关心后续的结果。
    然而,您可以通过编程方式自行实现重试逻辑。例如,在收到 HTTP 500 错误后,可以使用函数计算提供的异步调用 API,再次发起相同的请求,直到请求成功为止。这需要您编写相应的代码逻辑来处理重试和错误处理。
    此外,阿里云 Function Compute 提供了一种名为“Serverless Task Queue”的服务,可以用于执行重试逻辑。您可以在函数计算控制台上启用它,并在函数内部调用它的 API 来实现自动重试。但是,需要注意的是,Serverless Task Queue 是收费的服务,且可能存在一些使用限制,因此需要根据实际情况进行评估和选择。

    2023-10-31 13:11:18
    赞同 展开评论 打赏
  • 在阿里函数计算中,HTTP触发器的异步调用默认情况下是不会自动重试的。这是因为HTTP触发器的异步调用方式采用的是at least once的方式,这意味着消息至少会被传递一次,但并不一定只被传递一次。因此,在收到错误响应(例如500状态码)的情况下,为了避免数据的重复处理,系统不会自动进行重试。
    如果你想实现重试机制,可以通过编写代码来实现。你可以设置函数的重试配置,包括最大重试次数和重试间隔时间。当函数执行失败时,系统将在指定的时间间隔内进行重试,直到达到最大重试次数为止。具体的实现方法可以参考阿里云函数计算的相关文档或者开发者社区中的相关内容。

    2023-10-31 09:25:22
    赞同 展开评论 打赏
  • 在阿里函数计算中,HTTP异步调用的重试机制是由用户自己控制的。默认情况下,函数计算不会自动进行重试。如果你希望你的函数在被调用后遇到错误时可以自动重试,你需要在你的代码中实现这个功能。

    你可以在你的函数代码中添加一个重试逻辑,例如:

    import time
    import logging
    from ali_function_compute import Client as FcClient
    
    def retry(func):
        def wrapper(*args, kwargs):
            max_retries = 3
            for i in range(max_retries):
                try:
                    return func(*args, kwargs)
                except Exception as e:
                    if i + 1 < max_retries:
                        logging.error('Retrying due to exception: {}'.format(e))
                        time.sleep(2)
                    else:
                        raise
        return wrapper
    
    @retry
    def my_function(fc_client):
        # Your function code here
        pass
    
    if __name__ == '__main__':
        fc_client = FcClient()
        my_function(fc_client)
    

    在这个例子中,我们定义了一个名为retry的装饰器,它会在函数调用失败时自动重试。然后,我们将这个装饰器应用到我们的函数my_function上。这样,当my_function被调用并遇到错误时,它会自动尝试重试,直到达到最大重试次数。

    2023-10-31 08:53:55
    赞同 展开评论 打赏
  • 只会一次调用呃。

    HTTP请求支持异步调用,您可以通过增加请求头"X-Fc-Invocation-Type":"Async"的方式实现HTTP请求的异步调用。具体信息,请参见HTTP触发器概述。https://help.aliyun.com/zh/fc/user-guide/overview-36#multiTask12687

    如您想获取调用结果,只能通过配置异步目标服务实现结果回调功能。具体操作,请参见结果回调。https://help.aliyun.com/zh/fc/user-guide/result-callback#task-2203700

    2023-10-31 08:37:18
    赞同 1 展开评论 打赏
  • 异步调用失败,函数计算会自动重试的情况如下表所示。
    image.png

    比如状态码是500,以二进制指数退避方式重试执行5小时。当您的函数执行失败后将在0.5秒后开始重试,后续重试执行的时间间隔将以二进制指数退避方式计算,即重试时间间隔为1秒、2秒、4秒、8秒等持续重试5小时。

    ——参考来源于阿里云官方文档

    2023-10-31 00:38:21
    赞同 展开评论 打赏
  • 在阿里云函数计算中,HTTP异步调用只有在出现网络错误、服务内部错误等可重试场景才会进行自动重试。如果函数执行过程中出现了业务逻辑错误或者函数超时等情况导致的500错误,是不会进行自动重试的。因为这些情况下一般都需要人工介入去修复或者优化业务代码才能解决问题,而并非通过简单的重试就能解决。
    如果你确实需要在遇到500错误时进行自动重试,可以考虑在调用HTTP接口的地方自行添加重试机制。例如,使用Promise的catch方法捕获错误,并在catch方法中再次尝试调用HTTP接口。具体实现方式可以根据实际需求和业务场景来定。

    2023-10-31 08:00:59
    赞同 展开评论 打赏
滑动查看更多

快速交付实现商业价值。

相关产品

  • 函数计算
  • 热门讨论

    热门文章

    相关电子书

    更多
    Hologres Serverless之路:揭秘弹性计算组 立即下载
    Serverless开发平台: 让研发效能再提升 立即下载
    Serverless 引领云上研发新范式 立即下载