業務需求:使用者每次修改資料,都要記錄修改留痕資訊;
形如:【訂單號】由1001改為1002,【備註】由空改為 「客戶要求修改訂單號」
之前做法是業務**主動寫結合aop統一攔截寫日誌。
動手開始做技術預研:
簡化的order資料表結構如下:
偶然看到canal後,立刻想到,可以借助canal實現這個需求,業務系統可以和修改留痕功能解耦。
首先看看canal解析binlog後封裝的資料結構
可以發現裡面列資訊缺少【注釋】這個元資料。諸如是否主鍵,是否為空,字段型別這些都有,說明canal後台只是取了部分原資料。
現在有兩條路
1:客戶端快取資料庫元資料。
2:改下canal源**,返回注釋這個元資料。
現在說下方式二
檢視**,尋找解析binlog的**,最終定位到com.alibaba.otter.canal.parse.inbound.mysql.dbsync.logeventconvert類的如下方法,可以看到裡面有處理元資料的**
看來是用columnbuilder來封元資料
進一步檢查原資料獲取方法
發現用的是desc,這個函式是不會返回注釋資訊的,下圖1是desc,只返回6列資料,下圖2可以看到有返回注釋字段
修改**換成show full fields語句。
獲取到了,現在就是怎麼傳回去,檢視阿里定義的列資料結構,發現已經有預留擴充套件了。下圖的props欄位
修改之前的組裝**,增加如下**,將注釋放入props中,這裡偷懶使用了阿里原來的extra欄位來儲存,一來反正是技術預研,而來這個extra對我沒用,正式的肯定會增加欄位的儲存的。
執行程式canallauncher,啟動服務
然後執行阿里自帶的例項客戶端,增加輸出props的值
修改資料庫訂單資料,檢視控制台,發現已經拿到我們要的所有資料了。技術預研完成。
留痕還要求記錄操作員,可以約束所有表都固定定義操作人欄位。
原始碼分析Canal專欄
canal 是阿里開源的基於 mysql binlog 資料同步元件,是網際網路架構中資料異構的重磅元件,本專欄將從原始碼的角度 其實現原理 實現細節,有利於更好的駕馭好canal。1 資料異構之 canal 初探 技巧篇 2 一文詳解 canal instance 設計理念與定製開發思路 3 ca...
記憶體修改器實現原始碼
include stdafx.h include include include includeusing namespace std dword g arlist 1024 int g nlistcnt handle g hprocess bool writememory dword dwaddr...
pppd 原始碼修改1
1.pppd撥號成功後,會將解析到的dns伺服器ip位址,寫入 etc ppp resolv.conf 這樣的話,gethostbyname r並不會識別,並且,如果有啟動兩路pppd的話,後面一路會將resolv.conf檔案重寫。因此,這塊 需要修改。在pppd ipcp.c檔案中,修改crea...