Chinaunix首页 | 论坛 | 博客
  • 博客访问: 179819
  • 博文数量: 28
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 954
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-21 10:28
个人简介

站在巨人的肩膀是骗人的

文章分类

全部博文(28)

文章存档

2013年(28)

分类: C/C++

2013-04-14 10:52:24

google一下zeromq,会发现很多关于zeromq最快的字眼,包括云风也给予了zeromq很高的评价,说是云时代最好的东西。
在我看来zeromq是个不健全的网络解决方案。为何不健全?
说一说它是如何实现的,zeromq为了消除多线程数据竞争的问题,它将每个socket均衡地丢给一根io线程,然后这个socket就绑定在io线程上了。
强制约束使用者,能在绑定io线程之外的其他线程中访问。那么问题就来了,你提供的这个zeromq只能通过recv触发send,如何在框架里添加定时功能?
增加一根定时线程?那么定时线程不能访问socket。而zeromq着重强调消息模式,reqest/reply, push/pull等,我觉得这更像硬件层面要做的事情,比如路由器,交换机等。
所以zeromq很难做复杂的业务,还需要在zeromq上层进行多线程数据竞争。不像libevent提供了timeout, signal, send/recv事件处理。
不太清楚,现在有多少项目用zeromq,也不清楚大家都是怎么用的?
以上只代表个人观点。
阅读(12505) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

anderslane2013-04-25 22:13:34

moon_rock:timerfd就是内核触发定时器呗,每个os有自己的实现。
但是不管开一根定时器线程,还是使用内核定时器通知应用层,都会造成多线程访问单个socket的情况,那么这个时候肯定需要加锁来处理。总不能一遇到多线程访问单个socket就用mailbox来交换吧。而对于加锁这块,zeromq没有做。

还是先写点代码吧,用了这么久还没遇到你说的要加锁的情况。

回复 | 举报

moon_rock2013-04-24 12:34:55

anderslane:zmq的线程模型是基于Poll的,它的socket可以直接放入poll中。在linux下面使用时,可以在zmq的socket的poll组中加入一个timerfd。这样就解决了定时器的问题。timerfd号称精确到us级别。
在windows下面使用的时候比较麻烦点,需要在每次recv后重新计算interval,再将此interval作为timeout的参数启动poll,不太精确。计算的时候使用zmq的clock来获取系统时间即可。也许有更好的方法?

timerfd就是内核触发定时器呗,每个os有自己的实现。
但是不管开一根定时器线程,还是使用内核定时器通知应用层,都会造成多线程访问单个socket的情况,那么这个时候肯定需要加锁来处理。总不能一遇到多线程访问单个socket就用mailbox来交换吧。而对于加锁这块,zeromq没有做。

回复 | 举报

anderslane2013-04-24 12:04:18

zmq的线程模型是基于Poll的,它的socket可以直接放入poll中。在linux下面使用时,可以在zmq的socket的poll组中加入一个timerfd。这样就解决了定时器的问题。timerfd号称精确到us级别。
在windows下面使用的时候比较麻烦点,需要在每次recv后重新计算interval,再将此interval作为timeout的参数启动poll,不太精确。计算的时候使用zmq的clock来获取系统时间即可。也许有更好的方法?