C++_中介軟體kafka-回撥函式

辰令發表於2024-10-15

Ubuntu

命令列: gnome-system-monitor
 會出現如下類似於windows中工作管理員的系統監視器
 gnome-session-properties 是ubuntu的開機啟動項管理器 
 gnome-terminal

Linux下視窗狀態檢可以透過X11的庫來進行獲取

命令列的方式獲取視窗屬性
   xwininfo 命令根據視窗的ID獲取對應的視窗尺寸資訊	
   
   xdotool 是一個用於模擬鍵盤、滑鼠和其他輸入裝置動作的工具,常用於自動化任務和測試環境 
   wmctrl
   
   sudo apt-get install  wmctrl

Linux 彈窗

 notify-send ["該休息一下啦"] "喝水!伸懶腰!動一動!"	
 cron命令實現定時彈窗
 zenity 和notify-send實現	
    zenity 命令用於顯示圖形視窗	 Zenity是一個Linux下的命令列工具,
	它可以生成Gtk+圖形使用者介面(GUI)對話方塊,支援多種視窗型別和選項 
	whiptail 是一個基於ncurses的工具,它可以幫助我們在終端中建立各種對話方塊
	
調整終端視窗的字型大小
    "ctrl + shift + ="  放大終端視窗的字型
    "ctrl + -"    縮小終端視窗的字型
	
視窗ID 程序ID		

檔案

終端檔案型別的區分標識
檔案描述符file descriptor(簡稱fd)
     開啟檔案的本質,就是將檔案載入到記憶體

使用者ID 使用者組ID

有效使用者 歷史使用者
  虛擬使用者和虛擬組
  超級使用者-系統使用者-普通使用者-終端使用者
  使用者態和核心態是兩種主要的執行模式,它們代表了不同的訪問級別和許可權,用於確保系統的安全和穩定性
  使用者配置檔案 和許可權
  
身份認證系統————ACL Acess Control List getfacl setfacl
PAM Pluggable  authenticat Modules

執行緒-程序-程序組-會話

thread ID、process ID、process group ID  session ID	
執行緒ID
   tid
程序ID	
	 pid、pid number、pid namespace
程序組ID 
     setpgid、getpgid、
	 setpgrp和getpgrp 
	 getsid、setsid
	  執行緒才是是排程器的基本單位 
  pid namespace
  會話ID
   sid
父程序-子程序-leaf root parent
核心態: 核心,我們需要使用(pid namespace,ID number)這樣的二元組來表示

現實名稱跟理論名稱是能一一對應起來的.

主機IP和埠號

防火牆
AppArmor,也稱為應用盔甲(Application Armor),是一個 Linux 核心安全模組
   systemctl status apparmor
   sudo apparmor_status
   aa-status 命令
SElinux  Security Enhanced Linux
  網路-程序-檔案訪問資源	 sudo apparmor_status
  
  
logrotate logchek

Bash內建兩個補全命令,分別是compgen和complete。compgen命令根據不同的引數,生成匹配單詞的候選補全列表

Kubernates

環境:
  Master:
     負責整個叢集的管理和控制
	 kube-apiserver
	 kube-controller-mamager
	 kube-scheduler
	 etcd
  Node
     kubelet: 向Master註冊自己,並定期彙報自身情況,依賴於docker服務
	 kube-proxy: 依賴於network服務
	 Container runtime:docker 或者Containerd
 Master和Node有大量的網路通訊
 跨主機的容器網路:CNI網路外掛
 安全設定: 基於CA簽名的雙向數字證書認證方式 和基於Token的認證方式
 合規性測試(K8s-Conformance) 主要是透過一系列自動化測試指令碼和工具來進行驗證的
 透過java操作k8s kubernetes-client/java

功能

kube-scheduler: assigns each Pod to a suitable node	 

服務

services
pod
Replication Controller	

使用者

 .yaml 格式.
kubectl command-line interface,	 

1.31.1 (released: 2024-09-11)
1.30.5 (released: 2024-09-10)
1.29.9 (released: 2024-09-10)
1.28.14 (released: 2024-09-10)

rospy 是Python版本的ROS客戶端庫

cyber RT中python API

實現程式碼主要分為5大類的呼叫,
    cyber、
    parameter、
    record、
    cyber_time、
    cyber_timer,
cyber/python
   cyber_py3 資料夾:python使用cyber通訊的底層類和示例檔案
   internal 資料夾:C++實現用以和pyton通訊的底層類

具體過程

cyber/python/internal
    py_cyber.h
    py_cyber.cc
    //編譯命令:g++ py_cyber.cc -fPIC -shared -o _cyber_wrapper.so -I /usr/include/python3.6m
    // 將c++生成so供python呼叫,使用objdump -tT _cyber_wrapper.so或者nm -D _cyber_wrapper.so命令可以看到so的匯出函式
cyber/python/cyber_py3
  cyber.py
     _CYBER = importlib.import_module('_cyber_wrapper')
	 
呼叫

準備環境。
1.1 在客戶端環境安裝 Pulsar C++ client,安裝過程可參考官方教程 Pulsar C++ client。
1.2 在專案中引入 Pulsar C++ client 相關標頭檔案及動態庫

1.Kafka基本內容
01.生產者: 同步傳送 非同步傳送 非同步傳送回撥

 02.producer topic
    KAFKA_BROKER_ID  bootstrap_servers

2.Kafka cmd/WebUI
01.docker安裝 : docker run -d --name kafka -p 9092:9092 apache/kafka:3.7.0
本機通訊和外部訪問設定
vim /docker-data/kafka-data/server.properties
# 把 IP 配置成 0.0.0.0 listeners 指明 kafka 當前節點監聽本機的哪個網路卡
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 我們要透過 linux 訪問 docker 容器中的 kafka 所以把 IP 配置成 linux 的 IP
## advertised.listeners 這個引數為我們伺服器的地址,否則我們透過python是無法向kafka生產訊息
advertised.listeners=PLAINTEXT://自己的 IP:9092
02.web UI
需要安裝KafkaManager
03.Command line
docker exec -it kafka /bin/bash
## 查詢所有Topic列表
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
/opt/kafka/bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
/opt/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --partitions 0 --topic localKafka

     /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic localKafka --from-beginning

3.Kafka Client 程式設計

Python 版本

from kafka import KafkaProducer,KafkaConsumer
from kafka.structs import TopicPartition
    bootstap_servers

C++版本

 librdkafka src是用c實現的原始碼,而src-cpp是在c介面上包裝的一層c++類,實現了基本的功能
    必要的引數配置(bootstrap.servers)

RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
conf->set("metadata.broker.list", brokers, errstr);

RdKafka::Producer *producer = RdKafka::Producer::create(conf, errstr);

 Kafka Conf物件、Topic Conf物件、設定Broker屬性、Producer、Topic物件等

 librdkafka 提供的 非同步的生產介面,非同步的消費介面和同步的消費介面,沒有同步的生產介面
 
 RdKafka::Conf      RdKafka::Metadata
 RdKafka::Producer  RdKafka::Topic  RdKafka::TopicPartition
 RdKafka::Message   RdKafka::Event
 RdKafka::ErrorCode
 RdKafka::EventCb     RdKafka::DeliveryReportCb
 RdKafka::RebalanceCb RdKafka::PartitionerCb  
 
  定義一個 DeliveryReportCb 回撥函式來處理訊息的傳送報告。
     這個回撥函式會在訊息成功傳送到Kafka broker或者傳送失敗時被呼叫。
 
   註冊rebalance_cb回撥函式會關閉rdkafka的自動分割槽賦值和再分配並替換應用程式的rebalance_cb回撥函式
   Consumer 需要向 Kafka 彙報自己的位移資料,這個彙報過程被稱為提交位移(Committing Offsets)
     enable.auto.commit (bool)	如果為True,將自動定時提交消費者offset。預設為True
	 auto.commit.interval.ms(int)	自動提交offset之間的間隔毫秒數。如果enable_auto_commit為true,預設值為 5000。
 
 觸發brokerlist更新
    分割槽機制:Partition機制
	Range# 特點 確保每個消費者消費的分割槽數量是均衡的。
	partition.assignment.strategy,修改分割槽的分配策略
 Event 事件是從RdKafka傳遞錯誤、統計資訊、日誌等訊息到應用程式的通用介面
     class ConsumerEventCb : public RdKafka::EventCb

其他

C語言中的多執行緒程式設計:POSIX執行緒庫(Pthreads)
   Pthreads為C/C++等基於Unix/Linux系統的程式語言提供了統一、跨平臺的執行緒建立、同步、互斥、排程等介面
 執行緒(Thread)
   POSIX threads 也稱作為Pthreads,
     一個單程序可以包含多個執行緒,多個執行緒共享同樣的全域性記憶體包括全域性變數和堆段,但是每個執行緒有自己的棧存放一些區域性變數
  #include "rdkafka.h" #include "rdkafkacpp.h"
  
 pure virtual abstract classes.  
 純虛類:抽象類abstract class是指至少有一個純虛擬函式的類,如果一個類全部由純虛擬函式組成,不包括任何的實現,被稱為純虛類


 純虛擬函式是一種沒有實現體的虛擬函式,它在基類中宣告,並且至少包含一個純虛擬函式的類被稱為抽象類 
 C++的虛擬函式可以在子類中重寫,呼叫是根據實際的物件來判別的,而不是透過指標型別(普通函式的呼叫是根據當前指標型別來判斷的)

回撥函式

1.回撥函式機制:CallBack
   1、定義一個函式(普通函式即可); --#->定義回撥函式
   2、將此函式的地址註冊給呼叫者;   --#->設定回撥 -註冊回撥函式 
   3、特定的事件或條件發生時,呼叫者使用函式指標呼叫回撥函式。 --#-> 回撥處理
2.函式指標
  是指一個變數,函式物件建立後就會分配一個地址,這個地址可以透過變數進行儲存。
  這個變數就叫做函式地址變數,也可以稱之為函式指標

參考

 C++實現kafka的生產者客戶端 https://zhuanlan.zhihu.com/p/614462015	
 docker安裝kafka叢集 https://www.cnblogs.com/aaalei/p/17530193.html
 docker啟動kafka並掛載配置檔案,並讓外部環境連線kafka https://blog.csdn.net/q2570558854/article/details/141687742
 簡單聊聊C++中回撥函式的實現 https://www.jb51.net/article/235073.htm

相關文章