Kiến trúc hệ thống plugin cho TrafficMonitor trên Windows: Thiết kế và triển khai thực tế

TrafficMonitor — một công cụ mã nguồn mở giám sát hiệu suất hệ thống trên thanh tác vụ Windows — áp dụng mô hình kiến trúc plugin để tách biệt chức năng giám sát khỏi lõi ứng dụng. Mô hình này cho phép mở rộng linh hoạt mà không làm tăng độ phức tạp hay ảnh hưởng đến hiệu năng của phần mềm chính.

Nguyên lý thiết kế giao diện plugin

Hệ thống plugin dựa trên lớp trừu tượng C++ được định nghĩa trong PluginInterface.h. Hai giao diện cốt lõi đảm bảo tính tương thích và khả năng mở rộng:

class IMonitorElement {
public:
    virtual const wchar_t* GetName() const = 0;
    virtual const wchar_t* GetKey() const = 0;
    virtual const wchar_t* GetLabel() const = 0;
    virtual const wchar_t* GetValue() const = 0;
    virtual const wchar_t* GetSample() const = 0;
    virtual bool SupportsCustomRendering() const = 0;
    virtual int PreferredWidth() const = 0;
    virtual void Render(HDC hdc, int x, int y, int w, int h, bool isDark) = 0;
};

class IExtensionModule {
public:
    virtual IMonitorElement* GetElement(size_t idx) = 0;
    virtual const wchar_t* GetTooltip() = 0;
    virtual void FetchData() = 0;
    virtual DialogResult ShowConfigDialog(HWND parent) = 0;
    virtual const wchar_t* GetMetadata(ModuleInfoField field) = 0;
};

Ứng dụng chính không phụ thuộc vào cài đặt cụ thể của plugin, mà chỉ tham chiếu tới các interface trên thông qua hàm xuất TMPluginGetInstance(), giúp đạt được nguyên tắc đảo ngược phụ thuộc (Dependency Inversion).

Cơ chế tương tác thời gian chạy

  • Cập nhật dữ liệu định kỳ: Gọi FetchData() theo chu kỳ cấu hình (mặc định 1–5 giây)
  • Tách biệt xử lý dữ liệu và hiển thị: Giá trị văn bản do GetValue() trả về; giao diện tùy chỉnh được vẽ bởi Render()
  • Quản lý cấu hình riêng: Mỗi plugin cung cấp hộp thoại tùy chọn độc lập thông qua ShowConfigDialog()
  • An toàn đa luồng: Plugin chịu trách nhiệm đồng bộ hóa truy cập dữ liệu chia sẻ giữa luồng nền và luồng UI

Cấu trúc dự án và quy trình xây dựng

Dự án plugin tuân thủ chuẩn phát triển DLL Windows với tổ chức thư mục rõ ràng:

traffic-monitor-plugins/
├── include/
│   └── PluginInterface.h
├── libs/
│   ├── JsonParser.cpp     # Phân tích JSON nhẹ
│   └── ConfigManager.cpp  # Đọc/ghi cấu hình INI
└── src/
    ├── MarketTicker/      # Plugin giá chứng khoán
    ├── SysHealth/         # Plugin sức khỏe phần cứng
    └── SampleExtension/   # Mẫu khởi tạo plugin

Mỗi plugin phải:

  • Liên kết với libs/ và bao gồm PluginInterface.h
  • Sử dụng Unicode và thư viện runtime tĩnh (/MT)
  • Xuất hàm TMPluginGetInstance() kiểu extern "C"
  • Nhúng tài nguyên (biểu tượng, chuỗi) vào section tài nguyên của DLL

Ví dụ: Plugin giám sát thị trường chứng khoán

Plugin MarketTicker minh họa cách tích hợp nhiều nguồn dữ liệu thời gian thực:

class MarketTicker final : public IExtensionModule {
private:
    std::vector<StockQuote> quotes_;
    mutable std::shared_mutex data_lock_;
    std::chrono::steady_clock::time_point last_fetch_;

public:
    void FetchData() override {
        if (shouldSkipUpdate()) return;
        auto raw = fetchFromApi(); // Gọi API không chặn UI
        std::unique_lock lock(data_lock_);
        parseAndStore(raw);
    }

    IMonitorElement* GetElement(size_t i) override {
        return i < quotes_.size() ? &quotes_[i] : nullptr;
    }
};

Hỗ trợ đa thị trường với chiến lược cập nhật thông minh:

Mã thị trường Nguồn dữ liệu Tần suất (giao dịch) Tần suất (nghỉ)
sh / sz Sina Finance API 30s 5 phút
hkex Tencent Finance API 30s 3 phút
nasdaq Alpha Vantage REST 60s 10 phút

Ví dụ: Plugin giám sát phần cứng

Plugin SysHealth sử dụng thư viện LibreHardwareMonitor để thu thập chỉ số phần cứng. Các chỉ số được đăng ký động:

void SysHealth::RegisterSensors() {
    AddSensor(L"Nhiệt độ CPU", L"cpu-temp", []{ return readCpuTemp(); });
    AddSensor(L"Tải GPU", L"gpu-load", []{ return readGpuLoad(); });
    AddSensor(L"Dung lượng RAM", L"ram-used", []{ return readRamUsage(); });
}

Các tối ưu hiệu năng:

  • Đọc đồng loạt nhiều cảm biến trong một lần gọi thư viện
  • Điều chỉnh tần suất lấy mẫu theo loại thiết bị (ví dụ: nhiệt độ mỗi 2s, điện áp mỗi 10s)
  • Tự động vô hiệu hóa cảm biến không khả dụng mà không gây crash

Triển khai và quản lý plugin

Plugin được đặt trong thư mục con plugins/ cùng cấp với TrafficMonitor.exe. Khi khởi động, ứng dụng quét và tải tất cả DLL hợp lệ. Thứ tự hiển thị được điều khiển bằng thuộc tính PRIORITY trong metadata.

Cấu hình plugin được lưu dưới dạng file INI trong thư mục plugins/config/:

// plugins/config/market.ini
[General]
RefreshInterval=30
AutoStart=true

[Markets]
Active=sh,sz,nasdaq
sh.SymbolList=600519,000858
nasdaq.SymbolList=AAPL,MSFT

Chẩn đoán và tối ưu hiệu năng

Các kỹ thuật hỗ trợ phát triển:

  • Gắn debugger Visual Studio vào tiến trình TrafficMonitor.exe để debug plugin
  • Sử dụng OutputDebugStringW() để ghi log vào DebugView
  • Phân tích hiệu năng bằng Windows Performance Analyzer (WPA) với trace ETW
  • Thiết lập logging chi tiết qua tham số dòng lệnh: --log-level=debug --log-file=plugin.log

Các tối ưu đã áp dụng:

Yếu tố Giải pháp Kết quả đo
Bộ nhớ lúc khởi động Tải tài nguyên theo nhu cầu (lazy load) Giảm 28% RAM footprint
CPU lúc nhàn rỗi Điều chỉnh tần suất cập nhật theo trạng thái hệ thống Giảm 65% CPU usage
Băng thông mạng Nén phản hồi JSON + cache cục bộ có TTL Giảm 47% traffic

Thẻ: TrafficMonitor Windows C++ plugin-architecture system-monitoring

Đăng vào ngày 20 tháng 6 lúc 08:12