0%

简介

  • zmq通讯组件相关理论基础

概述

  • mq,是消息队列(message queue)的简称,目前有多种消息队列可用,包括RabbitMQ、Kafka等,它们各有特色,可以结合具体的项目需求使用。
  • ZeroMQ简称Zmq,或者0mq,核心引擎由c++编写,是轻量级消息通信库,在对传统的标准socket接口扩展的基础上形成的特色消息通信中间件。
  • Zmq提供了异步消息队列的抽象,具有多种消息通信模式,能够实现消息过滤,能够无缝对接多种传输协议。
  • 简言之,使用socket时,需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏 蔽了这些细节,让网络编程更简单
  • ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),是一个可伸缩层,可并行运行,分散在分布式系统间。
  • 官方描述
    • ZMQ(?MQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。
  • ZMQ是iMatix公司的产品,以LGPLv3开源协议发布。

为什么要使用ZMQ

  • 当今的许多应用程序都包含了跨越某种网络的组件,无论这种网络是局域网还是互联网。因此,许多应用程序开发者最终都会处理某种类型的消息传递

  • 一些开发人员使用消息队列产品,但大多数时候,他们使用TCP或UDP自己做。

  • 这些协议并不难用,但是,​从 A 发送几个字节到 B 和以任何一种可靠的方式处理消息,这两者之间有很大的区别。

  • 让我们来看看当开始使用原始的TCP连接部件的时候,我们要面对的典型问题。任何可复用的消息层都需要解决如下所有这些问题或其中的大部分问题:

    • 我们如何处理I/O呢?
      • ​是让我们的应用程序阻塞,还是在后台处理I/O呢?这是一个关键的设计决策。阻塞式I/O 创建的架构不能很好地扩展,但后台I/O 也是非常难以正确做到的
    • 我们如何处理动态组件(例如,暂时撤除的块)呢?​
      • 我们需要正式将组件划分为“客户端”和“服务器”,并强制该服务器不能撤除吗?那么,如果我们想将服务器连接到服务器时该怎么办呢?我们需要每隔几秒钟就尝试重新连接吗?.
    • ​我们如何表示在线路上的消息呢?​
      • 我们应该怎样将数据组织为帧,才能使得它很容易写入和读取,避免缓冲区溢出,既对小型消息高效,也足以处理非常大的戴着聚会礼帽的跳舞猫的视频呢?
    • ​我们如何处理不能立即传递的消息呢?
      • ​特别是当我们在等待一个组件的联机回应时如何处理呢?我们需要丢弃消息,把它们放入一个数据库,或者把它们放到一个内存队列吗?
    • 我们在哪里存储消息队列呢?​
      • 如果组件从队列中读取很慢,导致我们的队列堆积,这会发生什么情况?我们的策略是什么呢?
    • 我们如何处理丢失的消息呢?
      • ​我们应该等待新的数据,要求重发,还是应该建立某种可靠性层,确保信息不会丢失呢?如果该层本身崩溃了该怎么办呢?
    • 如果我们需要使用一个不同的网络传输,比如说,用多播来取代TCP 单播,或IPv6,该怎么办呢?​我们需要重写应用程序吗?还是将传输抽象到某个层中呢?
    • 我们如何路由消息呢?​我们可以发送同样的消息到多个接收者吗?我们可以发送应答给原来的请求者吗?
    • 我们如何编写出另一种语言的API 呢?
      • ​我们应该重新实现一个线路级协议,还是重新包装一个库?如果是前者,我们怎么能保证协议栈的高效稳定呢?如果是后者,我们又怎么能保证互操作性呢?
    • ​我们应该如何表示数据,以便它可以在不同的架构之间读取呢?​我们应该对数据类型强制执行特定的编码吗?究竟到什么程度,才是消息传递系统的工作,而不是更高一层的工作呢?
    • ​我们应该如何处理网络错误呢?​是等待并重试,默默地忽略它们,还是终止它们呢?
  • ​ZeroMQ解决传统网络编程的问题:

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

依赖环境

  • libzmq3-dev, libzmq5
  • libzmqpp-dev, libzmqpp4

客户端-服务器模式(Client-server)

  • 客户机-服务器模式用于允许一个ZMQ_SERVER服务器与一个或多个ZMQ_CLIENT客户机通信。客户端总是启动对话,之后任何一方都可以向另一方异步发送消息

ZMQ_CLIENT

  • ZMQ_CLIENT套接字与ZMQ_SERVER套接字通信。任何一个对等点都可以连接,但是通常推荐的模型是绑定ZMQ_SERVER并连接ZMQ_CLIENT。

  • 如果ZMQ_CLIENT套接字已经建立了连接,zmq_send()将接受消息,将它们排成队列,并在网络允许的情况下尽可能快地发送它们。传出缓冲区限制由套接字的高水位标志定义。如果传出缓冲区已满,或者没有连接的对等点,zmq_send()将默认阻塞。ZMQ_CLIENT套接字不会删除消息。

  • 当ZMQ_CLIENT套接字连接到多个ZMQ_SERVER套接字时,发送出去的消息将在连接的对等端之间循环分发。同样,ZMQ_CLIENT套接字公平地从每个连接的对等端接收消息。这种用法仅适用于无状态协议。

  • ZMQ_CLIENT套接字是线程安全的,可以从多个线程同时使用。注意,来自ZMQ_SERVER套接字的响应将发送到调用zmq_msg_recv()的第一个客户机线程。如果需要获得对原始线程的响应,每个线程使用一个ZMQ_CLIENT套接字。

  • ZMQ_CLIENT套接字是线程安全的。它们在发送时不接受ZMQ_SNDMORE选项,而在接收时不接受ZMQ_RCVMORE。这就限制了他们只能使用单个部件的数据。其目的是扩展API以允许分散/收集多部分数据。

  • ZMQ_CLIENT特性摘要 

    • 兼容的对等套接字ZMQ_SERVER方向双向的发送/接收模式无限制外发路由策略扇出(Fan out)入网路由策略公平排队静音状态下的操作阻塞

ZMQ_SERVER

  • ZMQ_SERVER套接字与一组ZMQ_CLIENT套接字通信。ZMQ_SERVER套接字只能应答传入消息:ZMQ_CLIENT对等端必须始终发起对话。

  • 每个接收到的消息都有一个routing_id,它是一个32位无符号整数。应用程序可以使用zmq_msg_routing_id(3)来获取它。要向给定的ZMQ_CLIENT对等点发送消息,应用程序必须使用zmq_msg_set_routing_id(3)在消息上设置对等点的routing_id。

  • 如果没有指定routing_id,或者没有引用已连接的客户端对等点,则发送调用将在EHOSTUNREACH中失败。如果客户端对等端的传出缓冲区已满,发送调用将阻塞,除非在发送中使用ZMQ_DONT_WAIT,在这种情况下,它将通过EAGAIN失败。ZMQ_SERVER套接字在任何情况下都不应该丢失消息。

  • ZMQ_SERVER套接字是线程安全的。它们在发送时不接受ZMQ_SNDMORE选项,而在接收时不接受ZMQ_RCVMORE。这就限制了他们只能使用单个部件的数据。其目的是扩展API以允许分散/收集多部分数据。

  • ZMQ_SERVER特性摘要 

    • 兼容的对等套接字ZMQ_CLIENT方向双向的发送/接收模式无限制外发路由策略扇出(Fan out)入网路由策略公平排队静音状态下的操作返回EAGAIN

其他

  • API参考文档:http://api.zeromq.org/master:_start

简介

  • zmq通讯组件相关理论基础知识

维基百科 zmq

  • zmq(ZeroMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库。它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(message broker)。该库设计成常见的套接字风格的API

  • ZeroMQ是由iMatix公司和大量贡献者组成的社群共同开发的。ZeroQ通过许多第三方软件支持大部分流行的编程语言,从Java和Python到Erlang和Haskell

  • ZMQ的技术

    • 类库提供一些套接字(对传统Berkeley套接字和Unix domain socket的泛化),每一个套接字可以代表一个端口之间的多对多连接。以消息的粒度进行操作,套接字需要使用一种消息模式(message pattern),然后专门为那种模式进行了优化。
  • 基本的ZeroMQ模式有:

    • 请求响应模式,将一组客户端连接到一组服务器。这是一种远程过程调用和任务分发模式
    • 发布/订阅模式,将一组发布者连接到一组订阅者。这是一种数据分发模式。
    • 管道模式,以扇出/扇入模式连接节点,可以有多个步骤,可以有循环。这是一种并行的任务分发和收集模式。
    • 排他对模式,在一个排他对中连接两个套接字。 (这是一种高级的为某种用例而设计的低级别模式)
  • 任何通过套接字的消息被看作不透明的数据块。发送给订阅者的消息可以自动地通过块最开始的字符串进行过滤。ZeroMQ提供多种消息传输协议,包括TCP,PGM(可靠的多播),进程间通信(IPC) 以及线程间通讯(ITC)。

  • 由于内部线程模型,ZeroMQ的性能非常好,通过利用一种自动消息批处理技术,它甚至在吞吐量上超过了TCP的性能。

  • ZeroMQ实现了ZMTP, ZeroMQ消息传输协议。[4] ZMTP定义了向后兼容性的规则,可扩展的安全机制,命令和消息分帧,连接元数据,以及其他传输层功能。不使用完整的ZeroMQ实现,而是直接实现ZMTP协议的项目不断增加。

C++ zmq是什么

C++ zmq 是指 ZeroMQ 的 C++ 绑定。ZeroMQ 是一个高性能、异步消息传递库,用于在分布式系统中实现消息通信。它提供了简单而强大的 API,允许开发者构建各种通信模式,包括请求-应答、发布-订阅、推送-拉取等。

C++ zmq 库提供了 ZeroMQ 的 C++ API,使得在 C++ 应用程序中使用 ZeroMQ 变得更加方便。通过 C++ zmq,你可以利用 ZeroMQ 的功能来构建分布式系统,实现各种消息传递模式,并且可以在不同的平台上进行部署。

ZeroMQ 的设计理念是简单易用,同时保持高性能和灵活性,因此它在许多项目中被广泛使用,包括大规模分布式系统、实时数据处理系统、消息队列等场景。C++ zmq 的出现进一步促进了 ZeroMQ 在 C++ 生态系统中的应用和普及。

C++ zmq库 详解

C++ zmq 是 ZeroMQ 的 C++ 绑定,允许你在 C++ 应用程序中使用 ZeroMQ 的功能。ZeroMQ 是一个轻量级的消息传递库,用于构建分布式和并发系统。下面是 C++ zmq 库的一些详细解释:

  1. 简单而强大的 API:C++ zmq 提供了简单而直观的 API,使得在 C++ 应用程序中使用 ZeroMQ 变得容易。它的设计目标之一是简化消息传递的复杂性,因此 API 设计得非常易于理解和使用。

  2. 支持各种通信模式:ZeroMQ 支持多种通信模式,包括请求-应答、发布-订阅、推送-拉取等。C++ zmq 库允许你利用这些通信模式来构建不同类型的分布式系统,根据需要进行灵活的通信。

  3. 高性能和低延迟:ZeroMQ 被设计为高性能和低延迟的消息传递库。C++ zmq 库继承了这些特性,在 C++ 应用程序中实现了高效的消息传递,适用于需要快速响应和高吞吐量的场景。

  4. 跨平台支持:C++ zmq 库支持多种操作系统,包括 Linux、Windows 和 macOS,使得你可以在不同的平台上部署和运行你的应用程序。

  5. 灵活性和可扩展性:ZeroMQ 的设计具有很高的灵活性和可扩展性,允许你根据应用程序的需要定制通信模式和传输协议。C++ zmq 提供了丰富的配置选项,使得你可以根据需求进行定制。

  6. 社区活跃:ZeroMQ 是一个开源项目,拥有活跃的社区支持和持续的更新。C++ zmq 库也得到了广泛的使用和贡献,因此可以在社区中找到丰富的资源和支持。

总的来说,C++ zmq 是一个强大而灵活的库,适用于构建各种类型的分布式系统和消息传递应用程序。它提供了简单易用的 API、高性能的消息传递、跨平台支持等特性,使得在 C++ 应用程序中实现分布式通信变得更加容易和高效。

简介

  • zmq库中常用的函数

C++ zmq::socket_t::set()函数 详解

在 ZeroMQ 的 C++ 绑定中,zmq::socket_t::set() 函数用于设置套接字选项。它允许你在运行时修改 ZeroMQ 套接字的行为,以满足特定的需求。这个函数的签名通常是这样的:

1
2
template<typename T>
socket_t& set(zmq::sockopt::opt<T> option, const T& value);

其中,option 是一个枚举类型,表示要设置的选项,value 是相应选项的值。

下面是一些常用的套接字选项以及它们的用途:

  1. ZMQ_SUBSCRIBE/ZMQ_UNSUBSCRIBE:用于设置订阅的消息过滤器。在订阅者套接字上调用 set() 函数并传递 ZMQ_SUBSCRIBE 选项可以指定要订阅的消息前缀,而 ZMQ_UNSUBSCRIBE 用于取消订阅。

  2. ZMQ_LINGER:设置套接字关闭时等待未发送消息的时间。如果未设置,套接字在关闭时将立即丢弃未发送的消息。可以通过设置这个选项来等待一段时间,以确保消息被发送。

  3. ZMQ_SNDHWM/ZMQ_RCVHWM:设置套接字的发送和接收高水位标记。当队列中的消息数量达到这个水位标记时,后续的发送操作将被阻塞(发送者)或丢弃(接收者)。

  4. ZMQ_SNDTIMEO/ZMQ_RCVTIMEO:设置发送和接收操作的超时时间。当设置了这个选项后,发送和接收操作将在超时时间内等待,如果超时则返回错误。

  5. ZMQ_TCP_KEEPALIVE/ZMQ_TCP_KEEPALIVE_CNT/ZMQ_TCP_KEEPALIVE_IDLE/ZMQ_TCP_KEEPALIVE_INTVL:用于设置 TCP 连接的保持活动参数。

  6. ZMQ_ROUTER_MANDATORY:在 ROUTER 套接字上设置此选项,如果无法路由消息,则立即报告错误。

等等。

需要注意的是,不是所有的选项都适用于所有类型的套接字,而且某些选项的行为可能因 ZeroMQ 版本而异。因此,在使用 set() 函数设置选项时,建议参考 ZeroMQ 文档和版本说明以确保选项的行为符合预期。

zmq::socket_t::set() 函数

  • 这个函数是zmq::socket_t的父类zmq::socket_base中的成员函数,其函数声明为

    1
    2
    3
    4
    5
    6
    7
    // Set array socket option, e.g.
    // `socket.set(zmq::sockopt::plain_username, "foo123")`
    template<int Opt, int NullTerm>
    void set(sockopt::array_option<Opt, NullTerm>, const char *buf)
    {
    set_option(Opt, buf, std::strlen(buf));
    }
  • 其中,第一个参数是一个枚举值,用来表示该连接的属性,其值如下

    • zmq::sockopt::subscribe
  • 第二个参数是字符串,用来标记该连接

简介

  • 备战2024年5月份软件设计师的考试,备考周期为一个半月。

初步学习计划

  • 快速看完一遍视频教程,目的是为了掌握考试的方向和学习的方向
  • 刷题,在看课程的同时刷题,目的是为了高效率的学习,仅看视频是意义不大的。

简介

  • Hexo 框架的基础知识

在文章中插入图片

  • 绝对路径本地引用
    • 当Hexo项目中只用到少量图片时,可以将图片统一放在 source/images文件夹中,通过markdown的语法访问它们
  • 图片引用示例

Hexo使用NexT主题设置主页显示文章摘要方法

方法一:在文章中使用
Read more »

简介

  • hugo 框架相关的理论基础知识

hugo框架 详解

Hugo是一个用于构建静态网站的开源网站生成器。它以速度和性能为重点,是一个非常受欢迎的静态网站生成器,特别适用于博客、文档和小型到中型网站的构建。下面是对Hugo框架的详细解释:

  1. 静态网站生成器:Hugo是一个静态网站生成器,意味着它不需要动态服务器或数据库来生成网页。它将Markdown、HTML、CSS、JavaScript等源文件转换为静态HTML文件,这些文件可以轻松地托管在各种Web服务器上,因此不需要服务器端的处理。

  2. 速度和性能:Hugo以速度和性能为特点。它被设计为非常快速的生成器,允许在几秒钟内生成大型网站。这是因为Hugo是用Go编写的,Go是一门高性能的编程语言。

  3. 单一二进制文件:Hugo被构建为一个单一的二进制文件,因此安装非常简单。你不需要安装大量依赖或复杂的配置,只需下载适用于你的操作系统的Hugo二进制文件,然后开始使用它。

  4. 主题系统:Hugo支持主题,你可以轻松地更改网站的外观和样式。有许多免费和付费的Hugo主题可供选择,或者你可以创建自己的主题。

  5. Markdown支持:Hugo主要使用Markdown格式来编写内容,这使得创建和编辑网站内容非常容易,因为Markdown语法简单直观。

  6. 数据驱动:Hugo采用数据驱动的方法,允许你创建各种类型的内容,例如博客文章、页面、菜单等。你可以使用前端数据文件来定义站点内容。

  7. 自定义内容类型:Hugo允许你定义自己的内容类型,这意味着你可以创建适合特定需求的内容结构,如项目、事件、产品等。

  8. 多语言支持:Hugo支持多语言站点,允许你轻松创建多语言的网站,每个语言版本都可以有自己的内容。

  9. 自动部署支持:Hugo与各种部署工具(如Netlify、GitHub Pages等)集成得很好,这使得将生成的静态文件部署到互联网上变得容易。

  10. 活跃的社区:Hugo有一个活跃的开发社区,提供了丰富的文档、主题和插件。如果你遇到问题,可以在社区中找到帮助。

总的来说,Hugo是一个强大的静态网站生成器,适用于个人博客、小型企业网站、文档站点等。它的速度、性能和灵活性使其成为一个受欢迎的选择,特别是对于那些寻求简单、高效的网站构建解决方案的人。

hugo框架 安装教程 详解

Hugo是一个强大的静态网站生成器,可以帮助你创建快速、高性能的网站。以下是Hugo框架的安装教程,详细解释如何在不同操作系统上安装Hugo。

注意:在安装Hugo之前,请确保你已经安装了Git和一个文本编辑器(如VSCode、Sublime Text等),这些工具在创建和管理Hugo网站时非常有用。

在 macOS 上安装 Hugo

  1. 打开终端应用。

  2. 使用Homebrew安装Hugo。如果你没有安装Homebrew,请首先安装它。

    1
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  3. 安装Hugo。

    1
    brew install hugo
  4. 验证安装。

    1
    hugo version

在 Windows 上安装 Hugo

  1. 下载Hugo的Windows二进制文件(.exe):https://github.com/gohugoio/hugo/releases

  2. 解压下载的ZIP文件,将hugo.exe文件移动到一个你可以轻松访问的目录。你可以将它放在C:\Hugo或其他自定义目录中。

  3. 添加Hugo的可执行文件路径到系统环境变量:

    • 在Windows搜索框中,输入”环境变量”,并选择”编辑系统环境变量”。
    • 在”系统属性”窗口中,点击”高级”选项卡,然后点击”环境变量”按钮。
    • 在”系统变量”部分,找到”Path”,并点击”编辑”。
    • 在”编辑环境变量”窗口中,点击”新建”,并添加Hugo的可执行文件路径,比如C:\Hugo
    • 点击”确定”,保存更改。
  4. 验证安装。

    打开命令提示符(CMD)或PowerShell,并运行:

    1
    hugo version

在 Linux 上安装 Hugo

在大多数Linux发行版中,你可以使用包管理器来安装Hugo。以下是一些示例:

使用 apt-get(Debian/Ubuntu)

1
2
sudo apt-get update
sudo apt-get install hugo

使用 yum(CentOS/RHEL)

1
2
sudo yum install epel-release
sudo yum install hugo

使用 pacman(Arch Linux)

1
sudo pacman -S hugo

使用 snap(通用Linux)

如果你的发行版支持Snap包,你可以使用Snap来安装Hugo。

1
sudo snap install hugo

从源代码编译

如果没有包管理器支持或你想要编译Hugo的最新版本,你可以从源代码编译Hugo。请参考Hugo的官方文档以获取更多信息:https://gohugo.io/getting-started/installing/#source

验证安装

无论你使用哪种操作系统,安装完成后,你可以打开终端或命令行界面并运行以下命令来验证Hugo是否正确安装:

1
hugo version

如果Hugo已成功安装,它将显示版本信息。

一旦你成功安装了Hugo,你就可以开始使用它来创建和管理静态网站。你可以按照前面提到的示例或Hugo的官方文档来创建自己的网站。