Azure 기능 및 캐싱
우리는 입력 트리거가 서비스 버스 메시지이고 출력이 BLOB 저장인 Azure 기능을 개발할 계획입니다.서비스 버스 메시지에는 이미지 URL이 포함되며 이 기능은 이미지 크기를 미리 정의된 해상도로 조정하고 zure blob 스토리지에 업로드합니다.
이미지 크기를 조정해야 하는 해상도는 데이터베이스에 저장되며, Azure 함수는 입력 메시지의 이미지에 사용되어야 하는 해상도를 알기 위해 데이터베이스로 호출해야 합니다.해상도는 실제로 입력 메시지의 소스를 기반으로 구성된 마스터 데이터입니다.
데이터베이스 호출은 각 호출에 대해 데이터베이스로 이동해야 하기 때문에 비용이 많이 듭니다.데이터베이스를 호출하지 않고 데이터를 캐시하여 사용할 수 있는 방법이 있습니까?메모리 캐싱 같은 거요?
다른 .NET 응용 프로그램에서 사용하는 일반적인 접근 방식을 자유롭게 사용할 수 있습니다.
메모리에 캐시할 수 있습니다.가장 쉬운 방법은 정적 사전을 선언하고 데이터베이스 값을 내부에 넣는 것입니다(필요한 경우 동시 사전 사용).캐시된 값은 동일한 인스턴스에서 실행되는 이후의 모든 함수 실행에 재사용됩니다.인스턴스가 5분 동안 유휴 상태가 되거나 앱이 추가 인스턴스로 확장되면 데이터베이스를 다시 읽어야 합니다.
함수 코드의 SDK를 사용하여 분산 캐시(예: Redis)를 사용할 수 있습니다.기능의 상태 비저장 특성을 유지하기 때문에 조금 더 좋을 수 있지만, 비용이 조금 더 들 수 있습니다.테이블 스토리지는 Redis의 실행 가능한 대안이지만 API가 더 제한적입니다.
추가 코드 없이 사용할 수 있는 Azure Functions 자체의 "캐싱" 기능은 없습니다.
Azure Cache 서비스(https://azure.microsoft.com/en-us/services/cache/) 를 사용하여 데이터를 캐시할 수 있습니다.기본적으로 데이터베이스를 항상 호출하는 대신 Azure Function에서 Azure 캐시를 호출하고 만료되지 않았거나 설정되지 않은 경우 데이터베이스를 호출하여 값을 가져오고 적절한 만료 로직(고정 시간 또는 기타 사용자 지정 로직)을 캐시에 입력합니다.
Durable Functions를 사용하고 활동 또는 하위 오케스트레이션을 통해 데이터베이스를 호출할 수 있습니다. 반환 값은 기본적으로 캐시되며 함수가 재생될 때마다 기본 호출을 다시 하지 않고 반환됩니다.
Redis는 메모리 내 캐시이며 사용자 지정 출력 바인딩을 사용하여 기능을 깨끗하게 유지할 수 있습니다.
[FunctionName("SetPoco")]
public static async Task<IActionResult> SetPoco(
[HttpTrigger("POST", Route = "poco/{key}")] HttpRequest request,
[Redis(Key = "{key}")] IAsyncCollector<CustomObject> collector)
{
string requestBody;
using (var reader = new StreamReader(request.Body))
{
requestBody = reader.ReadToEnd();
var value = JsonConvert.DeserializeObject<CustomObject>(requestBody);
await collector.AddAsync(value);
}
return new OkObjectResult(requestBody);
}
프로젝트 링크: https://github.com/daulet/Indigo.Functions#redis
그러나 메모리 내 캐시가 이 기능을 메모리에 저장하는 경우, 이 기능은 상태 비저장 기능이므로 이 기능을 사용하는 여러 호스트에서 메모리를 공유할 수 없기 때문에 이 기능을 사용하는 것이 좋습니다.이는 Azure 기능 모범 사례에서도 권장되지 않습니다.
실행 중인 인스턴스의 메모리에 개체를 저장하고 다시 사용하는 작업을 단순화하기 위해 만든 작은 클래스입니다.물론 이는 각 새로운 인스턴스가 자체적으로 채워져야 한다는 것을 의미하지만, 이는 몇 가지 유용한 최적화를 제공할 수 있습니다.
// A simple light-weight cache, used for storing data in the memory of each running instance of the Azure Function.
// If an instance gets idle (for 5 minutes or whatever the latest time period is) or if the Function App scales out to an extra instance then the cache is re-populated.
// To use, create a static readonly instance of this class in the Azure Function class, in the constructor pass a function which populates the object to cache.
// Then simply reference the Data object. It will be populated on the first call and re-used on future calls whilst the same instance remains alive.
public class FunctionInstanceCache<T>
{
public FunctionInstanceCache(Func<T> populate)
{
Populate = populate;
IsInit = false;
}
public Func<T> Populate { get; set; }
public bool IsInit { get; set; }
private T data;
public T Data
{
get
{
if (IsInit == false)
{
Init();
};
return data;
}
}
public void Init()
{
data = Populate();
IsInit = true;
}
}
그런 다음 Azure Function 인스턴스 구현에서 Publit 메서드를 전달하는 정적 읽기 전용 인스턴스를 만듭니다.
private static readonly FunctionInstanceCache<string[]> Fic = new FunctionInstanceCache<string[]>(PopulateCache);
그런 다음 이것을 구현합니다.
private static string[] PopulateCache()
{
return DOSOMETHING HERE;
}
그럼 그냥 Fic에게 전화하세요.필요할 때 데이터 - 처음 사용할 때 데이터가 채워지고 인스턴스가 활성 상태로 유지되는 동안 다시 사용됩니다.
언급URL : https://stackoverflow.com/questions/47722722/azure-functions-and-caching
'programing' 카테고리의 다른 글
| 매크로를 실행할 수 없습니다...이 워크북에서 매크로를 사용할 수 없습니다. (0) | 2023.05.27 |
|---|---|
| WPF의 트리 보기 자동 확장 (0) | 2023.05.27 |
| 이클립스를 사용하여 에뮬레이터 스크린샷을 촬영하는 방법은 무엇입니까? (0) | 2023.05.27 |
| copy 명령을 사용하여 postgres에서 한 테이블에서 다른 테이블로 데이터를 복사하는 방법 (0) | 2023.05.27 |
| 셀레늄을 사용하여 인증서를 처리하는 방법은 무엇입니까? (0) | 2023.05.27 |