jQuery 源码精粹4 -- defer与promise

引言

JavaScript采用回调函数来处理异步编程,但是用户经常会陷入一种被称作回调金字塔(Pyramid of Doom)的困境,即在回调函数内部嵌套其它回调函数,层层嵌套使得代码清晰性急剧下降。

1
2
3
4
5
6
asyncOperation(function(data){
anotherAsync(function(data2){
yetAnotherAsync(function(){
});
});
});

defer和promise是jQuery实现中,最难也最有趣的部分,它们以优雅的方式实现了JS世界中的异步回调。

1
2
3
4
5
6
7
8
9
promiseSomething()
.then(function(data){
return anotherAsync();
})
.then(function(data2){
return yetAnotherAsync();
})
.then(function(){
});

Read More

jQuery 源码精粹0 -- 引言

缘起

作为世界上被误解最深的编程语言,JavaScript承载了很多并不公平的指责。

相对于它一无是处的远房表兄Java,JavaScript至少在这三处设计得非常优雅:

  • 对象字面量表示法。(以及JSON)
  • 基于原型链的继承模型
  • 匿名函数块

以我对JavaScript粗浅的理解,编写优秀的JavaScript程序,基本是把这三点用到极致,并且避免所有其余JS糟粕的过程。jQuery, 作为应用最广的JavaScript库,是一个很好的学习范例。

本系列博客,旨在和你一起暂时远离html和css的泥沼,徜徉在jQuery源码的沙滩,寻找那些闪光的贝壳。

Read More

spark 中的RDD 和 DAG

Spark 核心

Spark是继Hadoop之后的下一代分布式大数据处理框架,相对于传统的批处理框架Hadoop,Spark通过可存储在内存中的数据集RDD,以及对流式(streaming)处理的支持,可以获得10到100倍的性能提升。相对于仅支持流式处理的Storm框架,Spark提供了对批处理,流处理,交互式查询,机器学习及图形计算等一系列任务的支持,一站式解决各类大数据分析需求。

每个分布式框架需要解决分布式环境中天然的技术难题,比如并行效率,出错恢复和一致性等问题。分布式框架本身需要精巧的设计,但是对使用框架的用户来说,需要实现的客户端代码是比较简单直接的,无非是对数据集合的map, reduce, filter, group, join等一系列操作。

然而要实现高效的Spark应用,需要用户对数据在物理节点上的存取,在网络间的传递,以及任务的执行流程有清晰的理解,RDD和DAG是需要掌握的两个核心概念。

Read More

Akka in Scala Part 6 - Router

引言

Akka是一个自由的世界,actor之间可以互相发送任意类型的消息,但是随着actor数量的增多,如果不加限制地任由actor之间互相通信,很快整个系统将变得复杂且难以管理。

在互联网的世界,将一群节点组成一个内网,不同网络间的通信,需要通过路由器作为中介。路由使消息传递变得有序。

Akka世界中,也有扮演路由器角色的router,通过router可以管理一组routee的创建、通信和销毁。

Read More

Akka in Scala Part 5 - 监护与错误恢复

引言

在分布式系统中,由于集群规模庞大,系统环境复杂,出错是常态,容错是一个非常重要的内容。

传统的异常处理,通常是捕获某种类型的异常并调用相应的异常处理函数,但是在分布式系统中,由于环境的复杂性,通常无法预料错误的类型并进行有效的处理,传统的异常处理方式并不适用。

Akka沿袭了Erlanglet it crash哲学,当actor内部发生异常时,并不试图捕捉异常并处理,而是重建一个新的actor, 使得整个系统在错误发生的时候可以自动恢复。

Read More