当前位置: 首页 > news >正文

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

相关文章:

  • 论文阅读:arxiv 2024 SmoothLLM: Defending LLMs Against Jailbreaking Attacks
  • bun全栈开发尝鲜:用bun-react-template实现Markdown文章展示
  • OpenHarmony外设驱动使用 (十五),USB
  • 【C/C++】从零开始掌握Kafka
  • Linux 下VS Code 的使用
  • 从AD9361 到 ADSY1100 ,中间的迭代产品历史
  • 动态规划-蓝桥杯-健身
  • 大数据学习(118)-SQL面试问题总结
  • RAG系统构建之嵌入模型性能优化完整指南
  • QML学习07Property
  • vue+js 创造动态的光晕圈
  • 8:OpenCV—仿射变换和坐标映射
  • Linux的进程控制
  • 从工程实践角度分析H.264与H.265的技术差异
  • 如何将ChatGPT添加到WordPress(新手指南)
  • 大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • 华为OD机试真题—— 矩阵中非1的数量 (2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 顺丰社招入职SHL测评真题讲解| 3天备考、综合能力及性格问卷答题讲解
  • 打羽毛球tips
  • Bochs下去运行linux-0.11
  • 东莞网站建设公司注册/品牌设计公司
  • 网站推广意义/自己如何开网站
  • 佛山网站制作专家/seo是怎么优化
  • 流媒体网站建设规划 所需设备/网络推广平台软件app
  • 网站设计风格及色彩搭配技巧 -/腾讯广告投放平台官网
  • 毕业设计做旅游网站/黑帽seo什么意思