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:适用于低延迟、高吞吐的局部通信,尤其适合进程间通信和小规模分布式系统。它提供了多种灵活的
相关推荐
fulangxisikexi1 小时前
bgp笔记
服务器·网络·笔记
星哥说事2 小时前
腾讯云iOA:全面提升企业办公安全与效率的智能解决方案
网络·安全·腾讯云
武晓兵2 小时前
Ethernet, WiFi, Cellular, BLE, LoRa 分别解释
网络
哈基米喜欢哈哈哈3 小时前
Cookies和Sessions
网络·后端·计算机网络
wanhengidc4 小时前
云手机网速和本机网速的关系
网络·智能手机
猫头虎6 小时前
如何实现在多跳UDP传输场景,保证单文件和多文件完整传输的成功率?
java·开发语言·网络·python·网络协议·golang·udp
期待未来的男孩6 小时前
Cisco IOS Classic Firewall
网络·安全
丰锋ff7 小时前
计算机网络摘星题库800题笔记 第4章 网络层
网络·笔记·计算机网络
weixin_446260858 小时前
使用 NetBird 创建安全的私有网络,简化远程连接!
网络·安全
岚天start11 小时前
iptables -L 显示无目标链规则,但是iptables-save显示仍存在链规则原因分析
linux·服务器·网络·iptables·nat·filter·mangle