【问题标题】:Will there be IQueryable-like additions to IObservable? (.NET Rx)IObservable 是否会添加类似 IQueryable 的功能? (.NET 接收)
【发布时间】:2009-07-24 18:17:21
【问题描述】:

.NET 4.0 中 System.Reactive 库中的新 IObservable/IObserver 框架非常令人兴奋(请参阅 this 和 this 链接)。

现在推测可能还为时过早,但是否还会有一个(因为没有更好的术语)为这些新接口构建的类似 IQueryable 的框架?

一个特定的用例是协助在源头而不是在接收调用链中预处理事件。例如,如果您有一个非常“健谈”的事件接口,则使用Subscribe().Where(...) 将通过管道接收所有事件,并由客户端进行过滤。

我想知道是否会有类似于 IQueryableObservable 的东西,这些 LINQ 方法将在源代码中“编译”成一些“智能”Subscribe 实现。我可以想象某些可以使用这种框架的网络服务器架构。或者 SQL Server(或任何 RDBMS)的附加组件如何允许 .NET 代码接收新数据通知(代码中的触发器)并且需要在服务器端过滤这些通知。

【问题讨论】:

    标签: linq system.reactive


    【解决方案1】:

    嗯,你在最新版本的 Rx 中得到了它,以一个名为 IQbservable(发音为 IQueryableObservable)的接口的形式。请继续关注有关该主题的第 9 频道视频,该视频将于下周初播出。

    要稍微定位一下这个特性,应该意识到 Rx/Ix 难题在概念上存在三个正交轴:

    • 什么您要定位的数据模型。在这里,我们发现基于拉的模型与基于推的模型。他们的关系基于二元性。这些世界之间存在转换(例如 ToEnumerable)。
    • 在哪里您执行驱动查询的操作(sensu lato)。某些运算符需要并发性。这就是 调度 和 IScheduler 接口发挥作用的地方。操作符的存在是为了在并发域之间跳跃(例如 ObserveOn)。
    • 如何查询表达式需要执行。逐字记录 (IL) 或可翻译(表达式树)。他们的关系基于同音性。两种表示之间都存在转换(例如 AsQueryable)。

    所有 IQbservable 接口(它是 IQueryable 和 IObservable 查询的表达式树表示的对偶)启用是最后一点。有时人们会混淆查询翻译的行为(“如何”运行)和远程处理(“在哪里”运行)。虽然通常您将查询翻译为某种目标语言(例如 WQL、PowerShell、用于云通知服务的 DSQL 等)并远程将它们放入某个目标系统中,但这两个问题都涉及可以解耦。例如,您可以使用表达式树表示来进行本地查询优化。

    关于可能的安全问题,这与 IQueryable 功能没有什么不同。通常,一个人只会远程表达语言,而不是任何“真正的副作用”运算符(无论这对于原教旨主义功能性语言以外的语言意味着什么)。特别是,Subscribe 和 Run 操作保持在本地,并将您带出可查询的 monad(因此触发翻译,就像 GetEnumerator 在 IQueryable 的世界中所做的那样)。你如何远程订阅的行为是我将留给读者想象的事情。

    今天就开始使用latest bits,让我们知道您的想法。还请继续关注即将推出的有关此新功能的第 9 频道视频,其中包括对其一些设计理念的讨论。

    【讨论】:

    【解决方案2】:

    虽然这听起来像是一个有趣的可能性,但我对实现它有一些保留意见。

    1) 正如您无法序列化 IQueryable 使用的非平凡 lambda 表达式一样,为 Rx 序列化这些表达式同样困难。作为该框架的一部分,您可能希望能够序列化多行和语句 lambda。为此,您可能需要实施类似 Erik Meijer 的其他宠物项目 - Dryad 和 Volta。

    2) 即使您可以序列化这些 lambda 表达式,我也会担心在从客户端发送的服务器上运行任意代码的可能性。这很容易造成比跨站点脚本更严重的安全问题。我怀疑允许客户端将表达式发送到服务器以执行的潜在好处超过了安全漏洞的影响。

    【讨论】:

    • 嗨,Jim,Rxx 家伙推出了一个 TCP IQbservable 提供程序,它存在这些安全问题......但他们能够序列化除动态和调试表达式之外的所有内容......好东西,除了安全部分... :) 仍然是 alhpa。 :)
    • 如果您在服务器上使用受限的 AppDomain 来托管 observables,那将不是问题
    【解决方案3】:

    8(现在 10)年后:我偶然发现了 Qactive(前 Rxx),一个基于 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/

    【讨论】:

      【解决方案4】:

      如果可能的话,我希望看到反应式框架解决的一个问题是启用发射和订阅以更改来自 Web 服务和其他仅拉取服务的缓存数据的通知。

      【讨论】:

        【解决方案5】:

        看来,基于新的 channel9 interview,.NET 4 的 BCL 中将有对 IObserver/IObservable 的 LINQ 支持。

        然而,它本质上是 LINQ-to-Objects 样式的查询,所以在这个阶段,它看起来不像您所说的“智能订阅”。这就是 .NET 4 中的基本实现。(根据我对上述采访的理解)

        话虽如此,Reactive 框架(Rx)可能对IObserver/IObservable 有更详细的实现,或者你也可以在Expression&lt;Func...&gt; 中编写自己的传递Subscribe 参数,然后使用 Func 的表达式树以适合您订阅的事件频道的更智能方式订阅。

        【讨论】:

          猜你喜欢
          • 2011-08-16
          • 2015-11-21
          • 2021-11-14
          • 1970-01-01
          • 2012-08-01
          • 2012-04-04
          相关资源
          最近更新 更多