我知道许多第三方流媒体组件提供商(Kaazing,Lightstreamer,WebSync),但是,我想知道使用第三方提供商的一般优势是什么,而不是本土提供商。
我正在考虑的场景是用户拥有大约100个实体的Web显示,其中属性以每秒最多3次更新的速率更新。我可以创建一个相对简单的JavaScript组件,每秒轮询服务器3次,根据收到的结果动态更新HTML UI。有了这个相对简单的场景,使用第三方库会有什么显着的好处吗?
答案 0 :(得分:4)
@ColinE:你在获得更多答案时遇到问题的原因是你有一些问题。我想你至少有两个问题:
1。)"为什么要购买第三方编程组件?" (广泛而模糊的问题)和
2.)"鉴于我的具体用例,我应该购买第三方实时消息组件吗?" (特定于您的条件而不是一般知识)
我会对它采取一些措施,试图平衡每个可能阅读此内容并从而解决您的特定用例的每个人的广泛知识。我为发布Comet / Bayeux的WebSync实现的公司工作,所以我对这些东西有很多经验。为了平等起见,我会在我的术语中尝试非常不可知,但我可以假设我列出的实时消息的功能/优点是基于我对WebSync的丰富经验。我不太了解Java和Apache的实现。
对于几乎所有第三方编程组件,网上某处都有一个开源替代方案。虽然很难对第三方组件与开源应用一个通用的评估,但我会说我的经验是开源的东西(例如:CodeProject文章)往往寿命很短而没有长期支持。这些开源式实现通常由一个人试图避免付费组件的成本来解决一个特定用例而构建。出于这个原因,他们通常只为他们的应用程序实现最重要的功能。
当您购买第三方组件时,您很少购买基本想法。您正在购买:
所以购买决定是这样的:实现我自己的彗星实施需要多少小时?在我的收费率下,那个时间的价值是多少?这个金额是否低于第三方组件的价格?
当然,您必须考虑风险和未来:我自己的实施对未来项目的重用性如何?如果项目范围扩大,我会承担哪些风险?如果范围发生变化,我预算的时间限额可以增加一倍还是三倍?我可以花多少时间进行性能调优以实现可扩展性或测试负载平衡系统?什么是我的老板/客户广告是我们项目的另一个平台?
通常,如果您正在开展的项目是营利性专业项目,那么您节省的时间和第三方组件提供的支持将远远超过为其支付的价格。如果您的项目是一个非营利,开源,社交初创企业,您可能更愿意更紧密地拿着您的口袋书,并鼓励一些社区支持来填补空白。
您的问题也避免了固定间隔ajax轮询作为彗星的替代方案。我想澄清一些差异,以帮助做出最终决定。
<强>解释强>
该行业的一个问题是人们对Comet,Bayeux和Streaming感到困惑。 Comet最初专门提到长轮询,现在已成为通过普通HTTP(协议不可知)实时消息传递的一个通用术语。 Bayeux是一个规范,用于说明数据应该如何通过电线&#34; (协议)。流媒体是通过互联网实时发送内容的想法。人们经常互换地使用它们,这意味着一个系统具有所有三个特征/能力。一些&#34;彗星&#34;像系统一样,不要使用行业标准&#34; bayeux protocol&#34;。它们不是同一个,但你会发现&#34; bayeux&#34;得到了许多大型行业参与者的支持,并指明了我们与服务器进行交流的方式。 Bayeux也是使行业标准实施在一起很好的原因(一件好事)。我可能自己甚至将这些术语混合了一下,但至少现在你知道我在谈论&#34; Bayeux&#34;时所说的话。
通过线路复制数据与初始状态+差异更新
使用固定间隔轮询机制,您可以准确地获得固定间隔的声音。对于Bayeux,我们的想法是避免通过线路重复数据。如果数据没有变化,为什么要再次发送?这可以节省您的服务器上的带宽成本和处理开销。这两个非常实际的财务成本都会影响您的决策。另一方面,如果数据确实每秒改变3次,那么彗星将为你提供这个数据没有问题。
更进一步,Bayeux允许&#34; 初始状态+差异更新&#34;的概念。这意味着当您的javascript客户端启动时,您订阅了一个为您的100个实体(可能是一个繁重的数据对象)返回初始状态的通道,然后Comet机制继续提供增量差异更新。示例:实体1刚被删除,实体7刚刚被编辑,我们只是在列表中插入了另一个实体,等等......这些是对初始状态的差异更新。你永远不会发送完整的100个实体集合(除非所有100个实体在过去的1/3秒内确实发生了变化)。
如果您丢失连接(Wi-Fi丢失),客户端将重新订阅并重新开始新的初始状态,然后继续进行差异更新。这可以确保您永远不会错过&#34;更新。如果您尝试使用简单的Ajax轮询进行此操作,则可能会复制数据(吃掉带宽)或冒险&#34;丢失&#34;差异更新(不可靠)。
通过这种安排,您可以在性能,带宽使用和开销方面与ajax长轮询机制相同或更好。在大多数情况下,使用带宽会更好。
Bayeux批处理
Bayeux提供了一个&#34;频道系统&#34;分割传递给客户的数据。例如,如果你做了一个AJAX轮询,你最终会得到一个需要解析的大数据块(并生成服务器端)。使用频道系统,您可以发布到&#34; / entityA&#34;,&#34; / entityB&#34;等频道。甚至多级渠道,如&#34; / entityA / fooMessages&#34;和&#34; / entityA / barMessages&#34;。彗星服务器将所有已发布的消息批量下载到客户端,客户端可以将消息分发给每个数据段(每个通道)的相应javascript处理程序。
服务器端支持
虽然并非所有Comet / Bayeux实现都可用,但我知道WebSync具有出色的服务器端事件处理机制,可以让您进行审计&#34;所有进出服务器的邮件。在这些服务器端事件中,您可以加载新数据,转换现有数据,记录诊断信息,评估身份验证状态,调用第三方跨域API等。这里有很多功能来准备/处理您想要的数据分发给您的客户。
好的,现在我们有一个广泛的框架来评估开源或购买商业实施的选择。所以让我们逐步介绍你在问题中给我的参数。
每个客户端需要100个实体,每秒更新3次。因此,为每个客户端飞来飞去300个单独的JSON对象/消息。这是需要推动的大量数据。我说你可以采取的任何措施来减少线路上的重复数据,这将使你受益匪浅,因此我建议使用具有初始状态+差异更新的彗星实现。加上如此多的实体被跟踪,通过渠道进行数据分割将真正帮助您完成编码并节省您的时间。
选项:使用AJAX每秒轮询服务器3次。
优点:
缺点:
选项:购买feature-rich comet implementation。
优点:
缺点:
答案 1 :(得分:1)
在你的情况下,我说你的选择取决于你,我个人更喜欢使用我自己的库来进行此项使用。但这里是第三方与家庭的利弊:
第三方图书馆的优点:
第三方图书馆的缺点:
所以这是我对这种困境的看法,我希望它对你有用。