12.X MOM編程框架 IDL Protobuf(Message Oriented Middleware)

12.X MOM編程框架

目錄

1.MOM架構 2.MOM server 3.MOM框架 4.DS 5.總結

什麼是MOM

MOM(Message Oritend Middleware) 是面向消息的中間件,使用消息傳送提供者來協調消息傳送操作。MOM需要提供API和管理工具。客戶端使用api調用,把消息發送到由提供者管理的目的地。在發送消息之後,客戶端會繼續執行其他工作,並且在接受方收到這個確認消息之前,提供者一直保留該消息。

**什麼叫面向消息的中間件:**由於業務、機構和技術是不斷變化的,因此爲其服務的軟件系統必須適應這樣的變化。在合併、添加服務或擴展可用服務之後,公司可能無力負擔重新創建信息系統所需的成本。正是在這個關鍵時刻,才需要集成新組件或者儘可能高效地擴展現有組件。要集成異類組件,最方便的方法不是將它們重新創建爲同類元素,而是提供一個允許它們進行通信(不考慮它們之間的差異)的層。該層被稱作中間件,它允許獨立開發且運行於不同網絡平臺上的軟件組件(應用程序、Enterprise Java Bean、Servlet 和其他組件)彼此交互。當能夠進行這樣的交互時,網絡才成爲計算機

12. X MOM使用方式

11.x架構進程間c/s通信改造爲p/s通信,組件只需和MOM通信
接口服務改造爲數據服務,引入IDL爲數據建模
以數據爲中心,組件之前的通信抽象爲對數據的CRUD
基於事件驅動下的單線程無鎖化編程模型
在這裏插入圖片描述
MOM組成
MOM分爲3個組件,
MOM server(redis),MOM client公共庫,rgmomd管理進程
其中,框架使用者只需要瞭解server和client公共庫即可
在這裏插入圖片描述

發佈訂閱模型

業界成熟方案—MOM(Message-Oriented Middleware)消息中間件來實現發佈訂閱模型。MOM作爲多個進程間消息的中間人。進程只和MOM通信,MOM對各個進程的消息進行接收,並分發給關注該消息的進程。
在這裏插入圖片描述

事件驅動模型

利用I/O多路複用,將fd的I/O讀寫抽象爲每個事件/平時進程處於休眠階段,事件到來時,喚醒進程,並調用對應處理函數。
在這裏插入圖片描述

REDIS相關知識

什麼是redis?
Redis是使用C語言編寫,可基於內存,也可持久化的key-value數據庫。

Redis數據類型

String數據類型
redis /tmp/redis/redis_host.sock> set k1 v1
OK
redis /tmp/redis/redis_host.sock> get k1
“v1”

String數據類型在redis中通過hash表存儲,key爲索引值,value爲在存儲的具體數據
命令格式爲set

Hash數據類型
redis /tmp/redis/redis_host.sock> hest hashk1 f1 v1 f2 v2
(integer) 2
redis /tmp/redis/redis_host.sock> HGETALL hashk1
1)“f1”
2)“v1”
3)“f2”
4)“v2”
redis /tmp/redis/redis_host.sock> hget hashk1 f1 “v1”
redus /tmp/redis/redis_host.sock>

Hash數據類型命令格式爲:hset …
Redis中,獲取hash數據類型要經過兩層hash才能獲取對應value,性能比string類型慢。

Redis常用操作命令

前面提到的set/hset,爲操作命令,對應CRUD的C。注意:set/hset相同key會覆蓋之前的值。同時清楚老化。除此之外,還有:
Subscribe
Publish
Hmupdate […。]更新hash的多個field(注意不清楚key級別的老化)
Pexpire
Del
Scanplus count match 批量查詢
batchpexpirekey cursor count dbid match time 批量老化匹配pattern的key
batchpexpirekeydel cursor count dbid match type 批量刪除匹配pattern且帶老化標誌的key

monitor監控數據庫行爲

1、進入對應redis-server的cli界面,輸入monitor*,可以監控業務app對數據庫的所有操作。
命令格式爲:monitor

2、數據庫監控日誌輸出文件
使用場景:cli無法阻塞或者設備重啓過程,無法進入cli的情況。
修改配置文件:
monitors-log yes(開啓)
monitors-pattern <key-pattern/client-pattern>

MOM Client結構

MOM Client涉及的模塊包括僞線程,protobuf(IDL),和MOM API.
框架使用者主要了解IDL的編寫、使用和MOM API的具體含義,僞線程部分簡單瞭解原理即可。

在這裏插入圖片描述

什麼是IDL

接口描述語言(Interface description language,縮寫IDL),是用來描述軟件組件界面的一種計算機語言

IDL通過一種中立的方式描述接口,使得在不同平臺上運行的對象和用不同語言編寫的程序可以相互通信交流;比如,一個組件使用C++寫成,另一個組件用java寫成。IDL剝離了編程語言和硬件的依賴性。IDL建立起了兩個不同操作系統間不同語言之間通信的橋樑。

IDL通常會提供一套通用的數據類型,並以這些數據類型來定義更爲複雜的數據類型。

Google Protobuf

Google Protobuf Buffer(簡稱Protobuf)是Google公司內部的混合語言數據標準,目前已經正在使用的有超過48,162種報文格式定義和超過12,183個.proto文件。

Protocol Buffers是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或PRC數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。官方目前提供了 C++、Java 、Python、Go、Ruby、Objective-C、C、JavaScript 多種語言的 API。

protobuf類型映射表

在這裏插入圖片描述

proto舉例

在這裏插入圖片描述

proto和mom的關係

Proto文件中的一個message定義完畢,就對應表義redis中的某一數據結構的表項
Redis中的key由message中的index字段來表義,value由除了Index字段以外其他字段表義。

Key規則

目前的MOM基於redis實現,redis中的key稱爲索引
索引由message中的index字段生成
Index必須是一個message類型
索引是一個字符串
索引生成規則是:package name / message name /* string1 / string 2 …
如果不存在index字段,稱索引爲常量索引
索引中的類型目前只支持 int32,uint32,int64, uint64,string 以及 特殊的ipv4,ipv6,ip,mac(由common_type.proto定義)

舉例

在這裏插入圖片描述

Proto 文件約束

proto文件內容中,除枚舉類型的值外, 不包含大寫字母 。

枚舉類型的值必須採用全大寫字母表示。

統一採用 proto3協議 。所以syntax字段必須爲 “proto3”

每一個proto文件,都必須有package包名字段,命名格式爲: package 子系統_組件包 。子系統字段只能是: p、s、r、w、e、u 中的一個,分別代表:
p : 表示PI子系統
s : 表示交換子系統
r : 表示路由子系統
w : 表示無線子系統
e : 表示網關子系統
u : 表示udp子系統

如果以後新增子系統,該字段由框架統一擴展添加。
import的其他proto文件的方法統一爲: import “子系統/組件包/xxx.proto” 。

proto中各用戶字段的命名不宜過長,否則會導致生成的變量名字過長不利於閱讀同時會影響中間件性能。這裏約定,生成後的結構體的名字(package name的長度+message name 長度) 總長度不應該超過30個字符 。

proto中,表義某個表項的message(對應MOM API中的rg_obj參數的message),需要 預留1到4的tag,以及16384到32767的tag (預留給框架將來擴展新功能),其中 1到4的tag預留必須顯示用reveved關鍵字指明 。

任何message的tag的編號書寫必須 從小到大 ,不允許隨意排序。

不允許修改和刪除已有的tag, 只能新增tag
index 字段在MOM API中設計爲一個message 類型,是爲了表示 **動態索引 。當然有些組件可能是 單實例 的,此時就不需要index字段。
index 目前支持的類型爲:int32,uint32,int64, uint64,string 以及 特殊的ipv4,ipv4b, ipv6,ip,mac(詳見common_type.proto)。除了以上類型, 其他類型均不支持 (包括枚舉類型)。
index字段的tag值,應該是最小的。由於預留了1~4,所以index應該爲5。
爲了支持 多級訂閱、多級老化 等“子表”語義上操作的功能需求,約定index中包含了命名爲 t_前綴的變量,那麼該字段視爲一個子表 。
index中的string字段的使用, 不應該包含不可打印字符
整個index字段生成的key的總長度,目前限制在512字節 。

message中不允許嵌套定義message。如下爲非法定義:
message a {
message b{
string name = 1;
}
uint32 age = 2;
}

不允許定義空的message。如下爲非法定義:
message a {
}

proto文件處理過程

在這裏插入圖片描述
MOM API 操作數據庫
在這裏插入圖片描述

MOM API 基本接口

int rg_mom_set (rg_global_t *global, int db, const rg_obj *obj,
response_call_back fp, void *arg);

int rg_mom_del (rg_global_t *global, int db, const rg_obj *obj,
response_call_back fp, void * arg);

int rg_mom_get (rg_global_t *global, int db, const rg_obj *obj,
response_call_back fp, void * arg);

int rg_mom_publish(rg_global_t *global, int db, const rg_obj *obj,
rg_mom_response_cb fp, void *arg);

int rg_mom_subscribe(rg_global_t *global, int db, const rg_obj *obj,
unsigned level, rg_mom_response_cb fp, void *arg);

int rg_mom_scan(rg_global_t *global, int db, const rg_obj *obj,
unsigned int level, rg_mom_response_cb fn, void *privdata);

int rg_mom_pexpire(rg_global_t *global, int db, const rg_obj *obj,
unsigned int level, struct timeval timer, rg_mom_response_cb fp,
void *arg)
int rg_mom_del_expire(rg_global_t *global, int db, const rg_obj *obj,
unsigned int level, rg_mom_response_cb fn, void *arg);

範式demo

在這裏插入圖片描述

MOM API 使用注意點

基於rg-thread的僞線程事件驅動模型的設計。
提供對MOM的CRUD操作以及“發佈/訂閱”(PUB/SUB)的功能。
用protobuf作爲進程間消息通信的載體。
global句柄是單線程單例實現,非線程安全,不要跨線程使用global句柄
MOM基於僞線程框架編寫,事件回調函數中不允許阻塞,否則會導致僞線程無法調度,對應事件無法觸發。
MOM建連回調和重連需要確保做相同事情,即,重連回調函數除了多處理一個重連類型,其餘代碼應該跟建連回調相同。
MOM調用connect之後,可能調用connect_cb或者reconnect_cb。因此set_reconnect要在connect之後立馬註冊。
對於同一個so,訂閱支持可重入有以下約束:
同一個so, 對於hash的key,要麼精確訂閱要麼非精確訂閱,兩者不可以並存
同一個so, 在訂閱成功之前,不可重複訂閱同一fn。
同一個so, 在解訂閱成功之前,不可重複解訂閱同一fn。
同一個so, 在訂閱成功之前,不可以解訂閱同一fn。
同一個so,在解訂閱成功之前,不可以訂閱同一fn。

index字段的類型必須是一個message對象
所有異步接口,注意回調函數調用後,才代表操作成功
所有proto結構體使用前,必須初始化。

DATA CHECK

什麼是DS?
DS(data check)是數據一致性校驗。每個業務進程(APP)都有數據的輸入(上游)和數據的輸出(下游) 。P/S模型下,APP進程如果跟上游或者下游連接發生斷開,斷開過程中的數據變動就無法感知。數據輸入源和app的輸出方向數據就會參數不一致。所以業務重連之後,就需要DS,確保上下游數據一致

業務進程什麼時候DS
根據上文所訴,app跟mom server連接建立的時候,就需要進行DS操作,放到MOM API中,就是需要在建連回調和重連回調中實現DS操作。

參考文件:
https://docs.oracle.com/cd/E19148-01/820-0533/aeraq/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章