ATS真是太复杂了

ATS是一个类似于squid的HTTP代理服务器,大约有30多万行C/C++代码,配置选项有数千个,极为复杂。这是一篇没什么意义的吐槽文。

History

1996年,UC Berkeley的一个教授Eric Brewer和他的学生一起成立了一个公司叫Inktomi。它本来是做搜索引擎的,后来敌不过Google,转而做web server的开发。然后大概在1997、1998年左右,它开发了一个很牛B的HTTP代理服务器,名字大概是叫Inktomi Traffic Server,准备和Cisco的Cache Director竞争,后来也败了。后来2002年,Inktomi被Yahoo以2亿美元收购了,Inktomi的Traffic Server就变成了Yahoo Traffic Server,简称YTS。YTS在Yahoo内部备受重用。根据Yahoo的公开数据,在2009年的时候,YTS已经每天处理170亿次请求,峰值带宽20Gb。在2009年Yahoo把YTS开源,交给Apache软件基金会(Apache Software Foundation,简称ASF)管理,成为该基金会的一个子项目。于是,YTS就被改名为ATS(Apache Traffic Server)。

简单说就是:Inktomi Traffic Server(1998) -> Yahoo Traffic Server(2002) -> Apache Traffic Server(2009)

这中间还有一个小插曲,在2006年的时候,Websense不知道怎么把Inktomi的Traffic Server拿去了,连名字都没改,直接集成到Websense的企业产品中拿出去卖。

还有一个小细节,根据Yahoo的工程师Shih-Yong Wang在COSCUP 2010年会议上的演讲,YTS直到2010年了,都还不支持64位。作为一个cache server,这略微有点悲剧啊。即便在中国国内,那会儿都鲜有内存小于4G的机器上线了。

根据公开资料,现在ATS在Yahoo已经有上万个主机节点,峰值带宽100Gb以上。

功能单一,缺乏竞争力

在我看来,ATS能打败的主力竞争者只有一个:Squid。因为Squid的是一个纯代理服务器,在功能上与ATS有很大重合。

ATS不能Serve静态文件。这导致ATS后面得再挂一个nginx。此时很多人就想了,那么nginx也能做cache,我干嘛还要你ATS?(确实,ATS cache做的稍微更好,但是流量小感受不到啊)

ATS不支持ACL。比如我想限制/admin/下的所有资源只有127.0.0.1能访问,对不起,ATS没有内置这样的功能。

ATS不支持CGI/FastCGI等,所以它不能运行php。

ATS不能直接拿来做load balancer。虽然一个ATS可以对应多个后端,但是我还没找到它检查心跳的功能在哪。它默认内置的balancer插件只支持最基础的hash和round-robin算法。那个插件既不知道后面Origin Server的死活,也不知道Origin Server的负载情况,完全就是一个demo,只有几百行代码。根本没人敢实际用它。但是ATS确实也在Yahoo内部逐渐的替代硬件的load balancer,主要做法是:在外面写个脚本检查心跳,然后更新remap文件,然后reload。

代码维护困难,文档匮乏

Inktomi的那些开发工程师早已不在Yahoo,所以现在的代码中有很多神奇的注释,比如下面这段代码来自于example/protocol/Protocol.c的accept_handler函数

/* This is no reason for not grabbing the lock.
   So skip the routine which handle LockTry failure case. */
TSMutexLockTry(pmutex); // TODO: why should it not check if we got the lock??
TSContCall(txn_sm, 0, NULL);
TSMutexUnlock(pmutex);

估计再过很多年也没有人能明白为什么调用trylock竟然不检查返回值。

再比如官方文档 https://docs.trafficserver.apache.org/en/latest/reference/configuration/records.config.en.html

proxy.config.exec_thread.limit
Scope:CONFIG
Type:INT
Default:2

XXX What does this do?

既然连你自己都不知道这是干嘛的,用户也就更不知道了。

它的状态机太过于复杂,有上百种状态,大状态机里套小状态机,加上没有文档,鲜有人能整明白。但是对于每个写plugin的人来说,首先就得理明白那个状态机,不然自己在哪都不知道。

它的对象池也是一团糟,太复杂了。为了获得更高效的内存分配,它自己搞了一套内存池。所有用过的对象会被放到freelist中。但是这种方式使得C++的构造函数完全被废掉。比如我们这周刚刚发现,某些新new的IOBuffer居然不是empty的。原因在于废弃的对象中某些字段并未被清空,下次再拿到它的人就中招了。

XX功能虽然没有,但是可以有

ATS对系统工程师来说,真不是一个好东西,得自己开发很多插件才能用。但是对于C/C++程序员来说,真的是太棒了。有些功能ATS虽然没有,但是它可以有。比如像ACL,自己写一个remap插件,想要什么功能有什么功能。

而且就算你不喜ATS,它的IO库(IOCore)也很强大哦。你可以直接拿来自己用,写自己的server。C/C++还真没有什么像样的Http Server library,比如最近很火的cpp-netlib,连100 continue都不支持。我会继续在ATS上投入很多精力,学习它,使用它,祝我好运。

此博客中的热门博文

在windows下使用llvm+clang

少写代码,多读别人写的代码

tensorflow distributed runtime初窥