實(shí)例分析Schemaless的主要功能
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
本文介紹Schemaless的主要功能:Schemaless trigger的細(xì)節(jié)與案例。本文是系列文章的第三部分;第一部分是關(guān)于Schemaless的設(shè)計(jì),第二部分是討論其架構(gòu)。
Schemaless trigger是一項(xiàng)具有可擴(kuò)展性、容錯(cuò)性和無(wú)損性的技術(shù),監(jiān)聽(tīng)Schemaless實(shí)例中的變更。在行程(trip)流程中起到引擎的作用,從司機(jī)按下“結(jié)束行程”并向系統(tǒng)提交費(fèi)用,直到相應(yīng)數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)等待分析。在Schemaless系列的最后一篇中,我們將深入講解Schemaless trigger的功能,以及如何開(kāi)發(fā)出這個(gè)可擴(kuò)展的容錯(cuò)系統(tǒng)。
簡(jiǎn)單來(lái)說(shuō),在Schemaless數(shù)據(jù)的基本單位被命名為單元(cell)。它是不可變的,一旦寫入,便無(wú)法被覆蓋。(在特殊情況下,我們可以刪除舊記錄);單元可以被行鍵(row key)、列名(column name)和引用鍵(ref key)來(lái)引用;單元內(nèi)容通過(guò)編寫引用鍵更高的新版來(lái)執(zhí)行更新,但行鍵和列名保持不變。Schemaless不對(duì)其中存儲(chǔ)的數(shù)據(jù)執(zhí)行任何操作(故而命名schemaless)。從Schemaless的觀點(diǎn)來(lái)看,它只負(fù)責(zé)存儲(chǔ)JSON對(duì)象。
Schemaless Trigger案例
我們來(lái)看一下實(shí)踐中Schemaless trigger的運(yùn)作方式。下面的代碼是簡(jiǎn)化版的異步計(jì)費(fèi)方式(大寫標(biāo)注Schemaless的列名)。案例Python代碼:
#我們實(shí)例化一個(gè)客戶端,以便與Schemaless實(shí)例通訊schemaless_client = SchemalessClient(datastore=’mezzanine’) #為BASE列注冊(cè)一個(gè)bill_rider功能@trigger(column=’BASE’)defbill_rider(row_key):# row_key是行程的UUIDstatus = schemaless_client.get_cell_latest(row_key, ‘STATUS’) ifstatus.is_completed: #也就是說(shuō)我們已經(jīng)提交了乘客的賬單return#否則就嘗試提交賬單#我們從BASE列拿到了基本行程信息trip_info = schemaless_client.get_cell_latest(row_key, ‘BASE’) #提交乘客賬單result = call_to_credit_card_processor_for_billing_trip(trip_info) ifresult != ‘SUCCESS’: #提交例外,讓Schemaless trigger稍后重試。raiseCouldNotBillRider() #成功提交乘客賬單,寫入Mezzanineschemaless_client.put(row_key, status, body={‘is_completed’: True, ‘result’: result})
在Schemaless實(shí)例中,我們?cè)诤瘮?shù)中通過(guò)添加decorator@trigger來(lái)定義trigger,并指定列。如果指定列的單元中有內(nèi)容,通知Schemaless trigger框架調(diào)用函數(shù)——本例是bill_rider。這里通過(guò)BASE中的一個(gè)新單元表明行程結(jié)束。觸發(fā)trigger,然后通過(guò)函數(shù)來(lái)發(fā)送行鍵——本例是行程UUID。如果需要更多數(shù)據(jù),必須從Schemaless實(shí)例——本例是從行程存儲(chǔ)Mezzanine中獲取真實(shí)數(shù)據(jù)。
bill_rider trigger函數(shù)的信息流見(jiàn)下表(這里是乘客結(jié)賬)。箭頭方向指明調(diào)用方與被調(diào)方,旁邊的數(shù)字指明流程的順序:
首先將行程輸入Mezzanine,Schemaless Trigger框架調(diào)用bill_rider。在調(diào)用時(shí),函數(shù)向行程存儲(chǔ)請(qǐng)求STATUS列的最新信息。本例中is_completed字段不存在,也就是說(shuō)乘客尚未結(jié)賬。然后獲得BASE列的行程信息,通過(guò)函數(shù)調(diào)用信用卡provider來(lái)結(jié)賬。在本例中,我們成功用信用卡付費(fèi),并返回成功信息到Mezzanine,然后設(shè)置STATUS列的is_completed為True。
Trigger框架確保在每個(gè)Schemaless實(shí)例中的每個(gè)單元至少調(diào)用bill_rider一次。一般來(lái)說(shuō)只觸發(fā)trigger函數(shù)一次,不過(guò)在出錯(cuò)的情況下(無(wú)論是trigger功能還是其他功能短暫出錯(cuò)),都可能需要多次調(diào)用該函數(shù)。也就是說(shuō)trigger函數(shù)是冪等的,在本例中要檢查單元是否處理完畢。如果答案為是,則返回函數(shù)。
在查看下文中Schemaless如何在流程中提供支持時(shí),要記得這個(gè)案例。我們將會(huì)解釋Schemaless如何被看作變更日志,并討論與Schemaless相關(guān)的API,分享讓流程支持可擴(kuò)展和可容錯(cuò)的技術(shù)。
將Schemaless視為日志
Schemaless包含所有單元,也就是說(shuō)包含指定行鍵、列keypair的所有版本。由于包含單元的所有歷史版本,除了隨機(jī)訪問(wèn)key-value存儲(chǔ)外,Schemaless還可作為變更日志。事實(shí)上它就是一個(gè)分區(qū)日志,每個(gè)分片都是自己的日志,如下圖:
根據(jù)行鍵(也就是UUID)將每個(gè)單元寫入特定的分片。分片中的所有單元都有唯一標(biāo)識(shí)符,稱為添加ID。添加ID是一個(gè)自動(dòng)遞增的字段,代表著單元的插入順序(越新的單元,添加ID的數(shù)字越大)。除了添加ID之外,每個(gè)單元都有單元寫入的時(shí)間(datetime)。在所有分片備份中,單元的添加ID是唯一的,這點(diǎn)對(duì)于故障時(shí)轉(zhuǎn)移非常重要。
Schemaless的API支持隨機(jī)訪問(wèn)和日志類訪問(wèn)。隨機(jī)訪問(wèn)API是針對(duì)單獨(dú)的單元,均由row_key、column_key和ref_key一同定義。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
實(shí)例分析Schemaless的主要功能下載
相關(guān)電子資料下載
- 常用于緩存處理的機(jī)制總結(jié) 如何避免緩存雪崩問(wèn)題? 24
- SpringBoot物理線程、虛擬線程、Webflux性能比較 37
- mysql經(jīng)典面試題及答案 63
- 聊聊即將到來(lái)的MySQL5.7停服事件 179
- 基于Prometheus開(kāi)源的完整監(jiān)控解決方案 25
- 基于控制臺(tái)的通訊錄管理系統(tǒng)功能介紹 59
- 什么是數(shù)據(jù)庫(kù)?除了MySQL還有哪些數(shù)據(jù)庫(kù)? 36
- 超好用的開(kāi)源IP地址管理系統(tǒng),告別傳統(tǒng)Excel統(tǒng)計(jì)方式! 146
- Innodb中的Btree實(shí)現(xiàn)(一)·引言&insert篇 65
- 怎么查看MySQL語(yǔ)句有沒(méi)有用到索引 190