NNG和DDS

NNG (Nanomsg Next Generation)DDS (Data Distribution Service) 是两种不同的通信协议,各自在不同场景下具有其优势。下面我将对这两种技术进行详细解释,并通过具体的例子来说明它们如何应用在实际场景中。


1. NNG (Nanomsg Next Generation)

NNG简介

NNG 是 Nanomsg 的下一代实现,它是一个高效、轻量级的消息传递库,主要用于 进程间通信(IPC)。它设计为低延迟、可扩展的分布式系统通信解决方案,支持多种通信模式,适用于需要高性能的应用。

主要特性:
  • 高性能:NNG 提供低延迟和高吞吐量的消息传递,非常适合实时和高频率的通信。
  • 简单的 API:NNG 的 API 设计简洁易用,适合快速集成。
  • 灵活的通信模式:NNG 支持多种通信模式,如:
    • 推送-拉取(Push/Pull):适用于生产者与消费者模型。
    • 发布-订阅(Pub/Sub):适用于广播模式,发布者向多个订阅者传递信息。
    • 请求-响应(Req/Rep):典型的客户端-服务器模式。
    • 一对多(Survey):一个发布者向多个消费者发送请求。
  • 轻量级:NNG 的设计目标是小巧且高效,适合嵌入式系统或资源受限的环境。
NNG应用场景:
  • 实时数据交换:比如,在多任务系统中,多个任务需要频繁地交换数据并且要求高效、低延迟。
  • 高频通信:在金融领域的高频交易系统中,NNG 可以处理高频率的数据交换。
  • 嵌入式系统和物联网:嵌入式系统中经常需要在资源有限的设备之间进行快速、低延迟的通信。
NNG通信模式例子:

假设我们有一个生产者和多个消费者,生产者每秒钟生产一条消息,多个消费者对消息进行处理。我们可以使用 NNG 的 Push/Pull 模式来实现这种通信。

生产者(推送者)代码:

#include <nng/nng.h>
#include <nng/protocol/pair0/pair.h>
#include <iostream>int main() {nng_socket sock;nng_pair0_open(&sock);nng_listen(sock, "ipc:///tmp/producer", NULL, 0);while (true) {const char *msg = "Hello, Consumer!";nng_send(sock, msg, strlen(msg) + 1, 0);std::cout << "Sent: " << msg << std::endl;}return 0;
}

消费者(拉取者)代码:

#include <nng/nng.h>
#include <nng/protocol/pair0/pair.h>
#include <iostream>int main() {nng_socket sock;nng_pair0_open(&sock);nng_dial(sock, "ipc:///tmp/producer", NULL, 0);while (true) {char *msg = NULL;size_t size;nng_recv(sock, (void **)&msg, &size, 0);std::cout << "Received: " << msg << std::endl;nng_free(msg, size);}return 0;
}

解释

  • 生产者通过 nng_send 将消息发送到 ipc:///tmp/producer 地址。
  • 消费者通过 nng_recv 从该地址接收消息。

这种模式适用于需要实时消息推送的场景,如物联网设备间的数据交换。


2. DDS (Data Distribution Service)

DDS简介

DDS 是一种 实时数据分发服务,专为大规模分布式系统设计。它采用 发布-订阅(Pub/Sub)架构,不依赖于中心化的服务器,通过中间件进行高效、可靠的数据分发。DDS 设计上侧重于提供高可靠性、低延迟和实时性。

主要特性:
  • 实时性和高可靠性:DDS 支持严格的实时性要求,并提供多种质量服务(QoS)策略,如延迟、带宽、可靠性等。
  • 分布式架构:DDS 采用去中心化的架构,允许节点之间直接交换数据,不需要中心服务器。
  • 多播与点对点通信:支持点对点和多播通信方式,适应不同的数据传输需求。
  • 质量服务(QoS):通过配置 QoS 策略,DDS 可以控制数据的传输行为(例如,可靠性、顺序性、延迟等)。
  • 可扩展性:DDS 适用于大规模分布式系统,能够处理成千上万的节点。
DDS应用场景:
  • 实时控制系统:如自动驾驶、飞行控制系统、工业自动化等,数据需要及时、可靠地传输。
  • 分布式仿真:例如在军事、航天等领域的分布式仿真系统中,多个计算节点之间需要共享实时数据。
  • 物联网(IoT):在物联网环境中,多个设备之间需要进行实时数据交换并保持高可靠性。
DDS通信模式例子:

假设我们有一个分布式仿真系统,其中多个仿真节点需要交换传感器数据。使用 DDS 进行数据发布和订阅。

发布者(传感器数据)代码:

#include <dds/dds.hpp>
#include <iostream>struct SensorData {int id;float temperature;float humidity;
};int main() {dds::domain::DomainParticipant participant(0);dds::topic::Topic<SensorData> topic(participant, "SensorDataTopic");dds::pub::Publisher publisher(participant);dds::pub::DataWriter<SensorData> writer(publisher, topic);SensorData data;data.id = 1;data.temperature = 23.5f;data.humidity = 60.0f;while (true) {writer.write(data);std::cout << "Sent: " << data.id << " " << data.temperature << " " << data.humidity << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}return 0;
}

订阅者(接收数据)代码:

#include <dds/dds.hpp>
#include <iostream>struct SensorData {int id;float temperature;float humidity;
};int main() {dds::domain::DomainParticipant participant(0);dds::topic::Topic<SensorData> topic(participant, "SensorDataTopic");dds::sub::Subscriber subscriber(participant);dds::sub::DataReader<SensorData> reader(subscriber, topic);while (true) {dds::sub::LoanedSamples<SensorData> samples = reader.take();for (const auto& sample : samples) {if (sample.info().valid()) {std::cout << "Received: " << sample.data().id << " " << sample.data().temperature << " " << sample.data().humidity << std::endl;}}}return 0;
}

解释

  • 发布者将传感器数据(如温度和湿度)写入到 DDS 的 SensorDataTopic 主题。
  • 订阅者订阅该主题并接收传感器数据。

DDS 允许多节点之间的实时、可靠的数据交换,而无需中心化的服务。


NNG与DDS的对比

特性NNGDDS
通信模型点对点、发布-订阅、请求-响应等发布-订阅
可靠性基本可靠,依赖于消息传输机制高度可靠,支持 QoS 策略
实时性低延迟,高吞吐高实时性,严格的 QoS 支持
拓扑点对点、星型、网状结构等去中心化,支持大规模分布式系统
应用场景实时通信、高频交易、嵌入式系统分布式仿真、物联网、自动驾驶等
扩展性较弱,适合小到中型系统强,支持大规模分布式系统

总结

  • NNG:适用于低延迟、高吞吐的局部通信,尤其适合进程间通信和小规模分布式系统。它提供了多种灵活的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自制操作系统day7(获取按键编码、FIFO缓冲区、鼠标、键盘控制器(Keyboard Controller, KBC)、PS/2协议)

day7 获取按键编码&#xff08;hiarib04a&#xff09; void inthandler21(int *esp) {struct BOOTINFO *binfo (struct BOOTINFO *) ADR_BOOTINFO; // 获取系统启动信息结构体指针unsigned char data, s[4]; // data: 键盘数据缓存&#x…

Javase 基础加强 —— 09 IO流第二弹

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 缓冲字节…

服务器操作系统调优内核参数(方便查询)

fs.aio-max-nr1048576 #此参数限制并发未完成的异步请求数目&#xff0c;应该设置避免I/O子系统故障 fs.file-max1048575 #该参数决定了系统中所允许的文件句柄最大数目&#xff0c;文件句柄设置代表linux系统中可以打开的文件的数量 fs.inotify.max_user_watches8192000 #表…

[Windows] 格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具

想要轻松搞定各类媒体文件格式转换&#xff1f;这款 Windows 平台的格式工厂 FormatFactory v5.20 便携版 正是你的不二之选&#xff01;无需安装&#xff0c;即开即用&#xff0c;为你带来高效便捷的文件处理体验。 全能格式转换&#xff0c;满足多元需求 软件功能覆盖视频、…

[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)

主流大模型特色对比表 模型核心优势适用场景局限性DeepSeek- 数学/代码能力卓越&#xff08;GSM8K准确率82.3%&#xff09;1- 开源生态完善&#xff08;支持医疗/金融领域&#xff09;7- 成本极低&#xff08;API价格仅为ChatGPT的2%-3%&#xff09;5科研辅助、代码开发、数据…

国际荐酒师(香港)协会亮相新西兰葡萄酒巡展深度参与赵凤仪大师班

国际荐酒师&#xff08;香港&#xff09;协会率团亮相2025新西兰葡萄酒巡展 深度参与赵凤仪MW“百年百碧祺”大师班 广州/上海/青岛&#xff0c;2025年5月12-16日——国际荐酒师&#xff08;香港&#xff09;协会&#xff08;IRWA&#xff09;近日率专业代表团出席“纯净独特&…

Node.js Express 项目现代化打包部署全指南

Node.js Express 项目现代化打包部署全指南 一、项目准备阶段 1.1 依赖管理优化 # 生产依赖安装&#xff08;示例&#xff09; npm install express mongoose dotenv compression helmet# 开发依赖安装 npm install nodemon eslint types/node --save-dev1.2 环境变量配置 /…

java基础知识回顾3(可用于Java基础速通)考前,面试前均可用!

目录 一、基本算数运算符 二、自增自减运算符 三、赋值运算符 四、关系运算符 五、逻辑运算符 六、三元运算符 七、 运算符的优先级 八、小案例&#xff1a;在程序中接收用户通过键盘输入的数据 声明&#xff1a;本文章根据黑马程序员b站教学视频做的笔记&#xff0c;可…

随机密码生成器:原理、实现与应用(多语言实现)

在当今数字化的时代&#xff0c;信息安全至关重要。而密码作为保护个人和敏感信息的第一道防线&#xff0c;其安全性直接关系到我们的隐私和数据安全。然而&#xff0c;许多人在设置密码时往往使用简单、易猜的组合&#xff0c;如生日、电话号码或常见的单词&#xff0c;这使得…

TypeScript 泛型讲解

如果说 TypeScript 是一门对类型进行编程的语言&#xff0c;那么泛型就是这门语言里的&#xff08;函数&#xff09;参数。本章&#xff0c;我将会从多角度讲解 TypeScript 中无处不在的泛型&#xff0c;以及它在类型别名、对象类型、函数与 Class 中的使用方式。 一、泛型的核…

SQL 每日一题(6)

继续做题&#xff01; 原始表&#xff1a;employee_resignations表 employee_idresignation_date10012022-03-1510022022-11-2010032023-01-0510042023-07-1210052024-02-28 第一题&#xff1a; 查询累计到每个年度的离职人数 结果输出&#xff1a;年度、当年离职人数、累计…

工业RTOS生态重构:从PLC到“端 - 边 - 云”协同调度

一、引言 在当今数字化浪潮席卷全球的背景下&#xff0c;工业领域正经历着深刻变革。工业自动化作为制造业发展的基石&#xff0c;其技术架构的演进直接关系到生产效率、产品质量以及企业的市场竞争力。传统的PLC&#xff08;可编程逻辑控制器&#xff09;架构虽然在工业控制领…

从版本控制到协同开发:深度解析 Git、SVN 及现代工具链

前言&#xff1a;在当今软件开发的浪潮中&#xff0c;版本控制与协同开发无疑扮演着举足轻重的角色。从最初的单兵作战到如今大规模团队的高效协作&#xff0c;一套成熟且得力的版本控制系统以及围绕其构建的现代工具链&#xff0c;已然成为推动软件项目稳步前行的关键引擎。今…

Visual Studio Code插件离线安装指南:从市场获取并手动部署

Visual Studio Code插件离线安装指南&#xff1a;从市场获取并手动部署 一、场景背景二、操作步骤详解步骤1&#xff1a;访问官方插件市场步骤2&#xff1a;定位目标版本步骤3&#xff1a;提取关键参数步骤4&#xff1a;构造下载链接步骤5&#xff1a;下载与安装 三、注意事项 …

用HTML5实现实时ASCII艺术摄像头

用HTML5实现实时ASCII艺术摄像头 项目简介 这是一个将摄像头画面实时转换为ASCII字符艺术的Web应用&#xff0c;基于HTML5和原生JavaScript实现。通过本项目可以学习到&#xff1a; 浏览器摄像头API的使用Canvas图像处理技术实时视频流处理复杂DOM操作性能优化技巧 功能亮点…

论文审稿之我对SCI写作的思考

有幸被邀请审过二区、三区、四区期刊的论文&#xff0c;近期审稿10余篇&#xff0c;分享一下我从一个审稿人的角度出发&#xff0c;如何提升自己写作的质量。 作图高清和好看&#xff0c;永远是排第一位。图中的字要清晰&#xff0c;有的放大200%还看不清字&#xff1b;每幅图的…

MLA:Transformer的智能变形金刚——解密多头潜在注意力的进化密码

第一章 MLA的进化之路&#xff1a;从MHA到智能变形 1.1 变形金刚的诞生背景 当LLM模型规模突破万亿参数量级时&#xff0c;传统Transformer的注意力机制开始显现"成长的烦恼"&#xff1a;训练阶段计算密集、推理阶段内存吃紧。DeepSeek团队的MLA如同给注意力模块装…

电子电路:电学都有哪些核心概念?

电子是基本粒子,带负电荷。电荷是物质的一种属性,电子带有负电荷,而质子带有正电荷。电荷的单位是库仑。 电流呢,应该是指电荷的流动,单位是安培,也就是库仑每秒。所以电流其实就是电荷在导体中的移动形成的。比如,当电子在导线中流动时,就形成了电流。不过要注意,传…

第三次中医知识问答模型微调

本次参数 llamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path /home/qhyz/zxy/LLaMA-Factory/model \ --preprocessing_num_workers 16 \ --finetuning_type lora \ --template deepseek3 \ --flash_attn fa2 \ --dataset_dir data \ --dataset …

leetcode2081. k 镜像数字的和-hard

1 题目&#xff1a;k 镜像数字的和 官方标定难度&#xff1a;难 一个 k 镜像数字 指的是一个在十进制和 k 进制下从前往后读和从后往前读都一样的 没有前导 0 的 正 整数。 比方说&#xff0c;9 是一个 2 镜像数字。9 在十进制下为 9 &#xff0c;二进制下为 1001 &#xff…