Azure Functions는 아직 익숙하지 않아서 계속 배우고 있습니다. Couchbase를 사용한 Azure Functions에 대해 블로그에 포스팅했습니다. 한 달 전. 이 글을 게시한 직후, 저는 Couchbase 클러스터(및 버킷)를 인스턴스화하는 방식에 대한 유용한 피드백을 받았습니다.
저는 Azure 함수 호출 간에 상태를 저장할 방법이 없다고 (잘못) 생각했습니다. 그래서 저는 GetCluster()
메서드를 호출할 수 있습니다. 하지만 카우치베이스 초기화 클러스터
객체는 비용이 많이 드는 연산입니다. 인스턴스화 빈도가 적을수록 좋습니다.
업데이트된 이 블로그 게시물의 소스 코드는 깃허브에 있습니다..
정적 상태
사용 가능 여부에 대한 문서를 찾는 데 어려움을 겪었습니다. 정적
객체를 만들어 함수 호출 간에 재사용할 수 있습니다. 다음과 같은 실험을 해볼 걸 그랬어요. 동료 마이크로소프트 MVP 마크 히스 가 그랬죠. 대신, 저는 가 스택오버플로에 질문을 던졌습니다..
간단히 말해서 그렇습니다. A 클러스터
를 인스턴스화하여 정적 멤버에 저장하면 함수 호출 간에 재사용할 수 있습니다. 위의 마크의 게시물에 따르면 이 값이 얼마나 오래 유지될지는 보장할 수 없습니다. 하지만 이는 "서버리스"로 전환할 때 예상되는 절충안입니다.
Azure 함수 내에서 지연 초기화
단순히 정적 멤버를 사용하면 작동하지만 스레드 안전하지 않습니다. 이 문제를 해결하는 몇 가지 방법이 있지만 .NET 프레임워크에 바로 내장되어 있는 쉬운 방법은 지연 초기화 와 함께 Lazy
.
먼저, 저는 GetBucket
그리고 GetCluster
메서드를 추가했습니다. 다음으로, 저는 Lazy
속성을 대체할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 |
비공개 정적 읽기 전용 Lazy<IBucket> 버킷 = new Lazy<IBucket>(() => { var uri = 구성 관리자.앱 설정["couchbaseUri"]; var 버킷 이름 = 구성 관리자.앱 설정["couchbase버킷이름"]; var 버킷 비밀번호 = 구성 관리자.앱 설정["couchbaseBucketPassword"]; var 클러스터 = new 클러스터(new 클라이언트 구성 { 서버 = new 목록<Uri> { new Uri(uri) } }); 반환 클러스터.OpenBucket(버킷 이름, 버킷 비밀번호); }); |
이 예제에서는 버킷에 대한 단일 프로퍼티만 만들었으므로 이 정도면 충분합니다. 하지만 클러스터를 사용해야 하는 경우 자체적으로 쉽게 만들 수 있습니다. Lazy
속성을 추가합니다. (클러스터가 있으면 버킷을 얻는 것은 비교적 저렴한 작업입니다).
게으른 속성 사용
인스턴스화할 때 Lazy
객체에 초기화 람다를 제공하면 됩니다. 이 람다는 초기화 람다는 가치
속성이 실제로 처음으로 호출됩니다.
1 2 3 4 5 6 |
var lazyObject = new Lazy<문자열>(() => { // 이 코드는 'lazyObject.Value'가 참조될 때까지 호출되지 않습니다. // 처음으로 반환 "나는 게으르다!"; }); |
예를 들어 가치
사이 버킷
그리고 GetAsync
를 업데이트했습니다:
1 |
var doc = 기다림 버킷.가치.GetAsync<내 문서>(id); |
처음 사용하는 경우 가치
를 사용하면 클러스터가 초기화됩니다. 그렇지 않으면 이미 초기화된 클러스터를 사용합니다( Guid
대신 버킷
).
요약
정적 멤버를 사용하여 Azure 함수 호출 간에 상태를 저장할 수 있습니다. 스레드에 안전한지 확인합니다( Lazy
또는 이와 유사한 것). 해당 객체가 얼마나 오래 있을지에 대해 어떤 가정도 하지 마세요.
제가 놓친 것이 있나요? Couchbase와 함께 Azure Functions를 사용하고 있나요? 여러분의 의견을 듣고 싶습니다. 아래에 댓글을 남기거나 다음 주소로 핑해 주세요. 트위터 @mgroves.