Chinaunix首页 | 论坛 | 博客
  • 博客访问: 179809
  • 博文数量: 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,也不清楚大家都是怎么用的?
以上只代表个人观点。
阅读(12503) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

sprbeyond2014-05-17 22:23:47

lorddeath:如果你写过socket用过epoll就不会这样理解了,本质上来说是一个信号量唤醒的机制。ZeroMQ这样的结构就是为复杂业务而存在的,这是一个非常漂亮的异步解决方案,有这样的通讯框架存在能帮助我们非常容易做到无缝升级、灾备、处理能力伸缩等企业级应用需要的解决办法。

你这太理论了,有没有实际做过?


可以考虑当recv后业务很复杂,不得不放到另外的线程工作,那么当计算结果出来后又如何send?

目前似乎无办法

回复 | 举报

sprbeyond2014-05-17 22:20:15

同意楼主意见。

当服务器端的业务沉重复杂时就无法使用zeromq, 这是因为单线程安全引起的无法异步执行recv和send。

lorddeath2014-02-20 16:43:09

如果你写过socket用过epoll就不会这样理解了,本质上来说是一个信号量唤醒的机制。ZeroMQ这样的结构就是为复杂业务而存在的,这是一个非常漂亮的异步解决方案,有这样的通讯框架存在能帮助我们非常容易做到无缝升级、灾备、处理能力伸缩等企业级应用需要的解决办法。

moon_rock2013-09-22 18:55:04

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

最近仔细研究了一下zeromq,想和你一起探讨下。

回复 | 举报

moon_rock2013-09-22 18:54:35

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

最近仔细研究了一下zeromq,有相关问题,跟你请教。

回复 | 举报