IObservable에 IQueryable과 유사한 추가 기능이 있습니까?(.NET 수신)

StackOverflow https://stackoverflow.com/questions/1179296

  •  19-09-2019
  •  | 
  •  

문제

.NET 4.0에 포함된 System.Reactive 라이브러리의 새로운 IObservable/IObserver 프레임워크는 매우 흥미롭습니다. 이것 그리고 이것 링크).

추측하기에는 너무 이르지만, 이러한 새로운 인터페이스를 위해 구축된 IQueryable과 유사한 프레임워크도 있을 것입니까(더 나은 용어가 없음)?

특정 사용 사례 중 하나는 수신 통화 체인이 아닌 소스에서 이벤트 전처리를 지원하는 것입니다.예를 들어, 매우 '수다스러운' 이벤트 인터페이스가 있는 경우 Subscribe().Where(...) 파이프라인을 통해 모든 이벤트를 수신하고 클라이언트가 필터링을 수행합니다.

내가 궁금한 것은 IQueryableObservable과 유사한 것이 있을 것이라는 점입니다. 이에 따라 이러한 LINQ 메서드는 일부 '스마트'로 '컴파일'됩니다. Subscribe 소스에서 구현.그러한 프레임워크를 사용할 수 있는 특정 네트워크 서버 아키텍처를 상상할 수 있습니다.또는 .NET 코드가 새로운 데이터 알림(코드의 트리거)을 수신할 수 있도록 하고 서버 측에서 필터링된 알림이 필요한 SQL Server(또는 해당 문제의 RDBMS)에 대한 추가 기능은 어떻습니까?

도움이 되었습니까?

해결책

음, Rx의 최신 릴리스에서는 다음과 같은 인터페이스 형태로 제공됩니다. IQbservable (IQueryableObservable로 발음).다음 주 초에 올라올 주제에 대한 채널 9 비디오를 계속 지켜봐 주시기 바랍니다.

이 기능을 약간 배치하려면 Rx/Ix 퍼즐에 개념적으로 세 개의 직교 축이 있다는 것을 알아야 합니다.

  • 무엇 데이터 모델은 당신이 목표로 삼고 있는 것입니다.여기에서 풀 기반 모델과 푸시 기반 모델을 찾을 수 있습니다.그들의 관계는 다음을 기반으로합니다. 이중성.해당 세계 사이에는 변환이 존재합니다(예:열거 가능).
  • 어디 쿼리를 구동하는 작업을 실행합니다(sensu lato).특정 연산자에는 동시성이 필요합니다.이곳은 스케줄링 IScheduler 인터페이스가 들어옵니다.동시성 도메인 사이를 이동하기 위해 연산자가 존재합니다(예:ObserveOn).
  • 어떻게 쿼리 표현식을 실행해야 합니다.축어적(IL) 또는 번역 가능(표현식 트리)입니다.그들의 관계는 다음을 기반으로합니다. 동질성.두 표현 간에 변환이 존재합니다(예:AsQueryable).

모든 IQbservable 인터페이스(IQueryable과 IObservable 쿼리의 표현식 트리 표현의 이중 인터페이스)가 활성화하는 것이 마지막 지점입니다.때때로 사람들은 쿼리 변환 작업(실행하는 "방법")을 원격 측면(실행하는 "위치")과 혼동합니다.일반적으로 그렇게 하지만 번역하다 일부 대상 언어(예: WQL, PowerShell, 클라우드 알림 서비스용 DSQL 등)에 대한 쿼리 원격 이를 일부 대상 시스템에 추가하면 두 가지 문제를 분리할 수 있습니다.예를 들어 표현식 트리 표현을 사용하여 다음을 수행할 수 있습니다. 현지의 쿼리 최적화.

가능한 보안 문제와 관련하여 이는 IQueryable 기능과 다르지 않습니다.일반적으로 표현 언어만 원격으로 사용하고 "진정한 부작용" 연산자(근본주의 기능 언어 이외의 언어에 대한 의미)는 사용하지 않습니다.특히 Subscribe 및 Run 작업은 로컬 상태를 유지하고 쿼리 가능한 모나드에서 빠져나옵니다(따라서 IQueryable 세계에서 GetEnumerator가 수행하는 것과 마찬가지로 변환이 트리거됩니다).구독 행위를 어떻게 원격으로 처리할 것인지는 독자의 상상에 맡기겠습니다.

가지고 놀기 시작하세요 최신 비트 오늘 여러분의 생각을 알려주세요.또한 일부 디자인 철학에 대한 논의를 포함하여 이 새로운 기능에 대한 향후 Channel 9 비디오를 계속 지켜봐 주시기 바랍니다.

다른 팁

이것은 흥미로운 가능성처럼 들리지만, 나는 이것을 구현하는 것에 대해 몇 가지 예약을 할 것입니다.

1) iqueryable이 사용하는 사소한 람다 표현을 직렬화 할 수없는 것처럼 RX에 대해 직렬화하는 것은 비슷하게 어려울 것입니다. 이 프레임 워크의 일부로 멀티 라인 및 문장 Lambdas를 직렬화 할 수 있기를 원할 것입니다. 그렇게하려면 Erik Meijer의 다른 애완 동물 프로젝트 인 Dryad 및 Volta와 같은 것을 구현해야 할 것입니다.

2) 이러한 Lambda 표현식을 직렬화 할 수 있더라도 클라이언트에서 보낸 서버에서 임의 코드를 실행할 가능성에 대해 우려 할 것입니다. 이로 인해 보안 문제는 크로스 사이트 스크립팅보다 훨씬 큰 보안 문제를 일으킬 수 있습니다. 클라이언트가 서버에 표현식을 보낼 수 있도록 허용하는 잠재적 이점이 보안 취약점의 영향보다 더 중요합니다.

8 (현재 10 년) 미래 : 나는 넘어졌다 qactive (이전 RXX), a rx.net 기반 쿼리 가능한 반응성 TCP 서버 제공 업체는 "문제의 질문"에 대한 답입니다.

섬기는 사람

Observable
    .Interval(TimeSpan.FromSeconds(1))
    .ServeQbservableTcp(new IPEndPoint(IPAddress.Loopback, 3205));

고객

var datasourceAddress = new IPEndPoint(IPAddress.Loopback, 3205);
var datasource = new TcpQbservableClient<long>(datasourceAddress);

(
     from value in datasource.Query()
     //The code below is actually executed on the server
     where value <= 5 || value >= 8
     select value
)
.Subscribe(Console.WriteLine);

이것에 대해 생각하는 것은 고객이 자신이받는 데이터를 원하는 데이터와 얼마나 자주 원하는지, 서버가 언제, 얼마나 빈번하고, 얼마나 빈번한 지, 얼마나 많은 데이터를 반환 할 수 있는지를 말할 수 있다는 것입니다.

이에 대한 자세한 내용은 https://github.com/rxdave/qactive

다른 블로그 .sample

https://sachabarbs.wordpress.com/2016/12/23/rx-over-the-wire/

반응성 프레임 워크와 함께 해결하고 싶은 한 가지 문제는 가능하다면 방출 및 소개가 웹 서비스 및 기타 풀 다리 서비스에서 캐시 된 데이터에 대한 알림을 변경할 수있게하는 것입니다.

새로운 채널 9를 기반으로합니다 회견, LINQ 지원이있을 것입니다 IObserver/IObservable .NET 4의 BCL에서.

그러나 본질적으로 Linq-to-Objects 스타일 쿼리 이므로이 단계에서는 '스마트 가입'처럼 보이지 않습니다. 기본 구현이 .NET 4에서 진행되는 한입니다. (위의 인터뷰에서 내 이해에서)

라고 한, 반응성 프레임 워크 (RX)는 더 자세한 구현을 가질 수 있습니다. IObserver/IObservable, 또는 당신은 자신의 통과를 쓸 수 있습니다. Expression<Func...>Subscribe 파라마터와 표현 트리를 사용합니다 Func 구독중인 이벤트 채널에 적합한 더 똑똑한 방식으로 가입하려면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top