基於函數計算處理數據並分發的實踐操作

摘要: 函數計算作為一個後端數據處理服務跟表格存儲結合起來,主要是數據驅動後續的分發行為。函數計算可以對存儲到表格存儲里的數據進行准實時處理(目前可以定義1秒觸發一次、一次傳輸100條記錄),通過觸發器函數計算能夠監控到表格存儲里數據的增、刪、改等操作,當批量數據在表格存儲被修改後,觸發器會通知函數來進行處理。

原文

綜述

阿里雲的函數計算是2017年4月份發布,並於同年10月份正式商業化,是一款基於Serverless這種架構下實現的一款輕計算高彈性的產品。下面會講解基於函數計算作為數據處理並分發後的場景。場景描述是這樣,函數計算作為一個後端數據處理服務跟表格存儲結合起來,主要是數據驅動後續的分發行為。函數計算可以對存儲到表格存儲里的數據進行准實時處理(目前可以定義1秒觸發一次、一次傳輸100條記錄),通過觸發器函數計算能夠監控到表格存儲里數據的增、刪、改等操作,當批量數據在表格存儲被修改後,觸發器會通知函數來進行處理。

常見的場景是,表格里的某個欄位的數據被修改後,需要把變化內容通過消息通道或者通過移動推送給手機端。例如您的某個消息被回復,或者您發的帖子被刪除或者置頂等操作後即可觸發函數計算對數據處理後來通知你。

使用傳統的架構處理通常是數據寫入到表格存儲後,需要寫一個定時任務來拉取最新更新的數據然後再進行後續處理,在這裡有幾個技術問題需要關註:

1、 如何獲取表格中最新更新的記錄。

2、 定時器設置成多少才不成為應用瓶頸。

3、 如果更新的數據量較大,一次處理多少條數據。

4、 處理後的數據,需要寫分發程序來調用其他資源。

5、 如果數據量更新較大,而超過一台伺服器處理能力,怎麼做負載均衡來分散處理請求。

傳統IT架構圖:

架構圖講解:接入端(手機、WEB端等)的請求把數據寫入表格存儲,後端雲伺服器拉取表格存儲的數據進行處理,並把處理後的數據分發到例如消息通道,移動推送等。

針對上述提出的技術問題,可以通過函數計算+表格存儲+消息通道較為完美的解決上述問題。用表格存儲觸發器+函數計算的架構如下:

通過架構對比,能看出最大的變化在用函數計算替換掉多台雲伺服器,這樣的變動帶來的好處有很多:

1、 函數計算和表格存儲產品打通,可以通過控制台上簡單配置即可完成兩個產品的數據打通,詳見下面講解。

2、 函數計算在多並發的時候能彈性伸縮,不需要考慮當大量數據更新後怎麼處理彈性問題。表格存儲會間隔1秒把批量把更新的數據透傳給函數計算,當一秒內處理不完請求,會啟動新的執行環境來處理後續的請求。

3、 業務邏輯編寫到函數計算里,處理好數據後,通過介面調用直接把數據發送給移動推送、消息通道等產品。

4、 函數計算是按照觸發來計費,業務低谷期的費用非常低廉,不需要額外維護一些服務環境。

場景描述

下面根據上述的場景圖,來細化每一步操作,按照步驟可以完成整個場景的搭建,整體流程圖如下

下面章節會根據上述流程,把完整的操作步驟描述出來。

開通產品

在開始步驟之前,需要先開通以下產品,通過阿里雲官網首頁,找到各個產品詳情頁,並開通服務,這三個產品都是按量付費產品,開通流程都比較簡單。

函數計算產品詳情頁:aliyun.com/product/fc

表格存儲產品詳情頁:aliyun.com/product/ots

消息隊列產品詳情頁:aliyun.com/product/mns

開通產品後,進入控制台,進行一些設置,開通流程可以參考如下幾篇文章:

控制台的配置

表格存儲的配置

分別開通上述產品後,需要對產品的聯通進行配置,需要打通的產品如,函數計算和表格存儲,函數計算和消息通道等,配置都相對簡單,下面會使用少量界面圖來引導每一步操作。

詳細可以參考這篇文檔 在表格存儲使用函數計算。

打開表格存儲的控制台,進入控制台創建實例->管理->創建數據表,在創建數據表的時候,請注意勾選上開啟Stream方式,只有開啟Stream方式,表格存儲才會觸發把更新的數據傳輸給函數計算。

在表格存儲的管理界面里,選擇觸發器管理,如果原先已經寫好的函數計算,可以選擇,如果沒有,可以跳轉到函數計算創建頁面進行創建,這個地方需要注意,為了保障網路延遲較小,表格存儲和函數計算需要在同一個區域,詳見下面配置好的頁面。

注意點:

1、 數據表的區域需要和函數計算在同一個區域

2、 第一次使用函數計算觸發器會提示角色授權

3、 一張表下只能創建一個觸發器

4、 觸發器是按照1秒執行一次,一次傳輸100條數據,依次處理。

函數計算的配置:

進入函數計算的控制台,開通服務後,選擇跟表格存儲同一個區域的創建一個新函數,選擇一個空白模板,選擇python語言,設置好相關信息,這裡需要注意的是程序入口函數編寫。Python語言的編寫需要參考產品文檔中的內容,其中入口函數和事件源的詳細內容可以參考這篇文章。配置好的界面如下面圖所示:

其中有幾個地方需要注意:

1、 入口函數的編寫

2、 運行語言版本

3、 執行所需要內存和超時時間,執行所需要的內存跟程序執行的資源相關,預設可以使用128MB,超時時間不能小於程序執行時間,最長能設置300秒。

選擇在線編輯代碼,代碼編寫頁面:

代碼編寫結束後,直接可以執行來調試,其中觸發事件是為了讓開發者可以在控制台上模板輸入來進行調試。

消息通道的配置

消息通道不需要配置,開通即可使用,函數計算往消息通道發送信息的代碼可以直接嵌入對應的SDK即可。

編寫業務代碼

完成上述配置後,進入編寫業務代碼,業務代碼的編寫都在函數計算里,其中邏輯會包含兩段邏輯,第一段邏輯是接收表格存儲推送過來的數據,第二段邏輯是把處理好的數據回寫到表格存儲中或者調用消息通道,並填寫主題內容,詳解圖解:

第一段邏輯,接收表格存儲的數據,可以參考詳細文檔。

示例代碼稍後提供

第二塊代碼是把數據回寫到表格存儲中

示例代碼稍後提供

第二段邏輯,把數據通知消息通道,

示例代碼稍後提供

以上代碼需要注意的事項如:

1、 函數計算的python運行環境預設帶了表格存儲產品的SDK,所以不需要額外再安裝。

2、 注意Python的書寫格式,編輯器目前還無法校驗語法錯誤。

調試程序

編寫好業務代碼,一般都需要進行調試,在函數計算里提供了事件源模擬器,詳解下圖:

其中觸發事件是主要為了讓開發進行輸入值的調試,例如期望程序拿到什麼樣的值,這個地方就可以模擬來是。在調試表格存儲代碼的時候,需要注意,表格存儲觸發器發送過來的數據是二進位的方式,為了方便調試,觸發事件源可以用json串來模擬,正式使用的時候,把

records = cbor.loads(event) 注釋去掉,records = json.loads(event)注釋掉即可。

事件源的示例json串如下:

結果匯總

設置好內容後,可以在控制台上執行看看,執行結果會顯示很多內容,執行摘要里會帶內存使用情況,執行時間,實際使用內存等等。同時會把執行過程中的日誌也列印出來。

通過模擬器測試結果後,可以真實的跑一次應用看看,往表格存儲里寫入一些新記錄,看看有沒有觸發後續的處理。

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎

推薦閱讀:

scrapy進階,組合多請求抓取Item利器ItemCollector詳解!

TAG:函數 | 架構 | 表格存儲 |