ZeroMQ介绍及安装
1. 介绍
1.1 概述
- ZeroMQ(又名ØMQ,MQ,或zmq)看起来像一个可嵌入的网络库,但其作用就像一个并发框架。
- ZeroMQ类似于标准Berkeley套接字,其提供了各种传输工具,如进程内、进程间、TCP和组播中进行原子消息传送的套接字。
- 你可以使用各种模式实现N对N的套接字连接,这些模式包括:扇出、发布-订阅、任务分配、请求-应答。
- ZeroMQ的速度足够快,因此可充当集群产品的结构。
- ZeroMQ的异步I/O模型提供了可扩展的多核应用程序,用异步消息来处理任务。
- ZeroMQ核心由C语言编写,支持C、C++、java等多种编程语言的API,并可运行在大多数操作系统上。
- 相关链接:
1.2 ZeroMQ解决传统网络编程的问题
- 调用的socket接口较多。
- TCP是一对一的连接。
- 编程需要关注很多socket细节问题。
- 不支持跨平台编程。
- 需要自行处理分包、组包问题。
- 流式传输时需处理粘包、半包问题。
- 需自行处理网络异常,比如连接异常中断、重连等。
- 服务端和客户端启动有先后。
- 自行处理IO模型。
- 自行实现消息的缓存。
- 自行实现对消息的加密。
1.3 ZeroMQ的优点
-
我们需要的是做消息传递工作的东西,但需要它以下面这种简单和廉价的方式完成工作:
- 它可以在任何应用程序中以接近零的消耗开展工作。
- 它应该是不需要任何其他依赖就可以链接的库。
- 无须额外的变动部件,所以没有额外的风险。
- 它应该能运行在任何操作系统上,并能用任何编程语言开展工作。
-
而这就是ZeroMQ :一个高效的可嵌入库,它解决了大部分应用程序需要解决的问题,变得在网络上有良好的可伸缩性,而没有多少成本。
-
具体做法:
- 它在后台线程异步处理I/O,这些线程使用无锁数据结构与应用程序进行通信,所以并发ZeroMQ应用程序不需要锁、信号量、或者其他等待状态。
- 组件可以动态地来去自如,而ZeroMQ会自动重新连接,这意味着你可以以任何顺序启动组件,你可以创建“面向服务的架构”(SOA),其中的服务可以在任何时间加入和离开网络。
- 它根据需要自动对消息排队。为此,它会智能地在对消息排队之前,将消息尽可能地推进到接收者。它有一个处理过满队列(称为“高水位标志”)的方法。当队列满时,ZeroMQ会自动阻止发件人,或丢弃消息,这取决于你正在做的是哪种消息传递(即所谓的“模式”)。
- 它可以让你的应用程序通过任意传输协议来互相交流,这些协议可以是:TCP、多播、进程内、进程间。你不需要更改代码以使用不同的传输工具。
- 它使用依赖于消息传递模式的不同策略,安全地处理速度慢/阻塞的读取者。
- 它可以让你采用多种模式,如请求-应答和发布-订阅来将消息路由。这些模式是指你如何创建拓扑结构和网络结构。
- 它可以让你创建代理(proxy)来排队、转发,或通过一个调用来捕获消息。代理可以降低网络互联的复杂性。
- 它使用在线路上的简单组帧原封不动地传递整个消息。如果你写了一个10KB 的消息,那么你将收到一个10KB 的消息。
- 它不对消息强加任何格式。它们是零字节到千兆字节的二进制大对象。当你想表示你的数据时,可以选择其上的其他一些产品,如谷歌的协议缓冲区、XDR 等。
- 它能智能地处理网络错误。有时候它会重试,有时它会告诉你某个操作失败。
- 它可以减少你的能源消耗。少花CPU多办事意味着使用电脑更少的能源,你可以让你的旧电脑使用更长的时间。
-
实际上,ZeroMQ做的比这更多。它对你如何开发网络功能的应用程序有颠覆性的影响:
- 从表面上看,这是一个在其上做zmq_msg_recv()和zmq_msg_send()的套接字风格的API。
- 但该消息处理循环迅速成为中心循环,而你的应用程序很快就会分解成一组消息处理任务。它是优雅和自然的。
- 而且,它可扩展:每个任务对应一个节点,节点通过任意传输方式互相交谈。在一个进程中的两个节点(节点是一个线程),在一台电脑中的两个节点(节点是一个进程),或一个网络上的两台电脑(节点是一台电脑),所有的处理方式都是相同的,不需要更改应用程序代码。
1.4 ZeroMQ模型
1.4.1 REQ/REP请求响应模型
1.4.2 PUB/SUB发布订阅模型
1.4.3 PUSH/PULL推拉模型
1.4.4 Router/Dealer模型
- 演示案例可以参阅:hthttps://dongshao.blog.csdn.net/article/details/106878960。
2. 安装
2.1 非源码
2.1.1 pip安装pyzmq
pip install pyzmq
如果由于某种原因wheel 不工作,或者您想强制编译pyzmq, (这里如果您已经按照您想要的方式安装并配置了libzmq,通常更好), 您可以使用以下命令强制安装:
pip install --no-binary=:all: pyzmq
2.1.2 yum安装
编译pyzmq时(例如在Linux上使用pip安装), 通常建议单独安装ZeroMQ, 通过自制软件、apt、yum等:
yum install libzmq3-devel
如果这不可用,pyzmq将尝试将libzmq构建为Python扩展, 尽管这并不能保证有效。
从git repo(包括GitHub上的release标签)构建pyzmq需要Cython。
2.2 源码安装
2.2.1 依赖包安装
依赖包安不安装都可以。
sudo yum install libtool -y
sudo yum install pkg-config -y
sudo yum install build-essential -y
sudo yum install autoconf -y
sudo yum install automake -y
2.2.2 上传压缩包
将zeromq-4.1.8.tar.gz
和pyzmq-26.2.0.tar.gz
安装包下载,并上传到服务器。
下载地址为:
2.2.3 解压安装
tar -zxvf zeromq-4.1.8.tar.gz
cd zeromq-4.1.8
# 如果需要加密
./autogen.sh
# 编译安装
./configure
sudo make
sudo make install
tar -zxvf pyzmq-26.2.0.tar.gz
cd pyzmq-26.2.0
# 编译安装(低版本)
python setup.py configure --zmq=/usr/local #set the zmq install path
# 编译安装高版本
pip install setuptools wheel
pip install .
pip show pyzmq
2.2.3.1 zeromq
-
进行配置:
./configure
-
--prefix选项:如果不指定prefix选项,可执行文件默认放在
/usr/local/bin
,库文件默认放在/usr/local/lib
,配置文件默认放在/usr/local/etc
,其它的资源文件放在/usr/local/share
。 -
配置完成之后如下图所示,产生Makefile文件:
-
如果配置时产生下面的错误,那么配置的时候添加
--without-libsodium
选项即可,表示我们不使用Sodium加密库,上面我们对Sodium已经介绍过了。./configure --without-libsodium
-
想用arm-linux-gcc版本的,那么就的添加--host参数,以下其他操作都是相同,但是最后一步,需要将编译成功的lib下的库文件libzmq.so.5复制到ARM开发板的lib库文件夹当中。
./configure --host=arm-none-linux-gnueabi
-
-
-
编译与安装:
sudo make sudo make install
-
安装完成之后动态库文件默认在
/usr/local/lib/
目录下,头文件默认在/usr/local/include/
目录下。 -
执行下面的命令重新加载动态库。
sudo ldconfig
-
2.2.3.2 pyzmq
pip install setuptools wheel
cd pyzmq-26.2.0
pip install .
pip show pyzmq
3. 问题记录
3.1 pip安装报错
pip安装时提示安装错误。
(venv-patroni-4.0.3) [fbase@localhost .pip]$ /opt/soft/patroni/venv-patroni-4.0.3/bin/python3 -m pip install --upgrade pip
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: pip in /opt/soft/patroni/venv-patroni-4.0.3/lib/python3.9/site-packages (22.0.4)
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1129)'))': /simple/pip/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1129)'))': /simple/pip/
cWARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1129)'))': /simple/pip/
dWARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1129)'))': /simple/pip/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1129)'))': /simple/pip/
Could not fetch URL https://pypi.tuna.tsinghua.edu.cn/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.tuna.tsinghua.edu.cn', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1129)'))) - skipping
WARNING: You are using pip version 22.0.4; however, version 24.3.1 is available.
You should consider upgrading via the '/opt/soft/patroni/venv-patroni-4.0.3/bin/python3 -m pip install --upgrade pip' command.
解决方案:
-
pip换源
# 命令行 pip config set global.trusted-host mirrors.aliyun.com pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/ # 文件 cd ~/.pip # 如果不存在 mkdir ~/.pip cd ~/.pip touch pip.conf vi ~/.pip/pip.conf [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host = https://pypi.tuna.tsinghua.edu.cn
-
pip使用临时国内源
pip install pyzmq -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
-
更新时间
yum install -y ntpdate ntpdate ntp.aliyun.com
-
更新证书
yum install -y ca-certificates update-ca-trust
3.2 yun无法安装libzmq3-devel
报错日志如下:
[root@localhost ~]# yum install libzmq3-devel
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
没有可用软件包 libzmq3-devel。
错误:无须任何处理
解决方案:
yum clean all
yum makecache
yum repolist enabled
# 如果没有epel-release就安装
yum install -y epel-release
# 再次安装
yum install -y libzmq3-devel
yum search libzmq
yum install -y zeromq zeromq-devel
# 如果没有
[root@localhost ~]# yum search libzmq
================================================================= N/S matched: libzmq ==================================================================
perl-ZMQ-LibZMQ3.x86_64 : Perl wrapper for the libzmq 3.x library
perl-ZMQ-Constants.noarch : Constants for the libzmq library
名称和简介匹配 only,使用“search all”试试。
[root@localhost ~]# yum install -y zeromq zeromq-devel
标签:None,介绍,yum,install,pip,ZeroMQ,安装,pyzmq
From: https://www.cnblogs.com/zreo2home/p/18628576