ZeroMQ C++: دليل شامل مع أمثلة عملية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ZeroMQ للغة C++: رسائل عالية الأداء

1. ما هي ZeroMQ ولماذا تحتاجها؟

ZeroMQ (تُعرف أيضًا باسم ØMQ أو 0MQ أو zmq) هي مكتبة غير متزامنة عالية الأداء لتبادل الرسائل، مصممة للاستخدام في التطبيقات الموزعة والمتوازية. على عكس وسطاء الرسائل التقليديين (مثل RabbitMQ أو Kafka)، لا تحتوي ZeroMQ على خادم مركزي. بدلاً من ذلك، توفر مآخذ توصيل (sockets) يمكنها الاتصال مباشرة ببعضها البعض، لتشكيل طبولوجيا عشوائية (نجمة، ناقل، عنقود، إلخ). تنفذ المكتبة أنماط تبادل مختلفة: "طلب-استجابة" (REQ/REP)، "ناشر-مشترك" (PUB/SUB)، "خط أنابيب" (PUSH/PULL) وغيرها.

لماذا تحتاج ZeroMQ؟ في عالم اليوم، نادرًا ما يعمل البرنامج بمعزل عن الآخرين. الخدمات المصغرة، الحوسبة الموزعة، أنظمة الوقت الفعلي، غرف الدردشة، منصات التداول المالي — كلها تتطلب تبادل بيانات سريع وموثوق بين المكونات. تحل ZeroMQ هذه المشكلة "مباشرة من الصندوق": فهي تتولى كل تعقيدات إدارة اتصالات الشبكة، التخزين المؤقت، إعادة المحاولة، وتجزئة الرسائل. على المطور فقط اختيار نمط التبادل المناسب واستدعاء بعض الدوال.

المزايا الرئيسية لـ ZeroMQ: سرعة مذهلة (المكتبة مكتوبة بلغة C++ وتستخدم خوارزميات فعالة)، استهلاك ضئيل للذاكرة، دعم لغات متعددة (بما في ذلك C++، Python، Java، C#، Go وغيرها)، بالإضافة إلى دعم مدمج للتشفير (عبر امتداد CurveZMQ) وأجهزة البروكسي.

2. التثبيت

بالنسبة للغة C++، لا يوجد مدير حزم موحد مثل pip للغة Python. ومع ذلك، يمكن تثبيت ZeroMQ بعدة طرق:

الطريقة 1: مدير الحزم للنظام (Linux/macOS)

# Ubuntu/Debian
sudo apt-get install libzmq3-dev

# Fedora/RHEL
sudo dnf install zeromq-devel

# macOS (Homebrew)
brew install zeromq

الطريقة 2: البناء من المصدر

قم بتنزيل أحدث إصدار من GitHub وقم ببنائه:

git clone https://github.com/zeromq/libzmq.git
cd libzmq
mkdir build && cd build
cmake ..
make -j4
sudo make install

الطريقة 3: vcpkg (Windows/Linux/macOS)

vcpkg install zeromq

بعد التثبيت، لا تنس تضمين ملف الرأس zmq.hpp (غلاف C++) والربط مع المكتبة libzmq (أو zmq.lib على Windows).

3. بداية سريعة — مثال عملي بسيط

أبسط مثال هو زوج "خادم-عميل" باستخدام نمط REQ/REP. يرسل العميل "Hello"، ويستجيب الخادم بـ "World".

الخادم (server.cpp)

#include <zmq.hpp>
#include <string>
#include <iostream>

int main() {
    // إنشاء سياق (واحد لكل عملية)
    zmq::context_t context(1);

    // إنشاء مأخذ توصيل من نوع REP (مستجيب)
    zmq::socket_t socket(context, zmq::socket_type::rep);
    socket.bind("tcp://*:5555");

    while (true) {
        zmq::message_t request;
        // انتظار طلب من العميل
        socket.recv(request, zmq::recv_flags::none);
        std::string msg(static_cast<char*>(request.data()), request.size());
        std::cout << "Received: " << msg << std::endl;

        // إرسال الرد
        zmq::message_t reply(5);
        memcpy(reply.data(), "World", 5);
        socket.send(reply, zmq::send_flags::none);
    }
    return 0;
}

العميل (client.cpp)

#include <zmq.hpp>
#include                    

توصيات