Share via


Orleans를 사용한 스트리밍

Orleans v.1.0.0은 프로그래밍 모델에 스트리밍 확장에 대한 지원을 추가했습니다. 스트리밍 확장은 스트림을 더 간단하고 강력하게 생각하고 사용할 수 있도록 하는 추상화 및 API 세트를 제공합니다. 스트리밍 확장을 사용하면 개발자가 일련의 이벤트에 대해 구조화된 방식으로 작동하는 반응형 애플리케이션을 작성할 수 있습니다. 스트림 공급자의 확장성 모델은 Event Hubs, ServiceBus, Azure QueuesApache Kafka와 같은 광범위한 기존 큐 기술과 호환되고 이식 가능한 프로그래밍 모델을 만듭니다. 이러한 큐와 상호 작용하기 위해 특수 코드를 작성하거나 전용 프로세스를 실행할 필요가 없습니다.

왜 주의해야 하나요?

스트림 처리에 대한 모든 것을 이미 알고 있고 Event Hubs, Kafka, Azure Stream Analytics, Apache Storm, Apache Spark Streaming.NET의 Rx(Reactive Extensions)와 같은 기술에 익숙한 경우 주의해야 하는 이유를 묻는 메시지가 표시될 수 있습니다. 다른 스트림 처리 시스템이 필요한 이유와 행위자가 스트림과 어떻게 관련되어 있나요?"왜 Orleans Streams인가요?"라는 질문에 답하기 위한 것입니다.

프로그래밍 모델

Orleans Streams 프로그래밍 모델에는 다음과 같은 몇 가지 원칙이 있습니다.

  1. Orleans 스트림은 가상입니다. 즉, 스트림은 항상 존재합니다. 명시적으로 생성되거나 제거되지 않으며 실패할 수 없습니다.
  2. 스트림은 GUID와 문자열로 구성된 논리적 이름인 스트림 ID로 식별됩니다.
  3. Orleans Streams를 사용하면 시간과 공간 모두에서 데이터 생성과 처리를 분리할 수 있습니다. 즉, 스트림 생산자와 스트림 소비자는 서로 다른 서버 또는 다른 표준 시간대에 있을 수 있으며 오류를 견딜 수 있습니다.
  4. Orleans 스트림은 가볍고 동적입니다. Orleans 스트리밍 런타임은 빠른 속도로 오고 가는 많은 수의 스트림을 처리하도록 설계되었습니다.
  5. Orleans 스트림 바인딩은 동적입니다. Orleans 스트리밍 런타임은 조직이 빠른 속도로 스트림에 연결되고 연결이 끊어지는 경우를 처리하도록 설계되었습니다.
  6. Orleans 스트리밍 런타임은 스트림 사용의 수명 주기를 투명하게 관리합니다. 애플리케이션이 스트림을 구독한 후에는 오류가 있는 경우에도 스트림의 이벤트를 수신합니다.
  7. Orleans 스트림은 조직 및 Orleans 클라이언트에서 균일하게 작동합니다.

프로그래밍 API

애플리케이션은 Orleans.Streams.IAsyncObserver<T>Orleans.Streams.IAsyncObservable<T> 인터페이스를 구현하는 Orleans.Streams.IAsyncStream<T>을 사용하여 스트림과 상호 작용합니다. 이러한 API는 잘 알려진 .NET의 Rx(Reactive Extensions)와 유사합니다.

아래의 일반적인 예제에서 디바이스는 클라우드에서 실행되는 서비스에 HTTP 요청으로 전송되는 일부 데이터를 생성합니다. 프런트 엔드 서버에서 실행되는 Orleans 클라이언트는 이 HTTP 호출을 수신하고 일치하는 디바이스 스트림에 데이터를 게시합니다.

public async Task OnHttpCall(DeviceEvent deviceEvent)
{
     // Post data directly into the device's stream.
     IStreamProvider streamProvider =
        GrainClient.GetStreamProvider("MyStreamProvider");

    IAsyncStream<DeviceEventData> deviceStream =
        streamProvider.GetStream<DeviceEventData>(
            deviceEvent.DeviceId, "MyNamespace");

     await deviceStream.OnNextAsync(deviceEvent.Data);
}

아래의 또 다른 예에서는 채팅 사용자(Orleans Grain으로 구현됨)가 채팅방에 참가하고, 이 채팅방의 다른 모든 사용자가 생성한 채팅 메시지 스트림에 대한 핸들을 가져와서 구독합니다. 채팅 사용자는 채팅방 조직 자체(시스템에는 이러한 조직이 없을 수 있음) 또는 메시지를 생성하는 해당 그룹의 다른 사용자에 대해 알 필요가 없습니다. 말할 필요도 없이 채팅 스트림에 게시하기 위해 사용자는 현재 스트림을 구독하는 사용자를 알 필요가 없습니다. 이는 채팅 사용자가 시간과 공간에서 완전히 분리될 수 있는 방법을 보여 줍니다.

public class ChatUser: Grain
{
    public async Task JoinChat(Guid chatGroupId)
    {
        IStreamProvider streamProvider =
            base.GetStreamProvider("MyStreamProvider");

        IAsyncStream<string> chatStream =
            streamProvider.GetStream<string>(chatGroupId, "MyNamespace");

        await chatStream.SubscribeAsync(
            async (message, token) => Console.WriteLine(message))
    }
}

빠른 시작 샘플

빠른 시작 샘플은 애플리케이션에서 스트림을 사용하는 전체 워크플로에 대한 간략한 개요입니다. 이 개요를 읽은 후에는 스트림 프로그래밍 API를 읽어 개념을 더 깊이 이해해야 합니다.

스트림 프로그래밍 API

스트림 프로그래밍 API는 프로그래밍 API에 대한 자세한 설명을 제공합니다.

스트림 공급자

스트림은 다양한 모양과 양식의 실제 채널을 통해 올 수 있으며 다른 의미 체계를 가질 수 있습니다. Orleans Streaming은 시스템의 확장성 지점인 스트림 공급자의 개념을 통해 이러한 다양성을 지원하도록 설계되었습니다. Orleans에는 현재 TCP 기반 단순 메시지 스트림 공급자 및 Azure 큐 기반 Azure 큐 스트림 공급자라는 두 개의 스트림 공급자 구현이 있습니다. 스트림 공급자에 대한 자세한 내용은 스트림 공급자에서 찾을 수 있습니다.

스트림 의미 체계

스트림 구독 의미 체계:

Orleans Streams는 스트림 구독 작업에 대한 순차적 일관성을 보장합니다. 특히 소비자가 스트림을 구독할 때 구독 작업을 나타내는 Task가 성공적으로 해결되면 구독한 후에 생성된 모든 이벤트가 소비자에게 표시됩니다. 또한 되감기 가능 스트림을 사용하면 StreamSequenceToken을 사용하여 과거의 임의 시점부터 구독할 수 있습니다. 자세한 내용은 Orleans 스트림 공급자를 참조하세요.

개별 스트림 이벤트 전달 보장:

개별 이벤트 전달 보장은 개별 스트림 공급자에 따라 달라집니다. 일부는 최대 한 번 전달(예: SMS(단순 메시지 스트림))만 제공하는 반면, 다른 일부는 최소 한 번 전달(예: Azure 큐 스트림)을 제공합니다. 정확히 한 번 전달을 보장하는 스트리밍 공급자를 빌드할 수도 있습니다(이러한 공급자는 아직 없지만 빌드할 수 있음).

이벤트 전달 순서:

또한 이벤트 순서는 특정 스트림 공급자에 따라 달라집니다. SMS 스트림에서 생산자는 게시 방법을 제어하여 소비자가 볼 수 있는 이벤트의 순서를 명시적으로 제어합니다. 기본 Azure 큐는 오류 발생 시 순서를 보장하지 않으므로 Azure 큐 스트림은 FIFO 순서를 보장하지 않습니다. 애플리케이션은 StreamSequenceToken을 사용하여 스트림 전달 순서를 제어할 수도 있습니다.

스트림 구현

Orleans Streams 구현은 내부 구현에 대한 개략적인 개요를 제공합니다.

코드 샘플

조직 내에서 스트리밍 API를 사용하는 방법에 대한 더 많은 예제는 여기에서 찾을 수 있습니다. 향후에 더 많은 샘플을 만들 계획입니다.

참고 항목