做几个简单的订阅和做一个复杂的订阅有什么区别?

What is the difference between making several simple subscriptions and a single complex one?

本文关键字:什么 区别 复杂 简单 几个 一个      更新时间:2023-09-26

保留几个简单的(普通的)订阅和保留一个复杂的(多层)订阅之间有什么实际的区别吗?(例如,使用publish-composite)

在我看来应该没有什么区别,但我想确定一下。我更喜欢使用普通的subs,因为它似乎在高度模块化的项目中使代码更清晰,但前提是不会带来任何性能或可伸缩性问题。

那么,有人能帮帮我吗?

进行几个普通订阅与保持复杂的组合订阅有两个关键区别

1)暴露隐私/

复合订阅允许您在服务器端执行连接/筛选,以确保您只发送当前用户有权查看的数据。您不希望将整个数据库公开给客户机。请记住,即使您的UI没有显示数据,用户也可以进入控制台并获取服务器发布的所有数据。

2)客户端性能

如果你有一个大的数据集,在客户端上执行连接/筛选可能会很昂贵。这当然取决于您的应用程序。此外,如果数据库不断更新,而这些更新不应该对用户可见;您将需要不断地将更新传输到客户机,而不会从网络开销中获得好处。

我认为这个问题不能给出一个精确的答案,除非你的应用程序有更多的细节。话虽如此,我认为这是一个重要的问题,所以我将概述一些需要考虑的事情。

要清楚,这个回答的重点将是讨论服务器端和客户端响应式连接的相对优点。

决定是否需要反应

您可以在发布者中生成多个集合的简单连接,而不需要任何响应性(请参阅上面文章的第一个示例)。根据问题的性质,您可能并不真正需要响应式连接。想象一下,你正在加入评论和作者,但你的应用程序总是已经发布了所有可能的作者。在这种情况下,非响应性连接的根本缺陷(新父节点之后缺少子文档)将不存在,因此响应性发布是多余的。

考虑你的安全模型

正如我在关于模板连接的文章中提到的,服务器端连接具有将所有数据捆绑在一起的优势,而客户端连接则需要更细粒度的发布者。考虑使用像commentsAndAuthors这样的发布者与commentsusers的两种通用实现的安全性含义。后者表明任何人都可以请求一个没有上下文的用户文档数组。

服务器连接可以占用CPU和内存

仔细查看您正在考虑用于服务器端连接的库的实现。其中一些使用observe,它要求依赖链中的每个完整文档都保存在内存中。其他的只在observeChanges上实现,这更有效,但使包在它们能做的事情上不那么灵活。

查找观察者重用

你的目标之一应该是重用你的观察者。换句话说,假设您将有S个并发订阅,那么您最终只会做~(S-I)个工作,其中I是跨客户机的相同观察者的数量。根据订阅的性质,您可以通过更细粒度的订阅看到更好的观察者重用,但这是非常特定于应用程序的。

注意延迟

服务器端连接的一大优点是它们可以一次有效地交付所有文档。将其与客户机连接进行比较,客户机连接必须等待每一组父文档到达,然后才能激活子订阅。在将初始文档集交付给客户端之前,N级客户端连接将进行N次往返。

结论

在决定为每个出版物使用哪种技术时,您需要考虑上述所有因素。现实情况是,在像kadira这样的平台上测试一款实时应用是得出结论性答案的唯一方法。