C 언어로 Azure 함수를 제어하는 개발 # 섹션 1: 어플리케이션 소개

과거 몇 년 동안, 서버 없는 계산은 백엔드 응용 프로그램을 개발하는 데 가장 매력적인 선택 중의 하나가 되었다.
Azure App Service 등 PaaS 제품으로 인해 서버 인프라를 관리하고 유지할 필요가 없습니다.
클라우드 서비스 공급자는 인프라 시설을 관리하고 응용 프로그램의 자동 확장과 자동 설정을 실행하기 위해 필요한 모든 번거로운 작업을 완성할 것이다.
현재Azure Functions,AWS Lambda 같은FaaS 제품이 생겨서 백엔드 개발자들은 모든 응용 서버 코드를 유지할 필요가 없다는 추가 혜택을 얻었다.
이것은 매우 강력한 추상으로 이벤트 구동 프로그램에 있어 매우 의미가 있다.특정 이벤트에 대해 수행하려는 코드를 작성하면 Azure 함수가 완료됩니다.
  • 이 코드를 호스팅
  • 실제 이벤트와 응용 프로그램 사이에 접착제 제공(실제 이벤트가 촉발되었을 때 코드가 실제 촉발되었는지 확인)
  • 접수된 이벤트 수에 따라 어플리케이션 자동 배율 조정
  • 클라우드에서 실행되는 이벤트 드라이버에 있어서 이것은 확실히 매우 강력한 모델이다.
     
    오늘날 우리는 점점 더 많은 조직들이 클라우드에서 운행하는 백엔드 시스템을 마이크로 서비스 기반의 체계 구조로 관리하는 것을 보았다.
    예를 들어Azure에서 이러한 마이크로 서비스는 Blob 저장소, 메시지 대기열, 서비스 버스, 이벤트 센터, 테이블 저장소 등 클라우드 서비스를 이용하여 서로 통신할 것이다.
    Azure 함수를 사용하면 특정 이벤트에 대한 알림을 받기 위해 코드를 등록할 수 있습니다.
    예를 들어 Azure 함수는 Blob 이벤트에 대한 알림을 받을 수 있으며 이 이벤트는 Blob이 경로에서 생성되었음을 나타냅니다.이와 유사하게 서비스 버스 테마에 도착하는 메시지는 이 테마가 등록된Azure 함수를 알릴 수 있습니다.
    금상첨화는 어떤 이벤트를 등록하려면 Methods 매개 변수에 이 서비스의 이벤트 귀속만 추가하면 된다는 점에서 매우 간단합니다!
     
    이 글에서는 Azure 함수를 사용하는 서버 없는 응용 프로그램 테스트 드라이브 개발(TDD)에 대한 실용적인 안내서를 공유하고 싶습니다.
    Azure 함수를 사용하여 서버가 없는 프로그램을 개발하기 시작했을 때, 컴파일러 테스트와 통합 테스트는 내가 좋은 상세한 지침을 찾을 수 없는 두 가지 측면이었다.
    지난 몇 달 동안 나는 개발자들이 그들의 Azure Functions 응용 프로그램에 대해 단원 테스트를 어떻게 하는지 지도하는 대량의 자원을 보았지만, 이러한 응용 프로그램에서 통합 테스트를 어떻게 실시하는지에 대해 많은 지도가 없었다.
    이 일련의 게시물에서 저는 제 경험과 교훈을 공유하고 미래의 개발자들에게 도움이 되기를 바랍니다.
    이 글은 세 부분으로 구성된 블로그 시리즈 글의 첫 번째 편이 될 것이며, 이 시리즈 글에서는 C#로 작성된 예시적인 Azure Functions 응용 프로그램을 소개할 것이다.
     
    이 시리즈의 기타 게시물
  • 섹션 1 - 본 약관


  • 또한 Github에 이 저장소를 만들었는데 이 블로그 시리즈에 사용된 모든 관련 소스 코드가 포함되어 있습니다.

    sntnupl / azure 함수 예제 unittest integrationtest


    Azure 기능 어플리케이션에 대한 유닛 및 통합 테스트를 구현하는 방법을 보여주는 예제 어플리케이션


     

    예제 응용 프로그램


    우리의 예시 프로그램은 Azure 함수로 메시지가 서비스 버스 테마에 전송될 때 Azure 서비스 버스에서 트리거하는 이벤트를 트리거합니다.
    이 메시지는 기본적으로 Azure blob 저장소의 blob 위치를 포함합니다.
    프로그램이 이 블로그의 텍스트 내용을 읽을 수 있다면, 그 내용을 Acme Corp.의 영수증 항목으로 해석하려고 시도합니다.
    이러한 해결된 Acme Corp 청구서 항목은 Azure 테이블 저장소에 저장됩니다.
    Azure 함수를 사용한 적이 있다면, 서비스 버스 트리거를 사용하는 것보다 Blob 메모리 자체가 생성한 트리거를 사용하는 것이 낫다는 것을 알고 싶을 수도 있습니다.
    몇몇 용례에서, 이것은 효과적인 해결 방안일 수도 있다.다음과 같은 이유로 서비스 버스 메시지에서 위치를 읽을 수 있도록 애플리케이션을 구축하기로 했습니다.
  • 블로그를 업로드하는 데 대한 추가 메타데이터를 더 깨끗하게 보낼 수 있습니다.예를 들어 나는 서비스 버스 메시지
  • 에서 메타데이터를 전달할 수 있다. 예를 들어transaction-id, user-id
  • 업로드된 파일의 실제 위치를 유연하게 선택할 수 있습니다(일부 고객이 AWS S3를 사용하려고 하면 어떻게 하나요?)
  • 업로드된 영수증을 처리하고자 하는 또 다른 프로그램은 지연 처리를 선택할 수 있고 심지어는 대량 처리를 원할 수도 있다.만약 우리가 서비스 버스 트리거를 선택한다면, 이 두 가지는 모두 쉽게 실현될 수 있을 것이다.
  •  
    Project Invoice Processor는 Azure 기능을 호스팅합니다.내부InvoiceWorkitemEventHandler.cs.
    [FunctionName("InvoiceWorkitemEventHandler")]
    public static async Task Run(
        [ServiceBusTrigger("workiteminvoice", "InvoiceProcessor", Connection = "ServiceBusReceiverConnection")] string msg,
        IBinder blobBinder,
        [Table("AcmeOrders", Connection = "StorageConnection")] IAsyncCollector<AcmeOrderEntry> tableOutput,
        ILogger logger)
    {
    ...
    }
    
    이 코드 [ServiceBusTrigger("workiteminvoice", "InvoiceProcessor", Connection = "ServiceBusReceiverConnection")] string msg, 는 Azure 서비스 버스에 연결되어 생성된 이벤트 트리거가 얼마나 쉬운지 보여 줍니다.
     
    우리는 단지 ServiceBusTrigger 속성을 사용하여 첫 번째 방법의 매개 변수를 수식할 수 있다.
    그 자체에는 세 개의 매개 변수가 있다.

  • 테마 이름

  • 가입 이름 및
  • ServiceBus 접속 문자열을 저장하는 구성 속성의 이름입니다.
  • 이 속성에 대한 자세한 정보를 알고 싶으면 this article를 찾아보세요. 이것은Azure 서비스의 트리거를 더욱 상세하게 설명할 수 있습니다.
     
    Azure 함수의 다음 메소드 매개 변수는 IBinder입니다.
    Azure blob 저장소의 특정 blob에 대한 입력 바인딩(읽기 위해 바인딩)을 수행합니다.ServiceBusTrigger 서비스 버스 메시지의 입력 귀속을 강제로 실행할 수 있습니다.이것은 유효합니다. 왜냐하면 우리는 항상 workiteminvoice 구독 InvoiceProcessor 테마에서 정보를 찾을 것을 알고 있기 때문입니다.
    우리는 상응하는 Blob 트리거를 사용할 수 없습니다. 서비스 버스에서 받은 메시지를 분석한 후에만 실행할 때blob의 위치를 알 수 있기 때문입니다.
    이러한 장면에 대해 우리가 운행할 때 연결을 필요로 할 때 우리는 IBinder 매개 변수를 입력할 수 있다.
    우리는blob의 위치를 알게 되면 BindAsync 실례에서 IBinder 방법을 사용하여blob의 입력과 연결을 실행할 수 있음을 곧 알게 될 것이다.
     
    마지막 매개 변수는 Azure 테이블에 저장된 출력 연결을 실행할 수 있도록 합니다. [Table("AcmeOrders", Connection = "StorageConnection")] IAsyncCollector<AcmeOrderEntry> tableOutput명령식 귀속은 Azure 메모리 계정 (연결 문자열이 설정 속성 AcmeOrders 에서 지정한) 을 사용하여 StorageConnection 이라는 표를 쓸 것을 알고 있기 때문에 이 곳에서 작동합니다.
    또한 이 테이블에 여러 항목을 쓰기 (출력) 할 수 있기 때문에 구체적인 유형으로 IAsyncCollector<T> 을 사용해야 합니다.이러한 매개변수를 비동기식 Azure 함수out 매개변수로 볼 수 있습니다.
    우리는 이것에 대해 AddAsync() 방법을 호출하여 여러 항목을 Azure 테이블에 저장할 것이다.
     

    비밀 번호


    이제 이 함수의 첫 번째 부분을 살펴보자.
    InvoiceWorkitemMessage invoiceWorkItem;
    logger.LogInformation($"C# ServiceBus topic trigger function processed message: {msg}");
    
    if (string.IsNullOrEmpty(msg)) {
        logger.LogError("Empty Invoice Workitem.");
        return;
    }
    
    try {
        invoiceWorkItem = JsonSerializer.Deserialize<InvoiceWorkitemMessage>(msg, jsonSerializationOptions);
    }
    catch (JsonException ex) {
        logger.LogError(ex, "Invalid Invoice Workitem.");
        return;
    }
    catch (Exception ex) {
        logger.LogError(ex, "Unexpected Error.");
        return;
    }
    
    if (invoiceWorkItem.DataLocationType != DataLocationType.AzureBlob) {
        logger.LogError($"Unsupported data location type {invoiceWorkItem.DataLocationType}.");
        return;
    }
    
    if (string.IsNullOrEmpty(invoiceWorkItem.DataLocation)) {
        logger.LogError("Empty data location.");
        return;
    }
    
    여기는 별거 없어요.우리는 기본적으로 서비스 라인에서 받은 메시지를 InvoiceWorkitemMessage로 해석하려고 시도하고 있다.
    메시지가 유효하고 해석이 가능한 경우 blob 위치가 Azure blob 저장소 유형인지 확인합니다(현재 Azure blob 저장소만 지원).
     
    blob 경로를 알면 IBinder 실례를 사용하여 특정한 blob 경로에 연결할 수 있습니다.앞에서 말한 바와 같이 우리는 BindAsync 방법을 사용하여blob 내용의 Stream를 얻을 것이다.
    var blobAttr = new BlobAttribute(invoiceWorkItem.DataLocation, FileAccess.Read) {
        Connection = "StorageConnection"
    };
    
    using (var blobStream = await blobBinder.BindAsync<Stream>(blobAttr)) {
       //...
    }
    
     
    그리고 우리는 InvoiceParser류의 실례를 사용하여 이blob의 내용을 해석할 것이다.
    if (!InvoiceParser.TryParse(blobStream, logger, out List<AcmeOrder> orders)) {
        logger.LogError("Failed to parse invoice.");
        return;
    }
    
    나는 TryParse 방법의 내부 행위를 뛰어넘을 것이다. 왜냐하면 이것은 우리가 여기서 토론하는 범위를 진정으로 늘리지 않았기 때문이다.
    자세한 내용은 InvoiceParser.cs 파일을 참조하십시오.
     
    만일 모든 것이 순조롭고 블로그의 내용을 하나 이상의 AcmeOrder 로 해석할 수 있다면, 우리는 그것들을 Azure 테이블 저장소에 영구화할 수 있다.
    앞에서 말한 바와 같이 우리는 AddAsync()에서 IAsyncCollector<AcmeOrderEntry> 방법을 사용하여 이 점을 실현한다.
    foreach (var order in orders) {
        await tableOutput.AddAsync(new AcmeOrderEntry(invoiceWorkItem.UserEmail, order));
        logger.LogInformation($"Added table record for BigBasket Order number: {order.OrderNumber}");
    }
    
     
    이 예시 프로그램을 사용하여 TDD를 실행하기 위해서, 우리는 이 코드에 대한 단원 테스트와 통합 테스트를 작성해야 한다.
     
    이 문서에서 우리는 이 Azure 함수에 대해 단원 테스트를 어떻게 실현하는지 토론할 것이다.안녕히 계세요!

    좋은 웹페이지 즐겨찾기