2

AWS 람다 함수로 배포하려는 node.js functon이 있습니다. Redis Elasticache를 사용할 때 redis.createClient로 연 연결을 닫아야합니다. 그렇지 않으면 람다 함수가 시간 초과됩니다. 나는 단순히 클라이언트의 quit() 메소드를 호출함으로써이를 수행한다. 람다 콜백을 발행하기 전에 이렇게하면 람다 함수가 예상대로 종료됩니다. 그렇지 않으면 람다 함수가 설정 한 시간 초과 간격으로 시간 초과가 발생합니다. 테스트 설정에서 캐시에서 작동하고 30 밀리 초 내에 종료되는 람다 함수가 있습니다. redis client quit() 메서드를 호출하지 않으면 동일한 람다 함수가 1 분 시간 초과 전에 종료되지 않습니다. 확실하지는 않지만 함수가 실행 중인지 (콜백 후에도) redis 연결이 여전히 활성화되어 있기 때문에 Lambda 함수가이 방식으로 작동한다고 가정합니다.람다 함수에서 DAX 클라이언트 닫기

quit() 메서드를 호출하기가 쉽기 때문에 걱정하지 않아도됩니다. 내가 가지고있는 문제는 DynamoDB DAX 클라이언트와 비슷한 것을하려고 할 때입니다. 람다 함수에 내 VPC 끝점을 통해 DynamoDB에 직접 액세스 할 수 있으며 모든 것이 올바르게 작동합니다. DAX 클라이언트를 사용하면 테이블 수정이 실제로 수행됩니다 (항목을 삽입하고 거기에 있음을 볼 수 있음). 그러나 람다 함수는 항상 시간 초과됩니다. 난 그냥 ddbClient를 사용하는 경우

const AmazonDaxClient = require('amazon-dax-client'); 
const AWS    = require('aws-sdk'); 
const config   = require('./config'); 

AWS.config.update(config.aws); 
var ddbClient = new AWS.DynamoDB.DocumentClient(config.dynamodb); 
var dax = new AmazonDaxClient(config.dax); 
var daxClient = new AWS.DynamoDB.DocumentClient({service: dax }); 

은, 모든 작품 : 여기에

은 몇 가지 예제 코드입니다. daxClient를 사용하면 모든 것이 또한 작동하지만 (삽입, 삭제, 업데이트 등), 람다 함수가 시간 초과됩니다. 완료된 DAX 클러스터에 daxClient에 대해 비슷한 quit() 메소드가 있습니까? 그러면 모든 연결을 완전히 닫을 수 있습니까? 나는이 문제가 daxClient가 정상적인 ddbClient와 똑같이 동작하고 ddbClient에 quit() 메소드가 없기를 바란다고 생각한다.

+2

'context.callbackWaitsForEmptyEventLoop = false'를 설정해보십시오. DAX와 redis 모두에 대한 시간 초과를 처리해야하며, 외부에서 구성된 전역 변수와의 연결을 설정할 수 있어야합니다. 핸들러를 만들고, 함수를 호출 할 때마다 초기화 할 필요가 없기 때문에 작업을 조금 더 빠르게 할 수 있습니다. (나는 DAX 클라이언트에 익숙하지 않지만, 아무도이 옵션을 사용하지 않고 소켓을 열어 둔다면 Lambda는 기다린다.) –

+0

Michael, 두 가지 모두에서 트릭을했다. 감사! 동의 할 수 있도록 답을 작성 하시겠습니까? –

답변

3

람다 context 속성 callbackWaitsForEmptyEventLoop (문서 번호 here)이 귀하의 사건과 관련이있는 것으로 보입니다. 기본적으로 true으로 설정되어 있습니다. 즉, 노드 이벤트 루프에 아무 것도 남아있는 한 핸들러가 콜백을 통해 값을 반환하더라도 람다는 실행을 완료하지 않습니다.

false으로 설정하면 Lambda 처리기가 이벤트 루프의 작업도 완료 할 수 있지만 Lambda가 실행되지 않는 동안 이러한 논리 스레드가 실행을 고정시킵니다. 이 동작은 라이브러리의 안정성에 따라 모든 라이브러리에 적합하지 않을 수 있습니다.

흥미로운 측면에서, context.succeed (예 : callback)을 호출하는 이전 람다 반환 스타일은 속성 설정에 관계없이 빈 이벤트 루프를 기다리지 않습니다. (This gist은 몇 가지 세부 사항을 설명합니다.)

+0

분명히 밝혀 지지만,이 솔루션은 효과가 있습니다.하지만 Lambda가 이벤트 루프에서 기다리는 것이 확실하지 않습니다. 캐시 쓰기에서 콜백에있는 람다 콜백 만 발행합니다. 그래서 내가 아는 한, 이벤트 루프에서 기다리는 다른 것이 없어야합니다. 나는 캐시와의 연결이 끝났을뿐입니다. redis 캐시를 사용하여 quit()을 실행하면 문제가 해결되었지만 DAX와 비슷한 것은 없습니다. DAX로이 방법을 테스트 한 후에 callbackWaitsForEmptyEventLoop을 false로 설정해도 DynamoDB에 대한 모든 기록이 존재한다는 것을 알았습니다. –

+0

DAX 클라이언트 코드를 조사하지 않고도 말할 수는 없지만 효율적인 이유로 이벤트 루프가 완전히 비워지지 않도록하는 일종의 파일 핸들 (네트워크 연결?)이 열려있을 가능성이 있습니다. –

+0

나는 코드에서 어떤 일이 일어나고 있는지 보려고 심도 깊은 다이빙을했습니다 (다른 곳에서도 문제를 일으키기 때문에). 소켓 연결이 끝나면 소켓 연결을 정리하지 않는 것 같습니다. –