Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
518 views
in Technique[技术] by (71.8m points)

rabbitMq 为什么不直接使用 TCP 发送消息,而是虚拟 channel?

”对于OS来说,建立和关闭TCP连接是有代价的,频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。“

上面这段话是很多技术文章写到的,也没具体的分析,我很纳闷,TCP连接可以保持长连接,如果不显示关闭,也不会断开呀,我们也可以直接发送消息,只要不断开TCP就行,这样不会出现频繁的建立关闭TCP连接带来的开销啊。而且channel 也是利用TCP,简单来说,不管你多个channel,始终是往一个socket上发送数据。除了channel有私密性以外。本质上为什么这样设置,如果只是系统消耗,好像说不过去。

 如果是http,我还能理解,一种request/response型的协议,为什么要做成request/response这种类型呢,因为server端要服务的client太多了,如果每一个连接都保持而不断开,那么服务器的资源很快就会被消耗完了。但是rabbitMQ有点理解不了。

如果哪位大神知道为什么,麻烦指点一下。### 问题描述


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

不负责任地瞎猜一下,如果有错误请指正。
在erlang中每建立一个tcp连接必须启动一个进程去处理,不然这个代码就很难写,
而进程之间通信必须是拷贝的方式,rabbitmq中如果建立了多个tcp连接,将这些消息汇聚到一个消息队列的进程中的时候相当于把所有消息拷贝了一次。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...