Golang Lambda中的快速重新发送响应

时间:2019-02-24 14:14:11

标签: performance amazon-web-services go aws-lambda

我有准备ES请求,将其发送到外部系统并返回其响应的golang lambda。目前,除了对interface{}的无组织回应之外,我还没有找到更好的方法。

func HandleRequest(ctx context.Context, searchRequest SearchRequest) (interface{}, error) {
    // ... some data preparation and client initalisation
    resp, err := ctxhttp.Post(ctx, &client, url, "application/json", buffer)
    if err != nil {
        return "", err
    }
    var k interface{}
    all, err := ioutil.ReadAll(resp.Body)
    err = json.Unmarshal(all, &k)
    return k, err
}

由于存在额外的ReadAllUnmarshall,我不确定这是转发响应的最快,最高效的方法。有更高效的方法吗? 我看着events.APIGatewayProxyResponse{},但其中的body –需要字符串和相同的操作

1 个答案:

答案 0 :(得分:0)

您可以通过多种不同方式处理响应

  • 如果lambda实现附加的搜索响应处理,则可能有必要使用相应的封送/拆组和附加处理逻辑来定义响应数据类型协定。

  • 如果lambda功能仅用于来自ES搜索的代理响应,则可以将搜索响应有效负载([] byte)直接传递给APIGatewayProxyResponse.Body作为[] byte,如果有效负载具有二进制数据,则可能需要base64

代码:

func handleRequest(ctx context.Context, apiRequest events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    request, err := newSearchRequest(apiRequest)
    if err != nil {
        return handleError(err)
    }
    responseBody, err := proxySearch(ctx, request)
    if err != nil {
        return handleError(err)
    }
    return events.APIGatewayProxyResponse{
        StatusCode: http.StatusOK,
        Body:       string(responseBody),
    }, nil
}

func proxySearch(ctx context.Context, searchRequest SearchRequest) ([]byte, error) {
    // ... some data preparation and client initalisation
    resp, err := ctxhttp.Post(ctx, &client, url, "application/json", buffer)
    if err != nil {
        return nil, err
    }
    responseBody, err := ioutil.ReadAll(resp.Body)
    return responseBody, err
}