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 模式来实现这种通信。

生产者(推送者)代码:

cpp 复制代码
#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;
}

消费者(拉取者)代码:

cpp 复制代码
#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 进行数据发布和订阅。

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

cpp 复制代码
#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;
}

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

cpp 复制代码
#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:适用于低延迟、高吞吐的局部通信,尤其适合进程间通信和小规模分布式系统。它提供了多种灵活的
相关推荐
真正的醒悟33 分钟前
H3C-W2000-G2【透明代理模式】
网络
科技小E1 小时前
仓储物流场景下国标GB28181视频平台EasyGBS视频实时监控系统应用解决方案
网络·人工智能
李少兄1 小时前
深入解析计算机网络核心协议:ARP、DHCP、DNS与HTTP
网络·计算机网络·http·软考
qq_243050791 小时前
Siege:开源的 HTTP/FTP 压力测试与基准评估工具!全参数详细教程!Kali Linux教程!
linux·网络·web安全·网络安全·黑客·压力测试·kali linux
芊言芊语1 小时前
端口 3389 服务 ms - wbt - server 漏洞修复方法
网络
鱼嘻2 小时前
四足机器人环境监测系统相关问题
linux·c语言·开发语言·网络·机器人
静思心远2 小时前
ubuntu2x.xx网络不通如何解决
网络·数据库·postgresql
码码哈哈0.02 小时前
功耗仅4W!迷你服务器黑豹X2(Panther X2)卡刷、线刷刷入Armbian(ubuntu)系统教程
服务器·网络·ubuntu
编程小能手@2 小时前
【计算机网络】IP 协议深度解析:从基础到实战
网络·tcp/ip·计算机网络
shangjg33 小时前
Java网络编程性能优化
java·网络·性能优化