Little Cat in Big World

Wandering, Coding and Recording My Life.

Libeio源码浅析

| Comments

libeio是用C开发的高效异步IO库,填补了普通文件没有异步接口的空白。它的作者也是Marc Lehmann,所以它的整体设计风格和libev还是有几分相似的。本文主要记录一下近期对libeio源码分析的心得,作为分析libuv的基础。关于linux下另外一些aio的实现方案,如glibc和kernel native aio,以及libeio背后的一些八卦等,在这篇文章这篇文章都有比较深入的分析,这里就不赘述了。

Libev源码分析 – 常用watcher

| Comments

在上一篇文章里,我们分析了libev整体设计思想和主循环的工作原理,也提到了watcher是衔接开发者代码的主要入口。watcher与开发者最接近,也与具体事件处理逻辑最接近。所以,watcher的具体实现,与性能的关系也相当密切。下面,我们就来分析一下,libev中常用的几种watcher的设计与实现。

Libev源码分析 – 整体设计

| Comments

libev是Marc Lehmann用C写的高性能事件循环库。通过libev,可以灵活地把各种事件组织管理起来,如:时钟、io、信号等。libev在业界内也是广受好评,不少项目都采用它来做底层的事件循环。node.js也是其中之一。 学习和分析libev库,有助于理解node.js底层的工作原理,同时也可以学习和借鉴libev的设计思想。本文是最近在学习libev源码的一些心得总结吧。

从wordpress到octopress

| Comments

前记

兜兜转转,终于还是受不了wordpress的繁杂控制后台和二逼编辑器了,下定决心搬到octopress来了。相比wp,op更加清爽,更容易支配,更符合我的口味吧。比较喜欢op的组织结构,每篇文章都是一个文本文件,支持markdown格式,方便编辑和控制,好过面对冷冰冰的数据库。于是有了这个折腾之旅。

Connect源码分析–基础架构

| Comments

connect是TJ tx给node.js社区贡献的一个热门的web基础框架。TJ的另一力作express框架便是在它基础之上构建的。与express不同,connect更加短小精悍,是一个偏向基础设施的框架。

正如名字所表达的一样,connect框架做的事情很简单,就是把一系列的组件连接到一起,然后让http的请求依次流过这些组件。这些被connect串联起来的组件被称为中间件(middlewire)。在connect中,http请求的处理流程被划分成一个个小片段,每一个小片段代表一项处理任务(如:请求body的解析,session的维护等),由一个中间件负责,前后片段之间靠request,response等对象传递中间数据。connect框架对这些处理细节并不关心,只知道将请求从一个中间件导向下一个中间件。connect的核心代码非常精简,加上注释,也就只有寥寥200来行代码。本文参考的connect版本为2.2.2(这个版本号好像有点特别-_-b)。

Mina工作原理分析

| Comments

Mina是Apache社区维护的一个开源的高性能IO框架,在业界内久经考验,广为使用。Mina与后来兴起的高性能IO新贵Netty一样,都是韩国人Trustin Lee的大作,二者的设计理念是极为相似的。在作为一个强大的开发工具的同时,这两个框架的优雅设计和不俗的表现,有很多地方是值得学习和借鉴的。本文将从Mina工作原理的角度出发,对其结构进行分析。

seq-queue:在node.js中如何保持请求处理顺序的一些想法

| Comments

前段时间项目需要,写了这个小模块https://github.com/changchang/seq-queue,现在拿出来分享一下~

seq-queue主要是满足一些对请求处理顺序有要求的场景。一般在http处理中,对用户连续的请求可以进行并行处理,无须关心请求的处理顺序。但在另外一些场景下则不然。比如:一个游戏服务器处理,对于玩家的一系列操作,如:combo连招,则希望有严格的执行顺序。又如,数据库服务器处理客户端的prepare,execute,close等这些请求,也需要保证请求的执行顺序。seq-queue则是结合了node.js异步回调的环境设计的一个保持请求顺序化处理的模块。

异步环境下的异常处理

| Comments

webgame容器的设计中遇到了一个问题,如何处理回调中未捕获的异常,维护系统状态的完整性。而这个问题的根源来自于node.js的异步回调模式。

先回想一下,熟悉的tomcat容器中是如何处理未捕获的异常的。

tomcat的模型比较简单,每个请求由一个单独的线程来处理,采用的是同步阻塞的模式。当一个请求到达后,请求会通过层层filter,最终到达servlet的service的方法。当请求从servlet的处理返回后,再按原路经过层层filter返回。整个处理的过程,都是在同一个线程,同一次函数调用周期中完成的。也就是说,完全可以在请求处理的入口处,用一个try…catch来捕获处理过程中抛出的所有的未捕获异常,并且在这个入口处,是可以获取到这个请求的上下文的,可以由此来给客户端返回错误的响应。

而在node.js中,采用的是异步回调的模式,处理函数返回,并不代表处理流程完成,可能还有后续的处理逻辑在回调函数中等待触发。而回调函数的触发可能会是在另外一个函数调用周期中,所以在当次请求的入口处包裹try…catch并不总是能捕捉到回调函数中抛出来的异常。但从另一面来看,回调函数最终一定是由node.js中处理任务的主线程来触发的,所以node可以帮我们捕捉到这些异常,反馈到开发者手里也就是我们所熟悉的uncaughtException事件。但在这种情况下,回调函数的执行环境是node的主线程,所以已无法获取到对应的请求上下文,也就无法给客户端反馈出错的信息了。

[转]一个成功的Git分支模型

| Comments

本文中我会展示一种开发模型,一年前该模型就已经被我用在所有的项目中(包括工作中的项目和私有项目),结果是非常成功的。我早就想为此写点东西,可直到现在才有时间。本文不会讲述任何项目的细节,只会涉及到分支策略和发布管理。

node.js的循环依赖

| Comments

循环依赖,简单点来说就是a文件中require b文件,然后b文件中又反过来require a文件。这个问题我们平时可能并不大注意到,但如果处理不好可能会引起一些让人摸不清的问题。在node中,是如何处理循环依赖的问题的呢?