异步编程语言的常见坑

标签: Computer System Go Golang NodeJS | 发表时间:2014-03-12 22:35 | 作者:ideawu
出处:http://www.ideawu.net/blog

天生支持异步编程的语言如 NodeJS, Golang 等, 创建一个异步 routine 的成本非常小, 这确实是一个非常方便的功能. 比如用在网络爬虫程序的开发, 对于每一个要抓取的 URL 就启动一个 routine, 类似启动一个线程, 既能充分利用 CPU 多核, 代码也很简洁.

正因为太方便, 所以常常被滥用, 并引发许多严重坑. 下面分析一下.

1. 拖垮了所依赖的服务

写异步编程的程序员是爽了, 但维护数据库的 DBA 却要哭了. 异步编程程序员每一个查询可以轻松的异步, 但数据库的处理能力就那么多, 最直接的后果是数据库挂了. 回到网络爬虫的例子, 如果爬虫本身不做控制, 可能就把对方的网站拖垮了.

2. 用完了 socket 连接数

一般的异步编程语言的 runtime 会对每个程序只起一个进程, 每一个进程的最大连接数是有限制的, 比如一般的桌面系统是 256, 所以, 虽然异步的成本很小, 但很快就会用完 socket 连接数, 想再增加并发也增加不了了. 而且, 用完了最大连接数, 还经常会触发其它严重的问题.

3. 用完了本机端口

这个坑和前一个有些类似. 常见的程序一般只连一台数据库服务器的一个实例, 这样, 程序最多只能连 3 万多个连接, 这时端口就会被用光, 因为操作系统一般从 3 万多开始分配临时端口号, 最大 65535. 如果并发太多导致保持了太多的网络连接, 这时, 你就会看到你的异步编程开发出来的程序报错: Cannot assign requested address. 这时, 整个操作系统都会受不良影响!

如何解决?

其实, 要解决这些坑, 必须异步变同步. 什么? 异步变同步?

其实, 就是通过一个同步队列, 控制一下异步的并发量. 所以, 异步编程是和队列(排队)紧密相连, 如果你的异步编程没有用到队列, 那么你的程序就必然存在隐患! 除非你能确保异步调用不会爆炸性增长. 这是一条真理!

例如网络爬虫的例子, 为了控制抓取的并发量, 就要通过某种策略, 把要抓取的 URL 放到队列中, 控制在队列中同时存在的同一个域名的 URL 数量, 然后再异步地从这个队列领取 URL 进行抓取, 这就不会把别人的网站拖垮了.

不过, 具体用哪个策略, 是和业务相关的. 其实这个策略的实现, 开发的工作量不一定小, 有时, 异步不异步根本解决不了太大的问题, 这个策略才是工作量的大头.

Related posts:

  1. Lighttpd mod_fastcgi源码分析
  2. TCP网络协议及其思想的应用
  3. Windows Python select标准输入输出
  4. SSH ProxyCommand及其思想
  5. 结合IO多路复用的多线程服务器模型

相关 [异步 编程语言 常见] 推荐:

异步编程语言的常见坑

- - idea's blog
天生支持异步编程的语言如 NodeJS, Golang 等, 创建一个异步 routine 的成本非常小, 这确实是一个非常方便的功能. 比如用在网络爬虫程序的开发, 对于每一个要抓取的 URL 就启动一个 routine, 类似启动一个线程, 既能充分利用 CPU 多核, 代码也很简洁.. 正因为太方便, 所以常常被滥用, 并引发许多严重坑.

[转][转]Clojure 编程语言

- - heiyeluren的blog(黑夜路人的开源世界)
简介: Lisp 是一种编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况. Clojure 是一种运行在 Java™ 平台上的 Lisp 方言,它的出现彻底改变了这一现状. 如今,在任何具备 Java 虚拟机的地方,您都可以利用 Lisp 的强大功能. 在本文中,了解如何开始使用 Clojure,学习它的一些语法,同时利用 Eclipse 的 Clojure 插件提供帮助.

如果编程语言是汽车……

- 康爷 - Wow! Ubuntu
原文: If programming languages were cars... http://www.cs.caltech.edu/~mvanier/hacking/rants/cars.html,有筛减. 本文是一系列把编程语言和汽车对比的老笑话合集,添加了几种最近流行的语言. 注:似乎 Digg/Reddit/StumbleUpon 对本文进行了挖掘/阅读/踩,结果我收到了一大坨儿的新建议.

如果编程语言是一条船…

- will - cnBeta.COM
Turing绝对是一个双人皮划艇.

杂谈现代高级编程语言

- 卡飞菲 - Yi Wang's Tech Notes
几个月之前,Slashdot转载了Robert Harper教授的一篇博客,说卡内基梅隆大学计算机系把”面向对象编程“从大一新生的必修课中删掉了,其原因是. 这两个原因(anti-modular和anti-parallel)都是很重的指责了;尤其是anti-modular,因为OO的基本思想通常被理解成“封装”,从而实现模块化.

你喜欢什么编程语言?

- Sean - 不周山
OpenParty回来,重看了一下自己的讲稿,觉得还是挺乱的,想传递的东西很多,仓促之间也没有把内容组织好,对周六冒着桑拿天赶到现场,还在一间没有空调的挤了一百多号人的房间里听我唠叨了近一个小时的同学们深感有愧. 这里摘要一下,也许能同时弥补一下因为我口音不纯带来的表意不清. 其实主要是两部分的内容,一是我认为R能极大提高算法与数据工作人员的快乐程度及工作效率;二是R的发展历史中呈现出来的六张面孔.

年度编程语言锁定Objective-C

- ndv - 《程序员》杂志官网
虽然2011年才刚过半,但随着iPhone和iPad平台市场领导地位的确立和Apple各系统不断推陈出新,从市场占有的趋势来看,Objective-C成为年度编程语言无疑. TIOBE编程语言排行榜每年初都将统计评出上年度的最佳编程语言大奖,获奖的编程语言被认为在该年度市场份额增长及用户认可度方面获得了最为突出的成绩.

Google将宣布新编程语言Dart

- 李龑 - Solidot
Google的两位工程师将在下个月举行的Goto软件开发会议上宣布一门全新的编程语言Dart. 这门新语言是为结构化的Web编程设计的,适用于开发基于浏览器的Web应用. Google还没有透露Dart的任何技术细节. Google在2009年曾发布了主要针对服务器端的Go语言.

编程语言之间的界限

- - ITeye资讯频道
Cory House是一个软件开发者,笃信清洁代码和务实开发. 最近他总结了不同的编程语言之间存在的界限规则,他还认为不了解编程语言之间存在的界限无异于选择错误的开发工具,要想简化、加快软件开发过程,了解语言之间的异同是必不可少的. 如今开发者有很多种途径去解决编程问题,不管是利用大量的类库还是各种各样的技术工具.

Peter Norvig:编程语言的选择并不重要

- jeff - python.cn(jobs, news)
Lisp被许多资深程序员视为编程语言中的圣杯,因为学起来很难. 著名程序员、最热门的技术问答网站StackOverflow创始人Joel Spolsky曾经在“Java语言学校的危险性”一文中说,自己当年在大. 学里学习用Lisp的导论课程也是苦不堪言,而Lisp这样的函数式语言实际开发中并不常用,但是一旦到了体现优势的时候,你如果不懂,将失之千里.