学之者生,用之者死——ACE历史与简评
陈硕 (giantchen_AT_gmail)
Blog.csdn.net/Solstice
2010 March 10
ACE 是现代面向对象网络编程的鼻祖,确立了许多重要模式,如 Reactor、Acceptor 等,重要到我们甚至觉得网络编程就应该是那样的。但为什么 ACE 叫好不叫座?大名鼎鼎却使用者寥寥?本文谈谈我的个人观点。
ACE 是一套重量级的 C++ 网络库,早期版本由 Douglas Schmidt 独自开发,后来有 40 余名学生与工作人员也贡献了大量代码。作者 Douglas Schmidt 凭借它发表了 30 余篇学术论文。ACE 的一大特点是融合了 Douglas Schmidt 提出的很多面向对象网络编程的设计模式,并且具有不可思议的跨平台能力
1 ACE 历史
先说说 ACE 之父 Douglas Schmidt 的个人经历:
- 1990 年在加州大学 Irvine 分校获计算机硕士学位;
- 1994 年在同一学校获计算机博士学位,论文《An Object-Oriented Framework for Experimenting with Alternative Process Architectures for Parallelizing Communication Subsystems》。从论文内容看,主要工作就是后来大名鼎鼎的 ACE framework,文中叫 ASX framework。
- 1994 年博士毕业后前往华盛顿大学任助理教授,后升至副教授
- 2003 年起在 Vanderbilt 大学任正教授至今
我相信 ACE 是 Douglas 在读博期间的主要工作,ACE 这个名字最早出现在 1993 年 12 月的一篇会议论文上,Douglas 的这篇文章获得了“最佳学生论文”奖。在此之前,Douglas 已经用 ASX 等其他名字发表了内容相近的文章。
我能下载到的最早的 ACE 版本是 4.0.32,有大约 86,000 行 C++ 代码,代码的时间戳是 1998 年 10 月 22 日。早期 ACE 由 Douglas Schmidt 个人独立开发,从 ChangeLog 得知,1993 年 11 月 ACE 的版本号是 2.12。到了 1995 年 9 月,才有第一次出现其他开发者。在 1993~1996 年间的 684 次改动中,Douglas 一个人贡献了 529 次,另外几个主要开发者以及他们的修改次数分别是 Prashant Jain (58)、Tim Harrison (42)、David Levine (28)、Irfan Pyarali (20)、Jesper S. M|ller (5)。
从整个 ChangeLog 看,从 1993 年到 2010 年 3 月有 19,000 余次改动。有超过 200 人修改过代码,其中 23 个人的 check-in 次数大于 100,排名前 12 的代码修改者为:
3635 Johnny Willemsen (活跃年份:2001~今)
2586 Douglas C. Schmidt(原作者,活跃年份:1993~今)
1861 Steve Huston (活跃年份:1997~今)
1197 David L. Levine (活跃年份:1996~2000)
962 Nanbor Wang (活跃年份:1998~2003)
907 Ossama Othman (活跃年份:1999~2005)
865 Chad Elliott (活跃年份:2000~今)
823 Bala Natarajan (活跃年份:1999~2004)
708 Carlos O'Ryan (活跃年份:1997~2001)
544 J.T. Conklin (活跃年份:2004~2008)
479 Irfan Pyarali (活跃年份:1996~2003)
368 Darrell Brunsch (活跃年份:1997~2001)
看到这些“活跃年份”,你的第一反应是什么?我想到的是,这些人会不会多半是 Douglas 指导的研究生?我猜他们在读研期间参与改进 ACE,把工作内容写成论文发表,然后毕业走人。或许这能解释 ACE 代码风格的多样性。
在浏览代码历史的过程中,我还发现一个很有意思的现象,在 2008 年 3 月 4 日,某人不小心把整个 ACE 的源代码树删除了:
https://svn.dre.vanderbilt.edu/viewvc/Middleware?view=revision&revision=80824
随后又很快恢复:
https://svn.dre.vanderbilt.edu/viewvc/Middleware?view=revision&revision=80826
干这件事情的老兄在 2005~2009 这几年里一共 check in 了 120 余次。你对这件事情怎么看?你们的开发团队里有这样的人吗?
2 事实与思考
1. 除了 Douglas Schmidt 和 Stephen Huston 写的三本书籍之外,没有其他专著讲 ACE。
究竟是 ACE 太好用了,以至于无需其他书来讲解,还是太难用了,讲也讲不明白?抑或根本就没人在乎?
《C++ 网络编程 第1卷》《C++ 网络编程 第2卷》《ACE 程序员指南》这三本书先后于 2001、2002、2003 年出版,之后再无更新。在同一时期,同样在网络编程领域,尽管 W. Richard Stevens 在 1999 年去世,他的 UNP 和 APUE 仍然由别人续写了新版。讲 C 语言 Sockets API 的书尚且不断更新,上层封装的 C++ 居然无动于衷?真的是封装到位了,屏蔽了这些变化?
UNP 的可操作性很强,读前面几章,就能上手编写简单的网络程序,看完大半本书,网络编程基本就算入门了,能编写一般应用的网络程序。相反,读完 ACE 那几本书,对于简单的网络编程任务还是感觉无从下手,这是因为书写得不好,还是 ACE 本身不好用?
2. ACE 很难用,非常容易用错
我不止听到一个人对我说,他们在项目里尝试过 ACE,不是中途放弃,因为出了问题无法解决;就是勉强交差,并且从下一个项目起坚决不用。我听到的另一个说法是,ACE 教程的例子必须原封不动地抄下来,改一点点就会出漏子。不巧的是,ACE 的例子举来举去就是个 Logging 服务器,让人想照猫画虎也无从下手。在最近的《代码之美》一书中,Douglas Schmidt 再次拿它为例,说明他真的很喜欢这个例子。
用 ACE 编程如履薄冰,生怕在阴沟里翻船,不知道它背后玩了什么把戏。相反,用 10 来个 Sockets 系统调用就能搞定网络编程,我感觉比使用 ACE 难度要小。为什么“高级”工具反而没有低级工具顺手呢?
不好用的直接后果是少有人用,放眼望去,目前涉及网络的 C++ 开源项目里边,鲜有用 ACE 作为通信平台的(我知道的只有 Mangos)。相反,libevent 这个轻量级的 IO multiplexing 库有 memcached 这样的著名用户。
3. ACE 代码质量不高,更像是一个研究项目,而不是工业界的产品
读 ACE 现在的代码,一股学生气扑面而来,感觉像在读实习生写的代码。抛开编码风格不谈,这里举三个“硬伤”:
- sleep < 2ms
在某些早期的 Linux 内核上,如果 select/poll 的等待时间小于 2ms,内核会采用 busy-waiting。这是极大的 CPU 资源浪费,而 ACE 似乎没有考虑避免这一点。
- Linux TCP self-connection
Linux 的 TCP 实现有一个特殊“行为”,在某些特殊情况下会发起自连接。而 Linux 网络协议栈的维护者认为这是一个 feature,不是 bug,拒绝修复。通常网络应用程序不希望出现这种情况,我见过的好的网络库会有意识地检查并断开这种连接,然而 ACE 漠然视之。
- timeval on 64-bit
ACE_Time_Value 类直接以 struct timeval 为成员变量,保存从 Epoch 开始的微秒数。这在 32-bit 下没问题,对象大小是 8 字节。到了 LP64 模式的 64-bit 平台,比如 Linux,对象大小变为 16 字节,这么做就不够好了。我们可以直接用 int64_t 来保存这个以微秒为单位的时间,64-bit 整数能存下上下 30 万年,足够用了。减小对象大小并不是为了节约几个字节的内存,而是方便函数参数传递。在 x86-64 上,这种 8 字节的结构体可以用 64-bit 寄存器直接传参,也就是说 pass by value 会比 pass by reference 更快。对于一般的应用程序而言,要不要这么做值得商榷。对于底层的 C++ 网络库,不加区分地使用 pass by reference 会让人怀疑作者知其然不知其所以然。
对于以上几点情况,我怀疑 ACE 根本没用在 Linux 大规模生产环境下使用过,我只能期望它在别的平台表现好一些了。ACE 的作者们似乎更注重验证新想法,然后发论文,而不是把它放到工业环境中反复锤炼,打造为靠得住的产品。(类似 Minix 与 Linux 的关系。)
4. 移植性很好,支持我知道的和不知道的很多平台
ACE 的意义在于让我们明白了C++代码可以做到可移植,并展示了这么做会付出多么巨大的代价。不细说了,读过 ACE 代码的人都明白。
从代码质量上看,ACE 做到了能在这些平台上运行,但似乎没有在哪个平台占据主导地位。有没有哪个平台的网络编程首选 ACE?
出现这一状况的原因是,跨平台和高性能是矛盾的。跨平台意味着要抽象出多个平台的共性,以最 general 的方式编写上层代码。而高性能则要求充分发挥平台的特性,剑走偏锋,用尽平台能提供的一切加速手段,哪怕与其他平台不兼容。网络编程对此尤为敏感。
我不知道 ACE 的性能如何,因为在各项性能评测榜上基本看不到它的名字(c10k 里就没有 ACE 的身影)。另外,Buffer class 的好坏直接反应了网络库对性能的追求,ACE 提供了比 std::deque<uint8_t> 更好的输入输出 Buffer 吗?(我不是说 deque 有多好,它基本是 fail-safe 的选择而已。)
5. ACE 过于复杂,甚至比它试图封装的对象更复杂。
(这里的代码行数均为 wc 命令的粗略估计。)
ACE 5.7 自身(不含 TAO 和 CIAO)有 30 万行 C++ 代码(Douglas 自己给出的数据是 25 万行,可能指的是略早的版本),这是一个什么概念呢?我们来看 TCP/IP 协议栈本身的实现有多少行:(均不含 IPv6)
- TCPv2 列出的 BSD4.4-Lite 完整 TCP/IP 协议栈代码有 15,000 行,其中 4,500 行 TCP 协议,800 行 UDP 协议,2,500 行 IP 协议
- Linux 1.2.13 完整的 TCP/IP 协议栈有 2 万多行 (net/inet)
- Linux 2.6.32.9 的 TCP/IP 协议栈有 6 万多行 (net/ipv4)
- FreeBSD 8.0 的 TCP/IP 协议栈有 5 万多行 (sys/netinet, 不含 sctp)
换句话说,ACE 用 30 万行 C++ 代码“封装”了不到 10 万行 C 代码(且不论 C++ 代码的信息密度比 C 大),这是不是头重脚轻呢?我理解的“封装”是把复杂的东西变简单,但 ACE 好像走向了另一个方向,把不那么复杂的东西变复杂了。
这个对比数字可能不太准确,因为 ACE 还封装了很多其他东西,请看。http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/inherits.html 和 http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/hierarchy.html
以下两张类的继承关系图片请在新窗口打开:
http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/a06178.png
http://www.dre.vanderbilt.edu/Doxygen/5.7.7/html/ace/a06347.png
Douglas 说 ACE 包含了 40 人年的工作量,对此我毫不怀疑。但是,网络编程真的需要这么复杂吗?TCP/IP 协议栈的实现也没这么多工作量嘛。或许只有 CORBA 这样的应用才会用到这么复杂的东西?那么为什么 ICE 在重新实现 CORBA 的功能时没有基于 ACE 来写呢?是不是因为 ACE 架子拉得大,底子并不牢?
3 ACE 的意义
ACE 对于面向对象、设计模式和网络编程具有重大历史和现实意义。
ACE 诞生之时,正是 90 年代初期面向对象技术的高速发展期,ACE 一定程度上是作为面向对象技术的成功案例来宣传的。
在 1994 年前后,Unix 分为两个阵营,AT&T 的 SVR4 与 BSD 的 BSD4.x,这两家的 IO multiplexing 不完全兼容。比如 SVR4 提供 poll 调用,而 BSD 提供 select 调用。ACE 当时的宣传点之一是用面向对象技术屏蔽了两个平台的差异,提供了统一的 Reactor 接口。
【接下来,poll 在 1996 年 9 月 7 号加入 NetBSD,并随 NetBSD 1.3 于 1998 年 1 月 4 号发布。随后 FreeBSD 3.0 也支持 poll,1998 年 10 月发布。Linux 很早就支持 select,从 2.1.23 内核起支持 poll,发布日期为 1997 年 1 月 26 号。也就是说,到了 1998 年,平台差异被暂时抹平了。随后 epoll、/dev/poll、kqueue 以性能为名,再次扩大了平台差异。当然,Windows 至今不支持 poll。】
ACE 的设计似乎过于强调面向对象的灵活性,一些不该使用虚函数的地方也提供了定制点,比如 ACE_Timer_Queue 就应是个具体类,而不是允许用户 override schedule/cancel/expire 之类的具体操作。面向对象中,“继承”的目的是为了被复用,而不是去复用基类的代码。
查其文献,Reactor 在 1993 年登上《C++ Report》杂志的时候,文章标题还比较朴素,挂着“面向对象”的旗号:
- 《The Reactor: An Object-Oriented Interface for Event-Driven UNIX I/O Multiplexing (Part 1 of 2)》
- 《The Object-Oriented Design and Implementation of the Reactor: A C++ Wrapper for UNIX I/O Multiplexing (Part 2 of 2)》
转眼到了 1994 年,也就是《设计模式》成书的那一年,Douglas 开始写文章言必称 pattern:
- Reactor 变成了 pattern,收录于《Pattern Languages of Program Design》一书(An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events)。这篇文章比前面两篇难懂,如果直接阅读的话。
- Acceptor 是 pattern (A Design Pattern for Passively Initializing Network Services),
- Connector 也是 pattern(A Design Pattern for Actively Initializing Network Services),
- Proactor 还是 pattern(An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events),
- 居然连 Thread-Specific Storage 都成了 pattern(An Object Behavioral Pattern for Accessing per-Thread State Efficiently)。
- 还有 Non-blocking Buffered I/O,也是 pattern (An Object Behavioral Pattern for Communication Gateways)。
似乎 "pattern" 这个字样成了发文章的通行证,这股风气直到 2000 左右才刹住。之后这些论文集结出版,以《Pattern-Oriented Software Architecture》为名出了好几本书,ACE 的内容主要集中在第二卷。(请留意,原来的提法是 Object-Oriented,现在变成了 Pattern-Oriented,似乎软件开发就应该像糖果厂生产绿豆糕,用模子一个个印出来完事。)
ACE 就像一个 pattern 大观园,保守估计有 10 来种 patterns 藏身其中,形成了一套模式语言(《Applying a Pattern Language to Develop Application-level Gateways》),这还不包括 GoF 定义的一般意义下的 OO pattern。
通过 ACE 来学习网络编程,那是本末倒置,因为它教不了你任何 UNP 以外的知识。(Windows 网络编程?)
然而,如果要用面向对象的方式来搞网络编程,那么 ACE 的思想(而不是代码)是值得效仿的,毕竟它饱含了 Douglas Schmidt 等学者的心血与智慧。学得好的例子有 Apache Mina、JBoss Netty、Python Twisted、Perl POE 等等。
这就是我说“学之者生,用之者死”的含义。
4 ACE 文献导读
Douglas Schmidt 写了很多 ACE 的文章,其中不乏内容相近的作品。读他的文章,首选发表在技术杂志上的文章(比如 C++ Report),而不是发表在学术期刊或会议上的论文。前者的写作目的是教会读者技术,后者则往往是展示作者的新思路新想法,技术文章比学术论文要好读得多。
由于当时面向对象技术尚在发展,Douglas 文章里的图形很有特色,不是现在规范的 UML 图(那会儿 UML 还没定型呢),而是像变形虫一样的类图(经pinxue指出,这种图是 Grady Booch 发明的),放在一堆文献里也很容易认出来。
如果要用 ACE 的代码来验证文章的思路,我建议阅读和文章同时期的 4.0 版本代码,代码风格比较统一,代码量也不大,便于理解。
下面介绍几篇有代表性的论文。
- 1993 年 12 月第 11 届 SUG 会议,《The ADAPTIVE Communication Environment: Object-Oriented Network Programming Components for Developing Client/Server Applications》,获得最佳学生论文奖。这是我找到的最早一篇以 ACE 为题的论文。
- 1994 年 6 月第 12 届 SUG 会议,《The ADAPTIVE Communication Environment: An Object-Oriented Network Programming Toolkit for Developing Communication Software》,获得最佳学生论文奖。
以上两篇文章实际上内容基本相同,都是对 ACE 的概要介绍,看第二篇即可,第一次没看懂也没关系。
剩下要看的是一篇 Socket OO 封装、四篇 Reactor、三篇 Acceptor-Connector、一篇 Proactor。这些文章前面大多都给了链接,其余的这里补充一下:
- IPC_SAP: A Family of Object-Oriented Interfaces for Local and Remote Interprocess Communication
- The Design and Use of the ACE Reactor
- Acceptor and Connector -- A Family of Object Creational Patterns for Initializing Communication Services 这篇论文其实可以不用看,因为它不过是把前面两篇发表在 C++ Report 上的文章合到了一起。
不想看这 10 篇论文的话,读中译本《C++ 网络编程 第1卷》《C++ 网络编程 第2卷》《ACE 程序员指南》也行,翻译质量都不错。
5 设想中的 C++ 网络库
与文章主旨无关,略。
我觉得网络库要解决现实的问题,满足现实的需要,而不是把 features/patterns 堆在那里等别人来用。应该先有应用,再提炼出库。而不是先造库,然后寻求应用。
- 上一篇:《多线程服务器的适用场合》例释与答疑
- 下一篇:对 C++ 历史的个人观点
-
132楼
Android 2013-07-23 10:46发表 [回复]
-
写的很好,2003年到处逛书店,终于买到了ace的那两本论文集书,好像是红色封面,薄薄的两本。看了后就记住了那几个模式的名字,印象深的还有大篇幅的写了如何封装POSIX,后来再也没翻过。
自己用ace的体会是学习曲线极其陡峭,对c++的基本功要求非常高。如果一个库不方便使用,就没必要去看了。
-
130楼
wuchaozhens 2013-06-18 23:27发表 [回复]
- 感觉楼主很牛叉的样子,这是褒义
-
128楼
mcrovc_mfc 2013-04-06 22:30发表 [回复]
- 围观一下而已。
-
127楼
toufazhile 2012-11-06 10:41发表 [回复]
- 博主有什么资格评论ACE?哗众取宠的东西
-
125楼
birdsinging 2011-10-23 10:53发表 [回复]
- 本人才疏学浅,不好说。感觉如果另提一个说法:“MFC学之者生,用之者死”,是否有异曲同工之妙呢?
-
124楼
qixinkui2 2011-10-20 15:56发表 [回复]
-
这篇文章里,你说到:
面向对象中,“继承”的目的是为了被复用,而不是去复用基类的代码。
但你之前一篇文章里提到过:
对于继承要特别小心,这条贼船上去就下不来, 除非你是继承 boost::noncopyable
把那个帖子里的问题再问一遍吧:
lanyan 写道
一晃三年过去了.不知道lz现在怎么想的
你给出答复说看这里:
http://blog.csdn.net/Solstice/article/category/793463
但是我感觉这里列出来的反而开始纠结于面向对象的细节了。不知道对于 C+Unix传统的KISS,或者说你以前提到的朴实的C++设计;你现在是怎么看的了?
看过linux之父,孟岩,庄表伟,云风 他们对oo的理性思考之后,我发现的就是你了。能继续谈谈这方面的看法吗?
-
123楼
haisujiang 2011-09-30 11:14发表 [回复]
- 个人认为, 学习ACE需要有底层的知识(操作系统,TCP/IP网络),否则将感到非常的痛苦。
-
121楼
jacklondon 2011-06-10 20:16发表 [回复]
-
我最近两年在
研究 http://mina.apache.org/, 觉得比 ACE 好。
同样是用来写 NIO 服务器端程序,代码很简捷。再说, Java 代码不用考虑内存问题、条件编译问题。
-
119楼
nan1219 2011-04-09 13:52发表 [回复]
- 博主,看样子很鄙视C语言,而且认为自己的C++很牛B,看你们争论就像是很多多人在争论JAVA和C++一样,不知道这样争来争去有什么意义。真正厉害的人是不会纠缠在这上面的。
-
118楼
stidio_zhougang 2011-02-12 15:17发表 [回复]
-
公司的一个监控项目用的ACE,效率奇差,搞得人很蛋疼;前后几个人接手,最后丢在我手上,我搞不定只想重写,但无从下手,最后用了很多奇怪的非正常方法才替换了核心的东西,现在想想都后怕,正式商用项目呀。
其实C++方面的库,还是喜欢小巧的东西。-
Re:
errwrsyssdtw 2012-07-15 19:18发表 [回复]
- 回复stidio_zhougang:
-
117楼
kissnsms 2010-12-06 19:23发表 [回复]
- ACE做一些简单的应用还可以,做复杂的高负载的,就不会适了。非阻塞模型封装得太差劲了,最郁闷的是还要自己去处理BUFFER,真要命。
-
115楼
LeoricKing 2010-11-14 09:59发表 [回复]
- 感谢楼主,感谢各位大牛,我想已经找到自己想要的东东了
-
114楼
linuxboy_007 2010-10-30 01:34发表 [回复]
-
关于博主说ace将一个本不是太复杂的东西搞复杂了,我不敢苟同。相反,我认为是博主看问题的角度有些许偏颇(恕在下直言)。tcp、socket api 这些东西提供的是一些基本的机制或者说比较原始的语义,而ace做的是在将这些机制进行封装从而形成更加高级的语义,ace的使用者应该根据实际需要去利用ace的对下层机制的封装才是正途。
无论如何,这篇文章给我帮助很大,感谢博主!
-
113楼
zy498420 2010-10-13 23:13发表 [回复]
-
这东西是拿来做做
中间件的和原型开发用的。移动广州的人这样给亚信的人说:“你们倒腾代码这么久搞性能什么的,我们多买几台服务器作网关就行了。你们早点搞好我们多赚好几百万了”
想玩原生移植用libevent。改下内核长连接最多我干到2万个,帅吧。
-
112楼
lantianye 2010-09-16 22:49发表 [回复]
-
我很多道理都明白,但就是写不出你这么牛的文章来,差在哪呢?像你前边写的多线程服务器的常用编程模型,里边说的平时真是太常用了,可是我却写不出文章来。
-
Re:
LeoricKing 2010-11-14 10:00发表 [回复]
- 回复 lantianye:因为你抓不住主要矛盾跟次要矛盾啊。学学辩证法吧
-
111楼
lantianye 2010-09-16 22:47发表 [回复]
- 发现你不但是个程序员,还是个作家啊,这文章写的,话说引经据典的那些英文页面你平常也翻看并且做备注留着写文章时提供事实根据?我看过的通常就忘了找不到出处了[e01]
-
110楼
夭夭 2010-09-11 10:56发表 [回复]
- ACE只是学习比较困难,学不好前,全是问题.只要学到了一个阶段,其实都OK了.至于复杂度,ACE其实不仅仅是个网络库,它不是为了10多个socket api再封装设计的,有些比较并不实用. 至于它的性能,稳定性,完全没有问题,个人在上面开发的基于WIN32,LINUX双平台server集群,几百W的量,10Gbps带宽使用,跑的好好的.如果你只是为了一个网络层,而看ACE,是过于复杂了,学习太困难了,如果从整体看,很不错的. 至于文档问题,都是一样的,在C++上,我用到现在只有一个STL,相对通用,别的LIB,都需要看头文件,部分甚至看实现.记住,一个错误的用法,可以把一个高效的库变成低效的.
-
106楼
flyingfly 2010-09-02 12:54发表 [回复]
-
本人自认为有点发言权。我使用ACE多年,据我所知,
用ACE的大公司不在少数,性能没有什么问题,这在我多年的项目中已得到验证,毋庸置疑。
ACE的学习曲线非常陡峭。但是一旦越过,你就站在巨人的肩膀上了。
楼主所评价的ACE的缺点,我个人觉得有点偏颇,你通篇都在抱怨ACE过于复杂, 其实并不是复杂度的问题,是你的角度和起点有点低,建议楼主好好静下心来用一用ACE,特别是用到生产环境中,遇到问题不要先怀疑别人,先想想是不是用对了。
Windows 98的稳定性当年饱受质疑,许多人甚至说裸机不过运行超过一周。其实都是硬件、外围的驱动之类的软件没有做好导致系统不稳定。
最后补一句: 本人参与过ACE开发,位于ACE名人堂之列(hall of fame)
-
105楼
wgm001 2010-08-18 21:41发表 [回复]
-
个人感觉ACE也没什么学习价值,linux下学习下epoll,win下学习下iocp,网络服务器编程基本上也就差不多了。
使用推荐 boost.asio,不像ace那么臃肿,而且ACE的接口十分难看难用,很多还必须看源码才能了解,所以像ACE这样的库不用也罢。
我说要不是ACE出来的早才流行,现在出来的话肯定没什么人去理会。
libevent都要比它好用多了。。。
asio绝对是一流的设计,结合boost可以设计出非常精巧的网络服务器程序,剩下的就可以专注业务处理就行了。
-
103楼
panda77218 2010-07-29 17:11发表 [回复]
- 各种语言有啥本质区别么?无非写的人思路不一样而已,习惯不一样而已
-
102楼
webh 2010-07-10 17:29发表 [回复]
- 5年前花了两个月跟踪ACE源码,基本掌握ACE的几个常用模式,4年前用ACE_TP_Reactor搭建了一个多客户对多服务器的多线程数据交换中心,只用了400~500行程序,感觉很爽,不像楼主说的那样。 不过对于楼主的论述还是表示感谢,很深入,百花齐放。
-
101楼
匿名用户 2010-05-30 12:06发表 [回复]
- 偶现在就在研究和使用ACE,用于我们的项目上, 比如ACE的读写锁,Guard机制,Reactor机制等,我们都在用,项目也运行的很稳定,性能也不错。
-
100楼
im924106179 2010-05-05 12:31发表 [回复]
- 回复同过同过
-
99楼
whutxinriyue 2010-05-04 20:54发表 [回复]
- 呵呵!学习了
-
98楼
tjliupeng 2010-04-30 00:43发表 [回复]
-
我还是挺赞同LZ的一个观点,就是太庞大,为了跨平台,封装了很多东西,可能在某些场合是杀鸡用宰牛刀。
从学习的角度来看,学习ACE的设计思想和模式还是很有帮助的。Douglas C. Schmidt在ACE的发展过程中编著了Pattern oriented software architecture的5卷书,这5本书还是包含了作者的很多观点和思路,可惜偶还没有时间看。
-
97楼
tjliupeng 2010-04-29 18:24发表 [回复]
-
真是公说公有理,婆说婆有理。我们现在也在用ACE,一个服务器通过ACE来
接收上千台设备传输的数据,我当初提议我们这个项目用ACE也只是考虑到跨平台的问题,我们在Windows和Linux Vxworks上都需要用。由于目前只是在开发阶段,能充分感受到的就是跨平台的好处,我们组成员写的代码在我上面所说的几个OS上都跑起来了,性能我们还没有测试,[e08]。
我个人觉得通信服务器如果只在一个平台上跑,而且没有特别的要求的话,最好还是不要用。看过其源代码,还真是复杂,编译条件可选的也非常多。
-
96楼
wufaqiang 2010-04-22 11:49发表 [回复]
- 08年曾经用ACE类库写了一个简单的FTP server当做计算机网络这门课的作业,那时候真是痛苦啊,看了楼主的文章以及各位的评论,感觉自己还真是应该把这个东西重新好好看一下,受教了!
-
91楼
匿名用户 2010-04-04 19:20发表 [回复]
- ace对应用c++来开发是很具有学习价值的。 在hw的多年,时时刻刻都在和ace打交道,它的设计思想、模式、观念都是值得学习。对ace的评论还是在有了一定了解后在做评价为好。
-
90楼
匿名用户 2010-03-26 11:32发表 [回复]
-
ACE技术很好,但风水不好!
用的企业,只要公布的,都基本离死不远,或者入土了。
那些偷偷用的,好像活的的不错,比如HW,TX者流。
结论:楼主学之者生,用之者死,精辟!!!
补充结论:要用开源的东西,还是偷偷的搞,不要到处张扬。
-
89楼
匿名用户 2010-03-26 11:29发表 [回复]
-
Veritas 的网络存储管理软件用的是ACE库,一直搞小型机维护,对编程知道不多,不过用之者死倒是真的,Veritas已经死了。不过这个公司的netbackup软件,集群备份软件,真是不错的软件....
真是可惜了。
-
88楼
lg2theside 2010-03-25 10:11发表 [回复]
-
如果你在一个网络项目中,
独立用c++开发 过 5万 行,再回顾看看ace 吧
简单的api调用是不能满足 复杂 并发 的网络的,如果要稳定 还是需要很多策略来保护的, 呵呵
-
87楼
wuzeng2002 2010-03-24 13:29发表 [回复]
- ACE的确不行 就易用性来说 只有学术价值 没有实用价值
-
84楼
匿名用户 2010-03-22 13:58发表 [回复]
- 其实,ACE并不是一个十分容易使用的"黑盒"库,你在使用它之前,一定要仔细了解它的实现机制,依NP1,NP2的例子照猫画虎那是必死无疑的,ACE的强大在于它提供了 两种网络编程的框架reactor,proactor。把这两个框架的实现机制搞清楚了,使用ACE就会得心应手了。 boost的asio就是仿照proactor搞的,区别只不过是使用模板实现而已。
-
83楼
xiao_zhong_wei_8512 2010-03-22 13:01发表 [回复]
- [e01] 楼主说的有道理啊
-
81楼
匿名用户 2010-03-22 11:40发表 [回复]
-
陈文一开始就说ACE没有用户,(后又有好事者改口说是没有小用户)。真为难人,真是聪明人,让我们写文讨论的过路人,上哪去收集小用户的信息?真要收集到了,估计人家又改口说,ACE没有长得比较帅的用户,所以是用之者死[e08]。====说正事。陈文第1节,谈了《ACE 历史》。这一小节很能看出陈先生考据之用功,当然也很能吸引读者,我也看得津津有味(并且成功地吸引了我往下继续看),不管你有用过或没用过ACE,IT中人总爱看一些这一行的逸事野史。再次感谢陈先生。==== 有句话说是:“历史是什么?历史是一个任人打扮的小姑娘。”,这是指同样一段历史,但讲述的人目的不同,就会把历史各说一套,所谓“六经注我”说的正是这种讨厌的事。但陈先生在此方面显示了一个技术人员应用的品质,他没有为了证明自己的“ACE 学之者生,用之者死” 而有意无意地在描述ACE的某些历史里“加注”某种暗示-----至少我是看不出这段历史能说明用ACE的项目(或软件)会死。
这一段的评论就到此了。再次感觉陈先生挖掘了ACE一些有趣的往事。
-
79楼
匿名用户 2010-03-21 14:23发表 [回复]
-
LZ只看到了其一,它本身就不是一个经过严格测试的工业库
但它其中的设计模式和模板的确在这个世界还找不到匹敌的
ACE其实真的精粹在于提供了一个松散的框架,其组件可以自由替换
-
78楼
匿名用户 2010-03-20 23:33发表 [回复]
- 哈哈,研究生的毕业论文也是折腾这个玩意的,小项目也用来做过一两个。当时国内还比较少人研究ACE,导师让我去给师弟讲讲,讲了一大堆,如何如何好,但到最后还是凭良心自我否定了一下,得出了与楼主差不多的结论。
-
76楼
匿名用户 2010-03-19 15:25发表 [回复]
- CSDN好为人师者众啊。一个事物能够存在并发展这么多年,必定是有其特别之处的。以本人经历来说,工作中有过三次体验。前两次均以失败告终,因为那只是把NP1,NP2的例子按照自己的理解来用,至于它内部的实现机制如何并未深究。之前有位说文件传输效率巨差的我看到那也笑了下,当时确实没办法,只好用socket api重写了事。但庆幸的还好没有放弃对ACE的钻研,第三次使用时也具备了设计模式的知识,基于ACE的项目还是比较成功的。系统运行至今良好,没有出过错,不知道这能不能算为成功?第三次使用时其实很简单,只是把第一、二次实践中写出来的代码删除了三分之二,把剩下的三分之一重新排列组合了一下而已。但我不知道我的情形是要归之于学之还是用之呢。我还是希望第一次尝试就放弃的同仁们能再坚持一下吧。
-
75楼
匿名用户 2010-03-19 10:54发表 [回复]
-
不知道楼主用ACE写过多少大型的(特别是跨平台下的)项目,
没有深刻的经验体会就别只关注事物的缺点。任何东西,只有深入了解并实践过、思考过才明白它的原理,不能为表面的东西所蒙盖。这好像又回到了讨论:C&&C++哪个好一样,毫无争辩的意义。
-
74楼
deping_chen 2010-03-19 10:29发表 [回复]
-
第一次听说ACE网络通信库,百度了一下才知道全称。
我一直使用socket和WinInet API的。
[e01]
-
71楼
匿名用户 2010-03-18 18:24发表 [回复]
- [e02]用过3-5年ACE的飘过,对于楼主的牛气,我只能说大哥你太高了,高到我都看不见了,ACE的确有很多不尽如人意的地方,比如学习曲线比较陡峭,代码里面有不尽如人意的地方,但是仅仅因为存在缺点就全盘否定我只能说你也就是个盲人摸象的主,不如楼主来开发出一套取代ACE的网络库吧,不要在这里喷口水了,那将是开发人员的一大幸事
-
70楼
wanshi131 2010-03-18 15:57发表 [回复]
- ACE确实有很多东西值得学习,至少也算是久经考验的。至于是不是“用之者死”,这要看谁用。我就看了一个月,就在我们的服务器上用了ACE,现在运行的很好。
-
68楼
匿名用户 2010-03-18 12:47发表 [回复]
-
为什么有些人都不喜欢c++的模版,虽然刚看始看有点头疼,看多了就会发现模版有着如此优雅的抽象能力。
ace我是没用过,但asio的设计我感觉无人能出其右。-
Re:
wuzeng2002 2010-03-19 12:58发表 [回复]
- 回复 匿名用户:我很喜欢用 特别是让父类提前预知子类的某些属性
-
66楼
匿名用户 2010-03-17 16:21发表 [回复]
-
回复 匿名用户:
很显然你列出的都是写大型公司,不就证明了学之者生,用之者死的道理吗,其他我不敢说,华为和腾讯都有用ACE,但是都是些多年网络编程经验的人修改或者精简了在用,正符合学之者生。-
Re:
匿名用户 2010-03-18 08:01发表 [回复]
-
回复 匿名用户:
通常吧,人们在为自己产品列“成功案例/Success Stories”时,都会尽量列一些大企业,除非这个产品真的就只有小用户。但今天我才知,原来列一些大型公司在使用,居然也就证明了自己这个产品将是“用之者死”。
还好吧,ACE的用户列表上,还有诸如“Big Science ”啊“财务软件”啊,“游戏”啊。。虽然有名的公司还是不少,但无名小卒(或者我辈没听过的外国公司)也不少……有兴趣自己去看看。
=======
小结一点,列出用户清单 ,不过是一件人人可为的小事。本就不为了证明ACE是用之者生还是用之者死。 陈先生文章开篇不久就提出“但为什么 ACE 叫好不叫座?大名鼎鼎却使用者寥寥?本文谈谈我的个人观点。”。可见此雄文的根基在于那个“为什么”,否则他可能 也就没有“本文”,自然也就会不会“谈谈”“个人观点”。
=======
再往后的交流中,有人提到: “ACE在工业界还是得到比较多应用的,特别是外企,而且作为底层中间件用了很多年也比较稳定,更不大可能会被替换,因为成本太大。而要用好它确实需要对其设计思想和实现有全面深刻的理解,懂得扬长避短。不然一些小陷阱会让人很郁闷。" 陈先生基于ACE必然使用者寥寥的观点,也就直接了:
Solstice博客专家 发表于2010年3月14日 23:22:07
回复 AccKernel:请问你知道有哪些外企在用?
-
65楼
csfreebird 2010-03-17 14:30发表 [回复]
- 回复 匿名用户:[e04]
-
64楼
陈硕 2010-03-17 12:41发表 [回复]
- 回复 songbohr:我说我不懂 C 语言,这不是谦虚。我 2001 年以后没有写过 C 代码。一个将近 10 年没有写 C 程序的人,怎么敢大言不惭称“懂”呢?C 语言的库和源代码我最近倒是读了很多,这没什么难的。我的日常工作就是写 C++ 和其他语言的代码,C++ 我还是懂的。一个活儿派过来,我能用 C++ 很快做完;而如果你只允许我用 C,那我交不了差,这就是我说“不懂 C”的含义。
-
63楼
klain__qin 2010-03-17 10:37发表 [回复]
- 很经典:学之者与用之者!