如何基于MySQL做實(shí)時(shí)計(jì)算?

有時(shí)候我們會有這樣的場景,在某個(gè)接口中,數(shù)據(jù)已經(jīng)很規(guī)范地存入到一張MYSQL表中,現(xiàn)在想對這樣的數(shù)據(jù)做一些實(shí)時(shí)或準(zhǔn)實(shí)時(shí)處理,比如數(shù)據(jù)多模式存儲、異步準(zhǔn)實(shí)時(shí)業(yè)務(wù)流程、業(yè)務(wù)實(shí)時(shí)監(jiān)控等。接口中處理流程如下:

源匯網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

最原始的方法,是改動業(yè)務(wù)代碼,將這些額外的處理流程作為同步流程,在更新MYSQL數(shù)據(jù)之后同步執(zhí)行。如下圖:

但是這樣的處理流程可能會越來越多,如果一直作為同步流程,整個(gè)接口會變得越來越龐大、并且耗時(shí)越來越長、出問題的風(fēng)險(xiǎn)越來越高。

所以我會考慮異步處理流程。如果可以改動一下代碼,將數(shù)據(jù)額外寫一份兒到隊(duì)列里,再用flink、storm之類的去消費(fèi)不就好了么。如下圖:



但實(shí)際上,或許由于架構(gòu)設(shè)計(jì)的不規(guī)范、或許由于業(yè)務(wù)場景的繁多,導(dǎo)致在代碼中加一遍數(shù)據(jù)埋點(diǎn),就如同重構(gòu)一般的工作量。所以我們需要另一種方式,能實(shí)時(shí)感知到MYSQL中數(shù)據(jù)的變化。

MYSQL的binlog可以幫我們記錄數(shù)據(jù)的變化,我們還需要一個(gè)工具來收集binlog,并轉(zhuǎn)為我們能讀懂的數(shù)據(jù)。阿里有一款叫canal的開源軟件正是做這個(gè)用的,可以通過修改源碼,增加監(jiān)控、告警、投遞隊(duì)列功能來實(shí)現(xiàn)。但現(xiàn)在,阿里云的日志服務(wù)為我們集成了這一功能,我們可以用更短的時(shí)間、更少的資源來獲得更穩(wěn)定、更放心的服務(wù)。如下圖:


日志服務(wù)收集binlog的功能還在內(nèi)測中,不久之后將與大家見面。

比如有這樣一個(gè)場景,我的MYSQL里有一張訂單推送記錄表,現(xiàn)在有一個(gè)需求,需要將這個(gè)表中的數(shù)據(jù),按照一定格式再寫入一份兒到表格存儲TableStore中。

傳統(tǒng)的實(shí)現(xiàn)方式,是在程序有寫入到MYSQL的地方,再加一段代碼,寫入MYSQL成功后再寫入到表格存儲中。而現(xiàn)在,為完成這個(gè)需求,我選用的技術(shù)方案是:


日志服務(wù)SLS+流計(jì)算StreamCompute+表格存儲TableStore

首先使用日志服務(wù),配置對mysql中訂單推送記錄表所在實(shí)例的binlog的收集。

日志服務(wù)收集binlog的原理,與canal一致。具體配置這里暫不作敘述。

收集到的日志中,包含:數(shù)據(jù)庫名、表名、事件(row_insert、row_update、row_delete)、全局事務(wù)ID、各個(gè)字段修改前的值、各個(gè)字段修改后的值。

根據(jù)場景,我們需要捕獲到每個(gè)row_insert和row_update操作中,各個(gè)字段修改后的值,然后寫入到表格存儲中。所以我們在流計(jì)算中,先配置好日志服務(wù)的源表、和表格存儲的目標(biāo)表,中間的邏輯這樣寫:

即可完成此需求。

再比如有這樣一個(gè)場景,我的MYSQL里有一張用戶信息表,現(xiàn)在想要實(shí)時(shí)統(tǒng)計(jì)每日注冊用戶數(shù),并通過大屏展示出來。

為完成這個(gè)需求,我選用的技術(shù)方案是:


日志服務(wù)SLS+流計(jì)算StreamCompute+表格存儲TableStore+數(shù)據(jù)可視化DataV

首先使用日志服務(wù),配置對mysql中user_info表所在實(shí)例的binlog的收集。

根據(jù)場景,我們需要捕獲到每個(gè)row_insert操作的時(shí)間,并將時(shí)間截取到日期。統(tǒng)計(jì)每天有多少條往用戶信息表中插入的操作記錄。所以我們在流計(jì)算中,先配置好日志服務(wù)的源表、和表格存儲的目標(biāo)表,中間邏輯這樣寫:

即可完成需求。

異步獲取MYSQL數(shù)據(jù)變化,觸發(fā)異步流程,避免了多個(gè)同步流程可能造成的執(zhí)行時(shí)間過長、或者由于網(wǎng)絡(luò)原因卡住等等導(dǎo)致的風(fēng)險(xiǎn)。同時(shí),異步流程也可以并行,總體上加快了業(yè)務(wù)流程的速度,使“一份兒數(shù)據(jù)、多種處理”變得更加方便快捷。

當(dāng)然,對于上邊作為例子的兩個(gè)場景來說,文中給出的方案并不是唯一的解決辦法,還可以使用函數(shù)計(jì)算代替流計(jì)算實(shí)現(xiàn)同樣的效果。

整套流程全部采用阿里云的服務(wù)化產(chǎn)品進(jìn)行,使得本來全部獨(dú)立開發(fā)需要幾天的工作量,可以在幾分鐘之內(nèi)搞定,方便快捷,且整套流程都有完善的監(jiān)控、告警機(jī)制,安全放心。

本文來自:阿里云MVP月度分享

當(dāng)前題目:如何基于MySQL做實(shí)時(shí)計(jì)算?
路徑分享:http://bm7419.com/article22/dsecc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站維護(hù)、企業(yè)網(wǎng)站制作、商城網(wǎng)站、小程序開發(fā)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)