Orleans를 사용한 스트리밍
Orleans v.1.0.0은 프로그래밍 모델에 스트리밍 확장에 대한 지원을 추가했습니다. 스트리밍 확장은 스트림을 더 간단하고 강력하게 생각하고 사용할 수 있도록 하는 추상화 및 API 세트를 제공합니다. 스트리밍 확장을 사용하면 개발자가 일련의 이벤트에 대해 구조화된 방식으로 작동하는 반응형 애플리케이션을 작성할 수 있습니다. 스트림 공급자의 확장성 모델은 Event Hubs, ServiceBus, Azure Queues 및 Apache Kafka와 같은 광범위한 기존 큐 기술과 호환되고 이식 가능한 프로그래밍 모델을 만듭니다. 이러한 큐와 상호 작용하기 위해 특수 코드를 작성하거나 전용 프로세스를 실행할 필요가 없습니다.
왜 주의해야 하나요?
스트림 처리에 대한 모든 것을 이미 알고 있고 Event Hubs, Kafka, Azure Stream Analytics, Apache Storm, Apache Spark Streaming 및 .NET의 Rx(Reactive Extensions)와 같은 기술에 익숙한 경우 주의해야 하는 이유를 묻는 메시지가 표시될 수 있습니다. 다른 스트림 처리 시스템이 필요한 이유와 행위자가 스트림과 어떻게 관련되어 있나요?"왜 Orleans Streams인가요?"라는 질문에 답하기 위한 것입니다.
프로그래밍 모델
Orleans Streams 프로그래밍 모델에는 다음과 같은 몇 가지 원칙이 있습니다.
- Orleans 스트림은 가상입니다. 즉, 스트림은 항상 존재합니다. 명시적으로 생성되거나 제거되지 않으며 실패할 수 없습니다.
- 스트림은 GUID와 문자열로 구성된 논리적 이름인 스트림 ID로 식별됩니다.
- Orleans Streams를 사용하면 시간과 공간 모두에서 데이터 생성과 처리를 분리할 수 있습니다. 즉, 스트림 생산자와 스트림 소비자는 서로 다른 서버 또는 다른 표준 시간대에 있을 수 있으며 오류를 견딜 수 있습니다.
- Orleans 스트림은 가볍고 동적입니다. Orleans 스트리밍 런타임은 빠른 속도로 오고 가는 많은 수의 스트림을 처리하도록 설계되었습니다.
- Orleans 스트림 바인딩은 동적입니다. Orleans 스트리밍 런타임은 조직이 빠른 속도로 스트림에 연결되고 연결이 끊어지는 경우를 처리하도록 설계되었습니다.
- Orleans 스트리밍 런타임은 스트림 사용의 수명 주기를 투명하게 관리합니다. 애플리케이션이 스트림을 구독한 후에는 오류가 있는 경우에도 스트림의 이벤트를 수신합니다.
- 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를 사용하는 방법에 대한 더 많은 예제는 여기에서 찾을 수 있습니다. 향후에 더 많은 샘플을 만들 계획입니다.