一種內部nosql數據庫訂閱發佈機制的設計

內部nosql數據庫訂閱發佈機制

本篇文章主要介紹我們內部的nosql 數據庫 wdb實現了內部訂閱發佈機制的實現細節
兩個進程:Switch_process wdb_process
Switch_process 訂閱 wdb_process的數據, 當數據發生改變後發佈給switch_process

訂閱/發佈機制 跟網絡通信中的組播有很大的相似之處,數據源通過組播表到底客戶端, 例如組播組224.0.0.0 發到這個組的數據 ,會發送給全部直連的設備, 而其他組播組會查詢組播表,根據表裏面的註冊對象進行發送。 軟件的原理是相通的。

Created with Raphaël 2.2.0數據源代理確認是否在組播組(訂閱組)?客戶端 1 2 3yes

訂閱

1: wdb_pm_subscribe_tbl(TBL_ARPINSP, brg_vlan_cmd_arpinsp_enable_sync, NULL);

TBL_ARPINSP =187 此處就爲訂閱號,根據函數定義我們知道,此處只是把數據訂閱數據後執行的函數添加到全局靜態數據列表。

typedef int32 (*wdb_SUBSCRIBE_TBL_FUNC)(wdb_node_t* p_tbl_node, wdb_node_t* p_ds_node, uint32 oper, uint32 field_id, void *p_tbl, void *p_ds);

Typedef 一種用法:爲複雜的聲明定義一個別名。

static wdb_SUBSCRIBE_TBL_FUNC g_pm_tbl_sub_before_fn[TBL_MAX];
int32
wdb_pm_subscribe_tbl(wdb_tbl_t tbl_id, wdb_SUBSCRIBE_TBL_FUNC before_fn, wdb_SUBSCRIBE_TBL_FUNC after_fn)
{
    if (tbl_id >= TBL_MAX)
    {
        return PM_E_INVALID_PARAM;
    }

    g_pm_tbl_sub_before_fn[tbl_id] = before_fn;
    g_pm_tbl_sub_after_fn[tbl_id] = after_fn;
    
    return PM_E_NONE;
}

2: 發佈

當數據發生改變的時候,調用

wdb_store_data(wdb_node_t* p_tbl_node, wdb_node_t* p_ds_node, wdb_node_t* p_ds2_node, ctc_msg_t *p_msg)

進行數據的同步:

/* 2. before store sync process */
g_pm_ds_sub_refer_before_fn[p_ds_node->id](p_tbl_node, p_ds_node, oper, field_id, p_tbl, p_ds, p_refer);

根據先前註冊的執行函數進行相應的處理。

總結下來就是訂閱時候設置好 訂閱表的id, 保存處理函數, 在數據改變來的時候根據數據表的id去做相應的發佈處理。

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