文档章节

(转)小心使用zeromq

DEC_LIU
 DEC_LIU
发布于 2013/09/15 15:08
字数 748
阅读 354
收藏 1
1.关于介绍zeromq的就不说了,可以自己去看官方guide很详细
2.主要说下在使用过程中需要注意的地方
1)使用如果使用c++的接口的时候,在你自己的类中或者apache模块中
需要将zmq::context_t 对象定义在zmq::socket_t对象的前面,这样可以保证销毁的顺序

2)使用sub-pub时候,如果sub没有调用setsockopt设置过滤项(设置NULL则接受所有),那么将会接收不到任何的消息,默认会阻塞所有消息

3)如果是后台服务集群使用且zmq需要bind端口的,那么最好在iptables中进行下过滤,不要让外部链接
连接过来,否则会造成cpu空转;关于cpu空转将会在最后说

4)客户端连接服务器时,每个客户端中的zmq,每个连接使用一个socket,虽然可以一个socket可以调用connect多次,也就是连接多个server。但是,记住,最好是一个socket只调用一次connect

5)使用zmq的程序,运行一段时间后(可能几天),如果你碰到异常退出,并且你使用nohup运行的log
nohup.out中显示zeromq connection timeout,那么你可以zeromq/src/tcp_socket.cpp文件中的203行看是write的时候出错。
[cpp]   view plain copy
  1. int zmq::tcp_socket_t::write (const void *data, int size)  
  2. {  
  3.     ssize_t nbytes = send (s, data, size, 0);  
  4.   
  5.     //  Several errors are OK. When speculative write is being done we may not  
  6.     //  be able to write a single byte to the socket. Also, SIGSTOP issued  
  7.     //  by a debugging tool can result in EINTR error.  
  8.     if (nbytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK ||  
  9.           errno == EINTR))  
  10.         return 0;  
  11.   
  12.     //  Signalise peer failure.  
  13.     if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE))  
  14.         return -1;  
  15.   
  16.     errno_assert (nbytes != -1);  
  17.     return (size_t) nbytes;  
  18. }  


这是由于 errno_assert (nbytes != -1);造成的,但是,真正的原因是nbytes==-1时,errno==ETIMEDOUT ,在前面一行中没有去添加对这个timeout的判断,另外,可以参考该文件中对win上的处理。因此,这里如果你碰到了timeout错误,那么请将errno == ETIMEOUT加入到errno==EPIPE后面,然后重新编译

6)关于cpu空转。首先你可以用top 程序名,去看你的程序的cpu使用率是否是100%,而且基本固定不变,那么这时候,你就需要怀疑是否你的程序的问题,然后通过lsof -p 程序的进程号,去查看是否有文件描述符有can't identify protocol,还要注意下,是否有外网的ip连接到你的zmq的监听的端口。
然后,你可以在zeromq/src/epoll.cpp中的loop,rm_fd,add_fd函数中打log,看看在监听到EPOLLERR|EPOLLHUP
的文件描述符是不是lsof -p 查看到的can't identify protocol的文件描述符一致。其实,只要做到前面5点,那么cpu
空转基本是不会出现的。

ps:最后,希望碰到问题,大家能自己思考为什么会出现这样的问题,该如何解决,对自己的提升会有很大的帮助

本文转载自:

DEC_LIU
粉丝 27
博文 18
码字总数 9469
作品 0
浦东
架构师
私信 提问
[架构] ZeroMQ 深度探索(一)

序 最初认识 ZeroMQ 是被它的名号所吸引,最近在一个高性能中间件的项目中用到了 ZeroMQ,对这个号称“史上最快的消息队列”有了更深层次的了解。如果我们仅仅把 ZeroMQ 看作是一个消息队列,...

长平狐
2013/07/01
8.1K
0
高性能的通讯库-zeroMQ的几个高性能特征

这两天研究了一下zeroMQ,号称史上最好的通讯库,比rabbitMQ快很多,基于c语言开发的,实时流处理sorm的task之间的通信就是用的zeroMQ。 zeroMQ在使用模式上支持多种,有req-reply,publish...

天下杰论
2014/10/08
510
0
[架构] ZeroMQ 深度探索(二)

在上一篇《 ZeroMQ 深度探索(一)》中,我们使用 ZeroMQ 完成了基本的“请求-响应”模式,这个例子是基于 TCP 协议的,用法和原生的 Socket API 也差不多,都是“初始化、绑定或连接、发送、...

长平狐
2013/07/01
6.7K
2
AAuto v1.1.21 同时支持ZeroMQ与Protobuf

ZeroMQ网络库提供一些跨多种传输协议(如进程内通讯、IPC、TCP和广播)的套接字供你使用,可使用多种方式实现N对N的套接字连接。ZeroMQ非常适合与Protobuf结合使用,并且与Protobuf一样在很多...

qqmmcc
2011/11/20
2.1K
1
使用 ZeroMQ 实现分布式消息系统

“分布式系统是你甚至不知道的一台计算机上的故障可以使您自己的计算机不可用。”-Leslie Lamport 随着云计算的普及和可用性,分布式系统架构已很大程度上取代了更多的整体构建。当然,使用面...

oschina
2015/05/11
20.8K
21

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
1
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
3
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部