C++ में माइक्रोसर्विसेज़: आर्किटेक्चर और प्रैक्टिस A से Z तक
माइक्रोसर्विस आर्किटेक्चर लंबे समय से स्केलेबल और फॉल्ट-टॉलरेंट सिस्टम बनाने का मानक बन गया है। हालांकि, इंटरनेट पर अधिकांश उदाहरण Java, Go या Python में लिखे गए हैं। लेकिन क्या करें जब आपको अधिकतम प्रदर्शन और संसाधनों पर नियंत्रण चाहिए? इसका उत्तर है — C++ में माइक्रोसर्विसेज़। इस लेख में हम आर्किटेक्चर, प्रमुख तकनीकों को समझेंगे और C++ में एक वास्तविक माइक्रोसर्विस का उदाहरण लिखेंगे।
माइक्रोसर्विसेज़ के लिए C++ क्यों?
C++ पारंपरिक रूप से सिस्टम प्रोग्रामिंग, गेम्स और एम्बेडेड डेवलपमेंट से जुड़ा है। हालांकि, माइक्रोसर्विसेज़ के लिए इसके लाभ स्पष्ट हैं:
- अधिकतम प्रदर्शन — मेमोरी और प्रोसेसर पर न्यूनतम ओवरहेड।
- संसाधनों पर सटीक नियंत्रण — मैन्युअल मेमोरी प्रबंधन (या आधुनिक स्मार्ट पॉइंटर्स)।
- कम विलंबता — high-frequency trading, गेम सर्वर और IoT के लिए आदर्श।
- लाइब्रेरीज़ का समृद्ध चयन — Boost से लेकर gRPC और Poco तक।
नुकसान भी हैं: विकास की जटिलता, धीमी कंपाइलेशन और "त्वरित" प्रोटोटाइप का अभाव। लेकिन सही दृष्टिकोण के साथ, C++ माइक्रोसर्विसेज़ के लिए एक शक्तिशाली उपकरण बन जाता है।
C++ में माइक्रोसर्विस का आर्किटेक्चर
C++ में एक सामान्य माइक्रोसर्विस निम्नलिखित परतों से बना होता है:
- Transport layer — HTTP/REST (cpprestsdk), gRPC, WebSocket या TCP/UDP।
- Business logic — शुद्ध C++17/20, डेटा प्रोसेसिंग, एल्गोरिदम।
- Data layer — डेटाबेस के साथ काम (PostgreSQL libpqxx के माध्यम से, Redis hiredis के माध्यम से)।
- Communication — अंतर-सर्विस संचार (gRPC, RabbitMQ, Kafka)।
इन परतों को अलग करना महत्वपूर्ण है ताकि प्रत्येक माइक्रोसर्विस स्वतंत्र हो और आसानी से परीक्षण योग्य हो।
व्यावहारिक उदाहरण: C++ में REST API माइक्रोसर्विस
हम cpprestsdk (Casablanca) लाइब्रेरी का उपयोग करके कार्य प्रबंधन (Task Manager) के लिए एक सरल माइक्रोसर्विस लिखेंगे।
1. डिपेंडेंसीज़ इंस्टॉल करना
Ubuntu/Debian के लिए:
sudo apt-get install libcpprest-dev libboost-all-dev libssl-dev2. माइक्रोसर्विस का कोड
फ़ाइल task_service.cpp बनाएं:
#include <cpprest/http_listener.h>#include <cpprest/json.h>#include <iostream>#include <map>#include <mutex>
using namespace web;using namespace web::http;using namespace web::http::experimental::listener;
class TaskService {private: std::map<int, std::string> tasks; std::mutex mtx; int next_id = 1;
void handle_get(http_request request) { json::value response; std::lock_guard<std::mutex> lock(mtx); for (const auto& [id, desc] : tasks) { response[std::to_string(id)] = json::value::string(desc); } request.reply(status_codes::OK, response); }
void handle_post(http_request request) { request.extract_json().then([this, &request](json::value body) { std::lock_guard<std::mutex> lock(mtx); int id = next_id++; tasks[id] = body.at("description").as_string(); json::value response; response["id"] = id; request.reply(status_codes::Created, response); }).wait(); }
public: TaskService() { uri_builder uri("http://localhost:8080"); auto addr = uri.to_uri().to_string(); http_listener listener(addr);
listener.support(methods::GET, std::bind(&TaskService::handle_get, this, std::placeholders::_1)); listener.support(methods::POST, std::bind(&TaskService::handle_post, this, std::placeholders::_1));
listener.open().then([&addr]() { std::c