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的对比
特性 | NNG | DDS |
---|---|---|
通信模型 | 点对点、发布-订阅、请求-响应等 | 发布-订阅 |
可靠性 | 基本可靠,依赖于消息传输机制 | 高度可靠,支持 QoS 策略 |
实时性 | 低延迟,高吞吐 | 高实时性,严格的 QoS 支持 |
拓扑 | 点对点、星型、网状结构等 | 去中心化,支持大规模分布式系统 |
应用场景 | 实时通信、高频交易、嵌入式系统 | 分布式仿真、物联网、自动驾驶等 |
扩展性 | 较弱,适合小到中型系统 | 强,支持大规模分布式系统 |
总结
- NNG:适用于低延迟、高吞吐的局部通信,尤其适合进程间通信和小规模分布式系统。它提供了多种灵活的
相关文章:
NNG和DDS
NNG (Nanomsg Next Generation) 和 DDS (Data Distribution Service) 是两种不同的通信协议,各自在不同场景下具有其优势。下面我将对这两种技术进行详细解释,并通过具体的例子来说明它们如何应用在实际场景中。 1. NNG (Nanomsg Next Generation) NNG简…...

防震基座在半导体晶圆制造设备抛光机详细应用案例-江苏泊苏系统集成有限公司
在半导体制造领域,晶圆抛光作为关键工序,对设备稳定性要求近乎苛刻。哪怕极其细微的振动,都可能对晶圆表面质量产生严重影响,进而左右芯片制造的成败。以下为您呈现一个防震基座在半导体晶圆制造设备抛光机上的经典应用案例。 企…...
框架开发与原生开发的权衡:React案例分析(原生JavaScript)
文章目录 框架开发与原生开发的权衡:React案例分析引言框架开发的优势开发效率提升状态管理的便捷性组件复用与生态系统团队协作与规范统一 原生开发的优势性能优化空间学习曲线平缓精细控制与定制化避免版本依赖与迁移成本 实际应用案例分析大型企业应用性能关键型…...

Lua5.4.2常用API整理记录
一、基础函数 1.type(value) 返回值的类型(如 "nil", "number", "string", "table", "function" 等)。 代码测试: a 0 print(type(a)) a nil print(type(a)) a "aaaaaaaa&…...

Python打卡训练营学习记录Day36
仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。 作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。 import pandas as pd #用于数据处理和分析,可处理表格数…...
### Mac电脑推送文件至Gitee仓库步骤详解
**核心流程及命令说明:** #### 1. **配置全局Git用户信息** bash git config --global user.name "shenguanling" git config --global user.email "3259125968qq.com" - **作用**:设置提交代码时的作者信息࿰…...
官方SDK停更后的选择:开源维护的Bugly Unity SDK
腾讯Bugly,为移动开发者提供专业的异常上报和运营统计,帮助开发者快速发现并解决异常,同时掌握产品运营动态,及时跟进用户反馈。 但是,免费版的Unity SDK已经很久不更新了,会有一些问题和特性缺失ÿ…...

什么是智能体agent?
文章目录 什么是智能体agent?最基本的核心思想我们是如何走到今天以及为什么是现在如何从思维上剖析“一个智能体系统”痛苦的教训结论 什么是智能体agent? 原文链接:https://windsurf.com/blog/what-is-an-agent 本文探讨了AI智能体的核心概…...
【多线程】Java 实现方式及其优缺点
以下是 Java 多线程实现方式及其优缺点的详细说明: 一、Java 多线程核心实现方式 1. 继承 Thread 类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("Thread running: " Thread.currentThread().getName());}…...

Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统
Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统 一、核心架构解析 本系统基于 Obsidian 的 DataviewJS 和 Charts 插件,实现日报数据的自动采集、可视化分析及智能回溯功能(系统架构原理见)。其技术…...
Three.js 海量模型加载性能优化指南
一、性能瓶颈分析 1.1 常见性能杀手 问题类型典型表现影响范围Draw Call 爆炸每帧渲染调用超过1000次GPU 渲染性能内存占用过高浏览器进程内存突破1GB加载速度/崩溃风险模型文件过大单个GLB文件超过50MB网络传输时间几何数据冗余重复模型独立加载CPU/GPU资源浪费 1.2 性能监…...

6.4.3_有向无环图描述表达式
有向无环图: 有向图中不存在环即为有向无环图DAG图,即如下V0->V4->v3->V0或者V4->V1->v4就存在环不是有向无环图,即在一个路径中一个顶点不能出现2次? DAG描述表达式: 算术表达式用树来表示࿰…...
力扣第157场双周赛
1. 最大质数子字符串之和 给定一个字符串 s,找出可以由其 子字符串 组成的 3个最大的不同质数 的和。 返回这些质数的 总和 ,如果少于 3 个不同的质数,则返回 所有 不同质数的和。 质数是大于 1 且只有两个因数的自然数:1和它本身…...
青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布
青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布 一、准备工作1. 创建和配置项目2. 编写代码和测试3. 文档注释 二、构建发布版本1. 构建优化后的可执行文件2. 静态链接(可选) 三、发布到 crates.io1. Crates.io核心功能使用方法特点最新动态 2…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...
LLaMA-Factory 微调模型与训练数据量对应关系
在使用LLaMA-Factory的LoRA技术微调1.5B和7B模型时,数据量需求主要取决于任务类型、数据质量以及模型规模。以下是基于现有研究和实践的具体分析: 一、数据量需求的核心影响因素 模型规模与数据量的关系 通常情况下,模型参数越多(…...
数据库与Redis数据一致性解决方案
在写数据时保证 Redis 和数据库数据一致,可采用以下方案,需根据业务场景权衡选择: 1. 先更新数据库,再更新 Redis 步骤: 写入 / 更新数据库数据。删除或更新 Redis 缓存。适用场景:读多写少,对缓存一致性要求不高(短暂不一致可接受)。风险:若第二步失败,导致缓存与…...

Spring Boot AI 之 Chat Client API 使用大全
ChatClient提供了一套流畅的API用于与AI模型交互,同时支持同步和流式两种编程模型。 流畅API包含构建Prompt组成元素的方法,这些Prompt将作为输入传递给AI模型。从API角度来看,Prompt由一系列消息组成,其中包含指导AI模型输出和行为的指令文本。 AI模型主要处理两类消息: …...

分身空间:手机分身多开工具,轻松实现多账号登录
分身空间是一款功能强大的手机分身多开工具APP,专为需要同时登录多个账号的用户设计。它支持多开各种游戏和软件,让用户可以轻松实现多账号同时在线,提升使用效率和体验。无论是社交软件、游戏还是办公应用,分身空间都能帮助你轻松…...

音视频之视频压缩及数字视频基础概念
系列文章: 1、音视频之视频压缩技术及数字视频综述 一、视频压缩编码技术综述: 1、信息化与视频通信: 什么是信息: 众所周知,人类社会的三大支柱是物质、能量和信息。具体而言,农业现代化的支柱是物质&…...

Ubuntu 24.04部署安装Honeyd蜜罐
🌴 前言 最近有个大作业,里面要求我们部署Hoenyd蜜罐,在网上搜了一通,发现相关的教程竟然少的可怜,即使有比较详细的教程,也是好几年前的了,跟着做一遍报一堆错,无奈之下࿰…...
C++复习核心精华
一、内存管理与智能指针 内存管理是C区别于其他高级语言的关键特性,掌握好它就掌握了C的灵魂。 1. 原始指针与内存泄漏 先来看看传统C的内存管理方式: void oldWay() {int* p new int(42); // 分配内存// 如果这里发生异常或提前return,…...
Android中获取控件尺寸进阶方案
在Android开发中,很多场景都需要获取控件(View)的宽高信息,比如动态布局调整、动画效果实现等。然而,直接在Activity的onCreate()中调用控件的getWidth()或getHeight()`方法,得到结果却是0,因为控件还没完成布局测量。 本文总结了几种获取控件大小的实用方法,并对各方…...
云原生安全之PaaS:从基础到实践的技术指南
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 云原生安全之PaaS:从基础到实践的技术指南 一、基础概念 PaaS(Platform as a Service)平台 PaaS是一种云计算服务模型…...

MCP技术体系介绍
MCP,全称时Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于2014年11月正式提出。 MCP的核心作用是统一了Agent开发过程中大模型调用外部工具的技术实现流程,从而大幅提高Agent的开发效率。在MCP诞生之前,不同外部工具各有不同的调用方法。 要连接这些…...
《深入探秘:从底层搭建Python微服务之FastAPI与Docker部署》
FastAPI作为一款现代、快速的Web框架,在Python微服务开发领域独树一帜。它基于Python 3.6的类型提示功能,融合了Starlette和Pydantic的优势,具备诸多令人瞩目的特性。 FastAPI的性能表现十分卓越,可与Go和Node.js相媲美。这得益于…...
深入解析Spring Boot与JUnit 5集成测试的最佳实践
深入解析Spring Boot与JUnit 5集成测试的最佳实践 引言 在现代软件开发中,单元测试和集成测试是确保代码质量的重要手段。Spring Boot作为当前最流行的Java Web框架之一,提供了丰富的测试支持。而JUnit 5作为最新的JUnit版本,引入了许多新特…...

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南
我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南 一、创建隔离开发环境 1. 使用虚拟环境(推荐venv) # 在项目目录打开终端执行 python -m venv douban_env # 创建虚拟环境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…...

Selenium 测试框架 - C#
🚀Selenium C# 自动化测试实战:以百度搜索为例 本文将通过一个简单示例,手把手教你如何使用 Selenium + C# 实现百度搜索自动化测试。适合初学者快速上手,也适合作为企业 UI 自动化测试模板参考。 🧩 一、安装必要 NuGet 包 在 Visual Studio 的 NuGet 管理器中安装以下…...

JavaWeb:SpringBoot工作原理详解
一、SpringBoot优点 1.为所有Spring开发者更快的入门 2.开箱即用,提供各种默认配置来简化项目配置 3.内嵌式容器简化Web项目 4.没有冗余代码生成和XML配置的要求 二、SpringBoot 运行原理 2.1. pom.xml spring-boot-dependencies: 核心依赖在父工程中;…...