Callback / Event

Callback 在 JS 中无处不在,Ajax,XMLHttpRequest 等很多前端技术都围绕回调展开,比如创建一个 Button: <button onclick="myFunction()">Click me</button>。回调的优点是简单易于理解和实现,缺点一是调层数过深时,代码会变得非常难维护(所谓回调地狱,Callback Hell),二是任务和回调之间紧耦合,并且只能指定一个回调函数。

阅读全文 »

Go的package和goroutine,前者组织Go程序的静态结构,后者形成Go程序的动态结构,这里谈谈对这两者的一些理解和实践。

一. package 管理

1. package 布局

分包的目的是划分系统,将系统划分为一个个更小的模块,更易于理解,测试和维护。如何组织Go项目的包结构,是大多数Go程序员都遇到过的问题,各个开源项目的实践可能也并不相同。以下是几种常见分包方案。

单一Package

适用于小型应用程序,无需考虑循环依赖等问题。但在Go中,同一个Package下的类和变量是没有隐私可言的,C++/Java可以在同一个文件中通过Class实现访问控制,但是Go不可以。因此随着项目代码规模增长(超过10K SLOC,代码维护和隔离将变得非常困难。

阅读全文 »

如果给你一个服务器框架,你如何评估这个框架?不同的人可能有不同的维度和优先级,比如性能,可维护性,可扩展性,可用性,可靠性等等等等,目前已经有相对成熟的几种软件质量评估方案。其中McCall软件评估模型(1977)比较有意思:

产品修正: 开发视角,反映系统应对变更的能力
产品运行: 用户视角,产品稳定性,效率,易用性等
产品转移: 运维视角,可移植性,组件复用性等

阅读全文 »

现在的游戏服务器通常使用NoSQL作为DB以满足Model设计上的灵活性,特别是即将到来的MongoDB 4.0将提供多文档事务支持,这意味着,SQL转向NoSQL的最后障碍已经被消除。

理想的MongoDB使用场景是将单个对象映射为单个文档,比如玩家数据,公会数据等,但一方面MongoDB对单文档大小硬限制为16M,另一方面,我们需要根据对象更新频度,固有特性等进一步优化,提高DB性能。这里简单谈谈那些GS对象落地的方方面面。

阅读全文 »

Hash算法

Hash算法本质是将一个值域(也称定义域,通常更大)映射到另一个值域(通常更小),比如SHA-2,MD5等。Hash算法有一些共有特性,比如确定性,不可逆性。Hash算法被广泛应用于加密,Hash表,文件校验等领域。

分布式系统中常用Hash算法来进行任务分配,比如我们要设计一个分布式存储系统,通过Hash算法能够有序均匀地将N个任务分配到M个节点(Hash槽)上:

阅读全文 »

React实际上只是View层的一套解决方案,它将View层组件化,并约定组件如何交互,数据如何在组件内流通等,但实际的Web App除了View层外,还包括Model层,界面响应,服务器请求等,Flux则是Facebook为此给出一套非常简洁的方案,用于管理Web应用程序数据流。与其说Flux是一套框架,不如说其是一套设计模式,因为其核心代码只有几百行,它主要表述的是一种Web应用设计理念和模式。

阅读全文 »

预备知识

ES6: Javascript 的新标准,主要包括引入class,箭头函数,let, const 新关键字等。

JSX: JSX 是JavaScript 语法扩展,让在 js 中写HTML像模板语言一样方便,最终会编译为js。

React 特性

1. 组件

React的核心思想便是将UI切分成一些的独立的、可复用的组件,这样你就只需专注于构建每一个单独的部件,达到非常灵活的组件级别的解耦和复用。

阅读全文 »

源自于我做的一次公司内部的技术分享,这是初稿。 PPT 就不贴了。

一. 序章: 可计算模型

1936 阿隆佐·邱奇发表可计算函数的第一份精确定义,即Lambda演算(λ演算)。λ演算是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义、函数如何被应用以及递归的形式系统。
1936 艾伦·图灵提出图灵机设想,通过TAPE,HEAD,TABLE,STATE四个部分模拟人的纸笔运算
1945 冯·诺伊曼提出冯·诺伊曼结构(存储程序型电脑),是通用图灵机实现
1958 约翰·麦卡锡,发明了一种列表处理语言(Lisp),这种语言是一种阿隆佐lambda演算在现实世界的实现,而且它能在冯·诺伊曼计算机上运行

图灵机设想和 Lamdba 演算都是一种抽象计算模型,是解决可计算问题的一种方案,通俗来讲,就是将计算以数学的方式抽象化,以便证明和推导。图灵机和 Lamdba 演算这两个可计算理论已经被证明是等价的。

阅读全文 »

一. pprof 数据采样

pprof 采样数据主要有三种获取方式:

  • runtime/pprof: 手动调用runtime.StartCPUProfile或者runtime.StopCPUProfile等 API来生成和写入采样文件,灵活性高
  • net/http/pprof: 通过 http 服务获取Profile采样文件,简单易用,适用于对应用程序的整体监控。通过 runtime/pprof 实现
  • go test: 通过 go test -bench . -cpuprofile prof.cpu生成采样文件 适用对函数进行针对性测试
阅读全文 »

一. 容器资源限制

Docker资源限制主要靠Linux cgroups技术实现,简单说,cgroups是一个个的进程组(实际上是进程树),这些进程树通过挂接 subsystem(事实上是挂接到 cgroup 上层的hierarchy)来实现对各种资源的限制和追踪,subsystem是内核附加在程序上的一系列钩子(hooks),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。cgroups 技术的具体介绍和实现参考文末链接。

阅读全文 »