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的時候出錯。
這是由於 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:最後,希望碰到問題,大家能自己思考為什麼會出現這樣的問題,該如何解決,對自己的提升會有很大的幫助。