微信号:infoqchina

介绍:有内容的技术社区媒体

Q新闻丨微软开源新一代浏览器的JavaScript引擎核心代码;使用Akka来优化Spark……

2015-12-20 08:12 InfoQ
1
微软开源新一代浏览器的JavaScript引擎核心代码


近日,微软宣布开源Chakra的核心组件。Chakra是微软新一代浏览器Microsoft Edge的JavaScript引擎。相关代码将于2016年1月上传到微软的GitHub账号,项目名称为ChakraCore,遵循MIT许可协议。


Chakra是微软2008年新创建的一个JavaScript引擎,其基本构建原则是要具备现代Web应用所需要的性能特性,并能非常容易地应用于各种不断出现的场景。也就是说,Chakra需要能够快速启动和运行,提供卓越的用户体验,并充分发挥底层硬件的潜能。下面是Chakra的基本架构:

为了实现上述目标,Chakra采用一种独特的多层管道架构,包含一个解释器、一个多层架构的后台JIT编译器和一个可以并发和局部回收的标记-清除垃圾收集器。


自Chakra创建以来,JavaScript已经从一种主要用于Web浏览器的语言,成长为一种支持商店应用、服务器端应用、云服务、NoSQL数据库、游戏引擎、前端工具和IoT的语言。期间,微软一直在不断改进和优化Chakra,使它不仅可以很好地适应这些场景,而且还能在所有这些场景中提供卓越的体验。这意味着,除了吞吐能力外,Chakra还必须具备本地互操作性、良好的扩展性和在有限资源环境中执行代码时限制资源占用的能力。Chakra的解释器在可移植性方面发挥了重要作用。


现在,在Microsoft Edge浏览器之外,Chakra还应用于通用Windows应用、Azure DocumentDB、Cortana、Outlook.com及TypeScript(做过专门优化)。微软还使Node.js可以使用Windows 10上的Chakra,从而使开发人员可以在新IoT平台Windows 10 IoT Core上使用Node.js。


随着Windows 10的发布,Chakra不仅在Microsoft Edge中提供了更好的JavaScript性能,而且在其他浏览器提供商所拥有的基准测试中,性能也有大幅提升,如下图所示:


此外,Chakra还支持大部分ECMAScript 2015(即ES6)特性,并支持部分ECMAScript提案特性,如Async Functions和SIMD。它还支持asm.js,其团队在WebAssembly及其相关基础设施的发展中发挥了重要作用。


ChakraCore是一个全功能、自包含的JavaScript虚拟机,可以嵌入衍生产品及用于诸如NoSQL数据库、生产力软件、游戏引擎这类需要脚本语言的应用程序。如下图所示,与Chakra相比,ChakraCore主要有两点不同:一是未将私有绑定暴露给浏览器和通用Windows平台;二是用一组新的现代化诊断API取代了基于COM的诊断API。


虽然将在1月份发布的ChakraCore版本仅限于Windows,但微软承诺会将其带到其他平台。感兴趣的读者可以继续关注,在1月份正式发布的时候,微软会提供更多细节。


2
使用Akka来优化Spark+ElasticSearch的准实时系统


假如有这样一个场景:系统每秒钟都会收到大量的事件,每个事件又包含很多参数,用户不仅需要准实时地还需要定期地判断每一种事件、事件的每一种参数值的组合是否超过了系统设定的阈值。面对这一场景,用户应该采用什么样的方案呢?最近,来自于Premium Minds的软件架构师André Camilo在博客上发表了一篇文章,介绍了他们是如何使用Akka解决这一棘手问题的。


在该文章中André Camilo首先介绍了他们的应用场景:


我们的系统每秒钟最多会收到几百个事件,有些事件有8个参数,有些事件有超过240,000个参数值的组合(*假如有一个PhoneCall(phoneNumber, countryCode, geoZone)事件,该事件有三个参数,其中phoneNumber有4,000 个值, countryCode有5个值,geoZone有10个值,那么可能的参数值组合约为(4000+1)(5+1)(10+1)=240k个*),我们不仅需要实时地判断这些事件以及参数值的组合是否超过了系统设定的阀值,还要保留最近30分钟的数据,以便于判断在这段时间内它们出现的频率是否也超过了阀值。


处理该问题最简单的方式或许就是将这些数据都存起来,然后每隔一秒钟就去计算每一种组合出现的频率,但是事实上这是无法实现的,因为这样每秒钟会有超过240,000个查询,系统是无法承受的。André Camilo 给出的第一种方案是使用Spark和ElasticSearch:


我们创建了一个Spark Streaming的数据流管道,该管道首先从JMS队列中读取消息并将其转换成PhoneCall事件,然后根据事件的参数值将一个事件分离成多个事件,之后再使用countByWindow函数计算每一种事件组合的频率,最后检查每种组合的平均频率是否超过了阈值。在使用countByWindow计算时,每秒钟都会设置一个30分钟的窗口,同时函数输出值会除以1800秒以得到每个窗口的平均频率,最终结果使用ElasticSearch集群存储。


该方案的流程如下:


这一方案虽然可行,但是并没有解决André Camilo的问题,不是因为Spark不行,而是因为虽然Spark Streaming能够处理大量的实时数据,但是却无法处理大量的窗口。在André Camilo的实验中,如果组合数低于1000,那么这种方案能够工作的很好,但是如果超出了这一数量,那么就会导致内存溢出问题。


André Camilo给出的第二种方案是使用Akka:

  • 对每一种参数值的组合创建一个组合Actor

  • 创建一个负责接收所有事件的Actor,该Actor根据事件的参数值将一个事件分离成多个事件,并根据参数组合的对应关系将分离后的事件发送到步骤1创建的组合Actor

  • 每一个组合Actor通过环形缓冲区存储最近30分钟的事件数(单位为秒),每过一秒,该缓冲区就滚动一个位置,同时该Actor会计算事件的频率,检查该频率是否超过了系统设定的阈值,并将结果发送到ElasticSearch Actor

  • ElasticSearch Actor仅仅是一个ActorPublisher,负责将数据发送到ElasticSearch流驱动


第二种方案的流程如下:



环形缓冲区的结构如下:



你可能会问,为每一种组合创建一个Actor会不会导致Actor太多?André Camilo告诉我们,对Akka这个超轻量级的事件驱动框架来说这都不是问题。使用该方案André Camilo在一个i7 4GB的笔记本上轻松解决了800个事件的分离处理。更为重要的是,Akka支持水平扩展,如果系统有更多的参数值组合,或者需要更大的吞吐量,那么只需要增加更多的机器即可。


最后,André Camilo的结论是:Spark有非常好的特性,它的解决方案更简单、更直观,但不太适合这个场景。Akka非常适合处理CPU敏感的问题,Actor模型更适合处理高并发的问题。


3
从Twitter留言预测用户收入


利用社交媒体上发表的内容来自动推断用户特征,对于社会科学、市场学和政治学研究有着非常重要的意义。近日,宾夕法尼亚大学的Daniel Preoţiuc-Pietro等人就利用Twitter上的数据构建了预测用户收入的模型。该模型很好的揭露了不同特征分类和收入之间的关系,同时也发现了很多有意思的现象。


随着信息技术的迅速发展,社交媒体也开始为越来越多的人提供服务。社交网站中所接收的用户数据也随之飞速增长,为社会科学中复杂问题的研究提供了充分支撑。对这些数据的分析可以很好的披露出语言模式和用户特征(如位置、年纪以及政治倾向等)。由此,这些信息可以用于大规模社会科学研究,并可帮助进行更有针对性的广告营销等。


Daniel等人的研究以自动推导社交媒体中用户的收入为出发点。在训练和测试阶段,该团队使用了已经表明收入的Twitter用户数据集,其中包括了Twitter平台的相关统计数据和历史内容。为了便于分析,Daniel等人的研究以Twitter用户和职位之间的映射为基础,采用了英国政府的标准化职业分类(Standard Occupational Classification,SOC)方法,将所有职业根据职能要求和内容分成了9个大组。最终的测试数据就牵涉到了9个组的5191个用户,及其10,796,836条留言。


预测模型使用了很多特征作为参考,包括了简单的用户简历特征(如朋友数量、追随者数量以及平均每天留言的数量等)、人口统计特征(如年纪、性别、政治倾向以及智力等)、用户情绪特征(开心的、伤心的、生气的以及惊讶的留言的比例等)和浅层的文本特征(非复制留言的比例、转发留言的比例以及平均的留言数量等)。


而且,他们采用了线性和非线性学习算法来构建收入模型。其线性学习算法使用的是带Elastic Net调节logistic回归分析。第一个非线性学习算法则使用带径向基核函数(Radial Basis Function ,RBF)的支持向量机(Support Vector Machine,SVM)。但由于SVM并不支持指定最重要的若干特征,Daniel等人又采用高斯过程(Gaussian Process)构建了一个贝叶斯非参数化的统计框架。最后,预测模型把所有特征集模型的结果采用线性权重的方式结合在了一起。


为了测量预测模型的精确度,Daniel等人的研究首先针对用户收入进行了评估,其试验过程采用了十折交叉验证:把原始的数据随机分成10个部分,选择其中一个作为测试数据,一个作为参数微调的数据,剩下的8个作为训练数据。最终结果表明,用户数据和用户发表的内容之间的皮尔逊相关系数最大可达到0.633(0.6-0.8表示“强相关”),证实了模型的精确性。


该工作的另外一个目标是深入发掘Twitter上与用户收入相关的特征。通过检查模型的输出和对参数进行量化分析,团队发掘出了收入和语言使用以及Twitter中用户行为之间的关系,其中包括了很多已知和未知的现象。


例如,已经为公众所接受和熟知的现象是:收入和受教育程度、智力、年龄以及性别等相关。另外的一些发现就显得特别有意思:无派别且生活从容的用户收入较高;收入越高的用户越容易产生生气和惧怕的情绪,从而经常发表一些感性的内容;高收入用户更多地谈论政治,非政府组织以及合作的话题,而低收入者则更多地倾向于使用低俗语言。


  • 更多干货内容,敬请关注InfoQ[id:infoqchina]微信公众号


荐文



 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 没有谁瞧不起谁 为什么每个程序员都应该懂点前端知识 HTML 5 Canvas 创始人不懂技术怎么管开发者? 做不了“极客”,我们还可以好好“阅读”【2015基础研究】