ZeroMQ介绍及安装

ZeroMQ介绍及安装

1. 介绍

1.1 概述

1.2 ZeroMQ解决传统网络编程的问题

  • 调用的socket接口较多。
  • TCP是一对一的连接。
  • 编程需要关注很多socket细节问题。
  • 不支持跨平台编程。
  • 需要自行处理分包、组包问题。
  • 流式传输时需处理粘包、半包问题。
  • 需自行处理网络异常,比如连接异常中断、重连等。
  • 服务端和客户端启动有先后。
  • 自行处理IO模型。
  • 自行实现消息的缓存。
  • 自行实现对消息的加密。

1.3 ZeroMQ的优点

  1. 我们需要的是做消息传递工作的东西,但需要它以下面这种简单和廉价的方式完成工作:

    • 它可以在任何应用程序中以接近零的消耗开展工作。
    • 它应该是不需要任何其他依赖就可以链接的库。
    • 无须额外的变动部件,所以没有额外的风险。
    • 它应该能运行在任何操作系统上,并能用任何编程语言开展工作。
  2. 而这就是ZeroMQ :一个高效的可嵌入库,它解决了大部分应用程序需要解决的问题,变得在网络上有良好的可伸缩性,而没有多少成本。

  3. 具体做法:

    • 它在后台线程异步处理I/O,这些线程使用无锁数据结构与应用程序进行通信,所以并发ZeroMQ应用程序不需要锁、信号量、或者其他等待状态。
    • 组件可以动态地来去自如,而ZeroMQ会自动重新连接,这意味着你可以以任何顺序启动组件,你可以创建“面向服务的架构”(SOA),其中的服务可以在任何时间加入和离开网络。
    • 它根据需要自动对消息排队。为此,它会智能地在对消息排队之前,将消息尽可能地推进到接收者。它有一个处理过满队列(称为“高水位标志”)的方法。当队列满时,ZeroMQ会自动阻止发件人,或丢弃消息,这取决于你正在做的是哪种消息传递(即所谓的“模式”)。
    • 它可以让你的应用程序通过任意传输协议来互相交流,这些协议可以是:TCP、多播、进程内、进程间。你不需要更改代码以使用不同的传输工具。
    • 它使用依赖于消息传递模式的不同策略,安全地处理速度慢/阻塞的读取者。
    • 它可以让你采用多种模式,如请求-应答和发布-订阅来将消息路由。这些模式是指你如何创建拓扑结构和网络结构。
    • 它可以让你创建代理(proxy)来排队、转发,或通过一个调用来捕获消息。代理可以降低网络互联的复杂性。
    • 它使用在线路上的简单组帧原封不动地传递整个消息。如果你写了一个10KB 的消息,那么你将收到一个10KB 的消息。
    • 它不对消息强加任何格式。它们是零字节到千兆字节的二进制大对象。当你想表示你的数据时,可以选择其上的其他一些产品,如谷歌的协议缓冲区、XDR 等。
    • 它能智能地处理网络错误。有时候它会重试,有时它会告诉你某个操作失败。
    • 它可以减少你的能源消耗。少花CPU多办事意味着使用电脑更少的能源,你可以让你的旧电脑使用更长的时间。
  4. 实际上,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.gzpyzmq-26.2.0.tar.gz安装包下载,并上传到服务器。

下载地址为:

pyzmq

zeromq

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文件:

      1. 如果配置时产生下面的错误,那么配置的时候添加--without-libsodium选项即可,表示我们不使用Sodium加密库,上面我们对Sodium已经介绍过了。

        ./configure --without-libsodium
        
      2. 想用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
posted @   零の守墓人  阅读(222)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示