이 저장소에는 일련의 사물에 대해 모두 LINQ와 관련되어 있다는 점에서 개념적으로 관련된 4개의 라이브러리가 포함되어 있습니다.
.NET용 Reactive Extensions(Rx.NET 또는 Rx(System.Reactive)라고도 함): 구성 가능한 선언적 모델을 갖춘 이벤트 기반 프로그래밍용 라이브러리
AsyncRx.NET(실험적 미리 보기)(System.Reactive.Async): 더 깊은 async
/ await
지원을 제공하는 IAsyncObservable<T>
용 Rx의 실험적 구현
.NET용 대화형 확장, 일명 Ix(System.Interactive): IAsyncEnumerable
및 IEnumerable
위한 확장된 LINQ 연산자
IAsyncEnumerable
용 LINQ(System.Linq.Async): IAsyncEnumerable
용 표준 LINQ 연산자를 구현합니다.
각 내용은 이 README의 뒷부분에서 설명됩니다.
반응형 프로그래밍은 코드가 이벤트에 응답해야 할 때 명확성을 제공합니다. Rx.NET 라이브러리는 클라우드 네이티브 애플리케이션이 안정적이고 예측 가능한 방식으로 실시간 데이터를 처리할 수 있도록 설계되었습니다.
우리는 Rx를 뒷받침하는 중요한 추상화를 설명하고 Rx.NET 라이브러리에 내장된 강력하고 광범위한 기능을 활용하는 방법을 보여주는 무료 책을 작성했습니다.
Lee Campbell의 2010년 저서(프로젝트에 친절하게 기부됨)를 기반으로 Rx.NET v6.0, .NET 8.0 및 IoT 및 실제 클라우드 네이티브 사용 사례와 같은 최신 클라우드 네이티브 사용 사례를 포함하도록 다시 작성되었습니다. 시간 스트림 데이터 처리.
Rx.NET 소개는 온라인, GitHub, PDF 및 EPUB에서 볼 수 있습니다.
채널 | 수신 | 비동기Rx | ix | 시스템.Linq.Async |
---|---|---|---|---|
NuGet.org | ||||
NuGet.org 미리 보기(릴리스보다 최신인 경우) | ||||
짓다 | Ix의 일부로 제작됨 | |||
하늘빛 유물 | ||||
출시 이력 | 릴리스 내역 | 릴리스 내역 | 릴리스 내역 |
야간 빌드의 경우 https://pkgs.dev.azure.com/dotnet/Rx.NET/_packaging/RxNet/nuget/v3/index.json
피드를 사용하도록 NuGet을 구성합니다.
https://reactivex.slack.com/의 #rxnet 채널에서 우리를 만나보세요.
이 디지털 시대에는 실시간 데이터 스트림이 어디에나 존재합니다. 금융 애플리케이션은 시기적절한 정보에 대한 신속한 대응에 달려 있습니다. 컴퓨터 네트워크는 항상 컴퓨터의 상태와 작동에 대한 광범위한 정보를 제공할 수 있었습니다. 물 공급업체와 같은 유틸리티 회사에는 운영을 모니터링하는 수많은 장치가 있습니다. 사용자 인터페이스와 게임 구축 프레임워크는 사용자 상호 작용을 매우 자세하게 보고합니다. 배달 밴은 지속적으로 진행 상황을 보고합니다. 항공기는 성능 원격 측정 기능을 제공하여 잠재적인 유지 관리 문제가 심각한 문제가 되기 전에 감지하며, 이제 자동차도 동일한 작업을 수행하기 시작했습니다. 우리 중 많은 사람들이 신체 활동과 활력 징후까지 추적하는 장치를 착용하거나 휴대합니다. 그리고 기계 학습의 개선으로 인해 계속 증가하는 실시간 데이터의 양과 다양성에서 파생할 수 있는 통찰력이 풍부해졌습니다.
그러나 그렇게 널리 퍼져 있음에도 불구하고 실시간 정보 스트림은 항상 2등 시민의 일부였습니다. 거의 모든 프로그래밍 언어에는 데이터 목록(예: 배열)을 사용하는 고유한 방법이 있지만 이러한 메커니즘은 관련 데이터가 이미 메모리에 저장되어 작업할 준비가 되어 있다고 가정하는 경향이 있습니다. 누락된 것은 정보 소스가 자체 일정에 따라 언제든지 새로운 데이터를 생성할 수 있다는 사실인 활성입니다.
Rx는 정보의 라이브 스트림에 대한 지원을 어레이와 같은 것에 대해 기대하는 것과 동일한 수준으로 향상시킵니다. 예는 다음과 같습니다.
var bigTrades = trade.Volume > 1_000_000 거래를 선택하는 거래에서;
이는 C#의 LINQ 기능을 사용하여 trades
이 100만 개가 넘는 엔터티로 필터링합니다. 이 쿼리 표현식 구문은 메서드 호출을 간단히 표현한 것이므로 다음과 같이 작성할 수도 있습니다.
var bigTrades = trades.Where(trade => trade.Volume > 1_000_000);
이 두 개의 (동등한) 코드 조각의 정확한 동작은 trades
유형에 따라 다릅니다. IEnumerable<Trade>
인 경우 이 쿼리는 목록을 반복하고 bigTrades
일치하는 개체만 포함하는 열거 가능한 시퀀스가 됩니다. trades
데이터베이스 테이블(예: Entity Framework DbSet)을 나타내는 개체인 경우 이는 데이터베이스 쿼리로 변환됩니다. 그러나 Rx를 사용하는 경우 trades
실시간 이벤트를 보고하는 개체인 IObservable<Trade>
가 됩니다. 또한 bigTrades
IObservable<Trade>
가 되며, 관찰 가능한 소스가 발생할 때마다 호출할 콜백을 Rx에 제공할 수 있습니다. 우리를 위한 것:
bigTrades.Subscribe(t => Console.WriteLine($"{t.Symbol}: 거래량 {t.Volume}"));
Rx의 두 가지 주요 기능은 다음과 같습니다.
데이터의 실시간 시퀀스를 표현하고 처리하기 위해 명확하게 정의된 방법( IObservable<T>
)
이벤트 처리 논리를 선언적으로 표현할 수 있는 연산자 집합(예: 방금 표시된 Where
연산자)
Rx는 특히 사용자 인터페이스에 성공적으로 적용되었습니다. (이것은 .NET 외부에서도 마찬가지입니다. RxJS는 Rx의 JavaScript 파생물이며 사용자 인터페이스 코드에서 매우 널리 사용됩니다.) https://github.com/reactiveui/reactiveui는 Rx를 심층적으로 사용하여 지원합니다. .NET UI 개발.
Ian Griffiths는 2020년 dotnetsheff 모임에서 Reactive Extensions for .NET에 대한 간략한 60분 개요를 발표했습니다. Rx 재생 목록에서 더 많은 비디오를 볼 수 있습니다.
Rx는 비동기 프로세스를 모델링하는 자연스러운 방법이지만 원래 설계에서는 알림에 작용하는 코드가 동기적으로 실행되는 것으로 가정했습니다. 이는 Rx의 디자인이 C#의 async
/ await
언어 기능보다 앞서기 때문입니다. 따라서 Rx는 IObservable<T>
와 Task<T>
사이를 변환할 수 있는 어댑터를 제공하지만 async
옵션이 아닌 경우도 있었습니다.
AsyncRx.Net은 IAsyncObservable<T>
정의하여 이 제한을 해제합니다. 이를 통해 관찰자는 비동기 코드를 사용할 수 있습니다. 예를 들어, bigTrades
IAsyncObservable<Trade>
인 경우 다음과 같이 작성할 수 있습니다.
bigTrades.Subscribe(async t => bigTradeStore.LogTradeAsync(t)를 기다립니다);
AsyncRx.Net은 현재 미리 보기 상태입니다.
Rx는 다른 공급자가 사용할 수 있는 모든 표준 LINQ 연산자를 정의하지만 수많은 추가 연산자도 추가합니다. 예를 들어 표준 Aggregate
연산자와 동일한 기본 처리를 수행하지만 모든 요소를 처리한 후 단일 결과를 생성하는 대신 매 단계마다 집계된 값을 포함하는 시퀀스를 생성하는 Scan
정의합니다. (예를 들어, 집계되는 연산이 덧셈인 경우 Aggregate
합계를 단일 출력으로 반환하는 반면 Scan
각 입력에 대한 누계를 생성합니다. [1,2,3]
시퀀스가 주어지면 Aggregate((a, x) => a + x)
6
만 생성하는 반면 Scan
[1,3,6]
생성합니다.)
Rx가 정의하는 추가 연산자 중 일부는 이벤트 작업을 할 때만 유용합니다. 그러나 일부는 모든 종류의 시퀀스에 적용 가능합니다. 따라서 Interactive Extensions(줄여서 Ix)는 IEnumerable<T>
에 대한 구현을 정의합니다. Ix는 사실상 LINQ to Objects의 확장으로, 수많은 추가 연산자를 추가합니다. (그 유용성은 시간이 지남에 따라 .NET 런타임 라이브러리에 Ix에서만 사용할 수 있었던 일부 연산자가 추가되었다는 사실에서 입증됩니다. 예를 들어 .NET 6에는 이전에 Ix에서만 정의되었던 MinBy
및 MaxBy
연산자가 추가되었습니다. ix.)
"Interactive"는 어떤 의미에서 "Reactive"와 반대이기 때문에 이 라이브러리를 "Interactive Extensions"라고 합니다. (이름은 사용자 상호 작용을 나타내지 않습니다.)
IAsyncEnumerable
용 LINQ( System.Linq.Async
) Ix가 개척한 기능 중 하나는 IEnumerable<T>
의 비동기 버전이었습니다. 이는 매우 유용하여 결국 .NET 런타임 라이브러리에 추가된 기능의 또 다른 예입니다. .NET Core 3.0에서는 IAsyncEnumerable<T>
도입했으며 관련 버전 C#(8.0)에서는 await foreach
구문을 사용하여 이 인터페이스에 대한 내장 지원을 추가했습니다. .
.NET Core 3.0에서는 IAsyncEnumerable<T>
정의했지만 해당 LINQ 구현은 추가하지 않았습니다. IEnumerable<T>
Where
, GroupBy
및 SelectMany
와 같은 모든 표준 연산자를 지원하는 반면, .NET에는 IAsyncEnumerable<T>
에 대한 기본 제공 구현이 없습니다. 그러나 Ix는 처음부터 IAsyncEnumerable<T>
의 프로토타입 버전에 대해 LINQ 연산자를 제공했으므로 .NET Core 3.0이 출시되었을 때 새로운 공식 IAsyncEnumerable<T>
과 함께 작동하도록 기존 LINQ 연산자를 모두 업데이트하는 것은 비교적 간단한 작업이었습니다. IAsyncEnumerable<T>
.
따라서 IEnumerable<T>
에 대해 .NET에 이미 내장된 것과 일치하도록 IAsyncEnumerable<T>
에 대한 LINQ to Objects 구현을 제공하는 System.Linq.Async NuGet 패키지가 생성되었습니다.
모든 관련 코드가 이미 Ix 프로젝트의 일부였으므로( IAsyncEnumerable<T>
도 원래 이 프로젝트에서 정의됨) System.Linq.Async NuGet 패키지는 Ix 프로젝트의 일부로 빌드됩니다.
기여할 수 있는 가장 좋은 방법은 여러 가지를 시험해 보고, 버그를 신고하고, 디자인 대화에 참여하는 것입니다.
소스 복제: git clone https://github.com/dotnet/reactive
소스 빌드, 테스트 및 디버깅
기여하는 방법
풀 리퀘스트: 열림/닫힘
할 일을 찾고 있나요? 해결해야 할 문제 목록은 시작하기에 좋은 장소입니다.
이 프로젝트는 우리 커뮤니티에서 기대되는 행동을 명확히 하기 위해 기여자 규약에서 채택한 행동 강령을 채택했습니다. 이 행동 강령은 다른 많은 프로젝트에서도 채택되었습니다. 자세한 내용은 행동 강령을 참조하세요.
이 프로젝트는 .NET Runtime과 같은 다른 프로젝트와 함께 .NET Foundation의 일부입니다. .NET Foundation은 이 프로젝트에 DevOps 인프라를 제공하여 1억 회 이상 다운로드된 이 복잡한 솔루션을 컴파일, 테스트, 서명 및 패키징합니다. 또한 프로젝트가 유지관리자에서 유지관리자로 전달되어 커뮤니티의 연속성을 가능하게 하는 관리인 제도를 제공합니다.
현재 Rx를 유지하고 있는 사람들은 다음과 같습니다:
이안 그리피스 호브, 영국 endjin.com의 Ian 블로그 | 하워드 반 루이젠 영국 윈체스터 endjin.com의 Howard 블로그 |
Rx는 약 15년 동안 존재해왔기 때문에 우리는 Rx의 제작자와 그 이후로 작업해 온 많은 사람들에게 많은 빚을 지고 있습니다. 전체 목록은 AUTHORS.txt를 참조하세요.
.NET Conf 2023의 일환으로 Ian Griffiths는 v6.0용 Rx.NET 현대화 노력과 v7.0 계획에 대한 업데이트를 제공했습니다.
자세한 내용은 다음 토론을 참조하세요.
미래의 Rx.NET 패키징
Rx.NET v6.0 및 v7.0 상위 수준 계획
우리는 Rx의 지속적인 개발을 위한 중기 계획을 설명하는 로드맵을 설정했습니다. 이 다이어그램은 Rx가 사용되는 플랫폼에 대한 관점과 이러한 다양한 대상에 대해 계획된 지원 수명주기를 보여줍니다.