发送请求后AWS Lambda超时

时间:2019-05-19 15:28:25

标签: javascript node.js amazon-web-services aws-lambda

我正在将对象数组发送到AWS Lambda函数,以便它可以触发该数组中每个对象的POST请求,但是lambda函数在API网关日志中始终给我一个错误:

  

由于超时错误,执行失败

30秒后:

  

正在将请求发送到https://lambda.ap-southeast-1.amazonaws.com/2015-03-31/functions/ ...

我也收到重复的POST请求,因为Lambda每次尝试失败后都会重试5次,并且每次都从阵列上重新开始。

这是lambda函数:

public class MainActivity extends AppCompatActivity {
private String URLline = "https://demonuts.com/Demonuts/JsonTest/Tennis/simplelogin.php";

    private EditText etUname, etPass;
    private Button btn;
    public static String firstName, hobby,myresponse,myresponse2,result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etUname = findViewById(R.id.etusername);
        etPass = findViewById(R.id.etpassword);
        btn = findViewById(R.id.btn);
        final Map<String,String> params2 = new HashMap<String, String>();
        params2.put("PARAM1","AAA");
        params2.put("PARAM2","ABC");


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                result=loginUser(URLline,params2);
                Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
                        Toast.makeText(MainActivity.this,"Hellooooooo",Toast.LENGTH_LONG).show();

            }
        });

    }
    private String loginUser(String URL, final Map params2){

            StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,

                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                       Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
                        myresponse =response;
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                    }
                }

                )

        {
            @Override
            protected Map<String,String> getParams(){
                Map<String,String> params = new HashMap<String, String>();
                params.putAll(params2);
                return params;
            }
        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(200000, -1, 0));
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
        if (myresponse != null)
        {
            myresponse=myresponse.replaceAll("//r//n","");
            myresponse=myresponse.replaceAll("//","");
            myresponse=myresponse.substring(1,myresponse.length()-2);
        }
        return myresponse;
    }

}

1 个答案:

答案 0 :(得分:0)

您正在达到API网关超时限制(30秒),而不是在Lambda函数上超时。

此30秒的API网关超时是一个硬限制,无法增加。对于长时间运行的进程,请考虑使函数异步,也许使用诸如SQS之类的排队机制。

注意:即使API网关在30秒后超时(返回HTTP调用),也不一定不一定意味着Lambda函数会同时终止。 Lambda函数可能会继续处理超过30秒标记,直至达到其自身的超时限制。

因此,即使在客户端API调用返回错误后,Lambda函数也可以完成其余的POST调用。这可能是您看到许多重复项的另一个原因-每次调用API时,即使出现错误消息,该函数也可能运行完成。

(n.b。,除非该函数是幂等的,通常来说,Lambda函数最好检测是否使用相同的数据多次调用它们,并优雅地处理此类情况以防止重复。)