最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

Meteor 为增强扩展性弃用轮询和差异机制

  • 2014-02-25
  • 本文字数:1637 字

    阅读完需:约 5 分钟

一直活跃在 Meteor 社区的 Tom Coleman 最近发表了一篇文章:扩展Meteor:实时程序的挑战,介绍了Meteor 为增强扩展性而在实时处理机制上作出的调整。

Oplog tailing

自 2012 年 Meteor 问世以来,人们就在询问它的扩展性如何。虽然 Meteor 的实时处理特性很吸引人,但人们也很关心它的处理能力,关心它能否驾驭得了更多资源。Tom Coleman 在他的这篇文章中介绍了传统的、单页的和实时的三种不同的 web 程序模型,并指出三种模型实现扩展性时所面临的问题也是不同的;阐述了轮询和差异机制的处理特点及不足;接着又讲解了 Meteor 采用的新机制:Oplog tailing,以及这种机制的源起和优势;最后又给出了一些增强程序扩展性的策略性建议。同时他也提醒说:“… Meteor 的扩展性领域仍处于快速变化的状态下,所以在这个主题上很难做到盖棺定论 ”。

最后,在一个实时的单页程序中 (比如 Meteor 程序),客户端不仅能请求更多数据,服务器还可以把数据推送给客户端 (比如当数据库中的数据发生变化时)。
这引发了一些有趣的问题:服务器怎么知道数据什么时候发生了变化?还有,服务器怎么知道该把那些变化发送给哪个用户?这些问题是掌握实时程序性能特点的关键。

Meteor 最开始用轮询及差异的机制监测数据库的变化,虽然这一机制很快就会被 Oplog tailing 取代,但我们还是很有必要了解它。

Meteor 会为每个订阅了结果集的用户建立一个LiveResultsSet(LRS),并由它负责轮询数据库。得到数据库的查询结果后,并不会把全部内容都送回客户端,而是要通过比较找出新结果和之前结果的差异。但这种比较通常是非常昂贵的计算,所以经常是 CPU 先成为 Meteor 程序的性能瓶颈。导致同时有很多差异计算发生的原因主要有两个:

  1. 有很多不同的 LRS。尽管 Meteor 会尽最大努力在用户间共享 LRS,但有时做不到这一点。
  2. 数据库的写入操作很多,这反过来又会导致更多的轮询。

Meteor 0.7.0 中使用了新的Oplog tailing机制监测数据库,这一机制是基于 MongoDB 的 Oplog 实现的,Oplog 是 Mongo 用来同步副本集的。但它只能告诉 Meteor 集合层面的变化,所以 Meteor 还要做大量工作来确定查询层面的变化,并确定这些变化是否应该发给订阅了查询的客户端。

尽管 Oplog tailing 技术比粗陋的轮询和差异算法效率高得多,但要实现实时仍然会有很高的 CPU 负载。

所以尽管 Oplog tailing 真的带来了改善,但我们依然要铭记,它跟你对你的发布 / 预订策略的正确思考是分不开的。此外,即便你启用了 Oplog tailing,现在也只有一部分查询适用此项技术。

数据推送方式

除了介绍监测数据变化的机制,Tom Coleman 还讲解了 Meteor 如何确定该将数据变化发送给哪些用户。

这意味着要为每个已连接客户端维持一个“内存数据库”(在 Meteor 中,即 Minimongo 中的内容)。Meteor 中包含这个的数据结构是 Merge Box
这样的直接影响是每个已连接客户端都要在服务器上占用一部分内存。并且你向客户端发布的数据越多,服务器上追踪它们所用的内存越多。

文章还给出了几个增强程序扩展能力的策略:

  • 尽量将用户独有的预订数量降到最低,让 Meteor 可以最大限度地跨用户汇集工作。
  • 使用更简单的查询,因为这通常意味着 Meteor 在决定变化是否会影响到它时所做的工作更少。
  • 限制数据库的写操作(特别是那些被重度观察的集合),这样 Meteor 做有限的工作就可以保证这些观察可以及时更新。

文章最后还给出了几个监测工具,比如监测每个集合上打开 LRS 状态的 Server Info ,收集打开的观察器相关数据的 Facts 包,性能监测服务 MeteorAPM ,测试程序扩展能力的 Load Test

在最终的结论部分,Tom Coleman 说:

就像我们看到的,实时程序之所以比传统的 web 程序对服务器有更高要求,是有些根本原因的。希望本文能帮你理解各种起作用的因素,让你在扩展 Meteor 程序时更容易一点儿。


感谢水羽哲对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-02-25 02:181516
用户头像

发布了 45 篇内容, 共 24.4 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

2022云原生峰会开启报名 | 一年一度云原生技术风向标就看这里!

阿里巴巴云原生

阿里云 云原生峰会

【DS】二叉树大总结!

安苒

数据结构 二叉树

【Java SE】Java程序的运行详解

安苒

Java

华为云对象存储OBS,安全可靠的云存储服务,让企业轻松上云

科技之光

Spring Boot「16」自定义错误页面

Samson

Java spring 学习笔记 spring-boot 10月月更

精细化边缘安全防护:如何防止CDN域名被恶意刷量?

阿里云视频云

CDN 边缘安全

NFTScan 与 Cobo 达成合作,双方将共同推动 NFT 资管安全市场的发展

NFT Research

区块链 NFT 数据基础设施

华为云CDN加速服务,如何让你的网速“飞”起来!

秃头也爱科技

华为云数据灾备全场景应用方案,为企业数据安全护航

爱尚科技

华为云大数据BI,便捷高效的大数据解决方案,助力企业数字化运营

爱科技的水月

聚焦云计算、大数据、人工智能等开源技术,这场开源开发者的盛会不容错过!

OpenAnolis小助手

人工智能 云计算 大数据 COSCon'22 开源盛会

全嘉宾阵容官宣 | 2022 云原生峰会即将启动,实战派企业向你发出邀请

阿里巴巴云原生

阿里云 云原生 峰会

华为云CDN加速,如何助力企业信息化转型?

秃头也爱科技

css学习

codingyt

CSS 10月月更

Java Stream中map、flatMap 的使用区别

zarmnosaj

10月月更

“程”风破浪的开发者|总结巧用CSS实现各种效果的「百计千谋」

叶一一

CSS 学习方法 前端 “程”风破浪的开发者

华为云CDN为什么成为企业首选?四大优势助力企业腾飞!

秃头也爱科技

华为云帮助企业做好核心数据灾备,为企业数据安全与稳定发展提供保障

爱尚科技

前端监控系列4 | SDK 体积与性能优化实践

字节跳动终端技术

性能优化 前端监控 sdk 体积优化

03 详细架构设计

神奇的叶叔叔

华为云CDN加速,如何为中小企业创新发展效力?

秃头也爱科技

华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单

爱科技的水月

微信小程序部署流程

codingyt

10月月更

【Java SE】java中变量和表达式计算的相关问题

安苒

Java

flex容器布局

codingyt

CSS Flex 10月月更

“程”风破浪的开发者 | 元宇宙就是“虚晃一枪”?

三掌柜

1024 1024程序员节 元宇宙 “程”风破浪的开发者

华为云对象存储OBS,为不同企业提供云存储方案,助力企业更好经营

科技之光

10-6-华为云OBS大数据存算分离方案,助力企业顺利实现数字化转型!

科技之光

JavaScript刷LeetCode拿offer-栈相关题目

js2030code

JavaScript LeetCode

Spring Boot「15」统一异常处理

Samson

Java spring 学习笔记 spring-boot 10月月更

Wallys/DR7915-wifi6-MT7915-MT7975-2T2R-support-OpenWRT-802.11AX-supporting-MiniPCIe-Module//QCA9882/QCA9880

wallys-wifi6

QCA9882 MT7915

Meteor为增强扩展性弃用轮询和差异机制_语言 & 开发_吴海星_InfoQ精选文章