您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

實例分析Schemaless的主要功能

大?。?/span>0.5 MB 人氣: 2017-10-12 需要積分:1

  

  本文介紹Schemaless的主要功能:Schemaless trigger的細節(jié)與案例。本文是系列文章的第三部分;第一部分是關于Schemaless的設計,第二部分是討論其架構。

  Schemaless trigger是一項具有可擴展性、容錯性和無損性的技術,監(jiān)聽Schemaless實例中的變更。在行程(trip)流程中起到引擎的作用,從司機按下“結束行程”并向系統(tǒng)提交費用,直到相應數(shù)據(jù)進入數(shù)據(jù)庫等待分析。在Schemaless系列的最后一篇中,我們將深入講解Schemaless trigger的功能,以及如何開發(fā)出這個可擴展的容錯系統(tǒng)。

  簡單來說,在Schemaless數(shù)據(jù)的基本單位被命名為單元(cell)。它是不可變的,一旦寫入,便無法被覆蓋。(在特殊情況下,我們可以刪除舊記錄);單元可以被行鍵(row key)、列名(column name)和引用鍵(ref key)來引用;單元內容通過編寫引用鍵更高的新版來執(zhí)行更新,但行鍵和列名保持不變。Schemaless不對其中存儲的數(shù)據(jù)執(zhí)行任何操作(故而命名schemaless)。從Schemaless的觀點來看,它只負責存儲JSON對象。

  Schemaless Trigger案例

  我們來看一下實踐中Schemaless trigger的運作方式。下面的代碼是簡化版的異步計費方式(大寫標注Schemaless的列名)。案例Python代碼:

  #我們實例化一個客戶端,以便與Schemaless實例通訊schemaless_client = SchemalessClient(datastore=’mezzanine’) #為BASE列注冊一個bill_rider功能@trigger(column=’BASE’)defbill_rider(row_key):# row_key是行程的UUIDstatus = schemaless_client.get_cell_latest(row_key, ‘STATUS’) ifstatus.is_completed: #也就是說我們已經提交了乘客的賬單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ù)中通過添加decorator@trigger來定義trigger,并指定列。如果指定列的單元中有內容,通知Schemaless trigger框架調用函數(shù)——本例是bill_rider。這里通過BASE中的一個新單元表明行程結束。觸發(fā)trigger,然后通過函數(shù)來發(fā)送行鍵——本例是行程UUID。如果需要更多數(shù)據(jù),必須從Schemaless實例——本例是從行程存儲Mezzanine中獲取真實數(shù)據(jù)。

  bill_rider trigger函數(shù)的信息流見下表(這里是乘客結賬)。箭頭方向指明調用方與被調方,旁邊的數(shù)字指明流程的順序:

  實例分析Schemaless的主要功能

  首先將行程輸入Mezzanine,Schemaless Trigger框架調用bill_rider。在調用時,函數(shù)向行程存儲請求STATUS列的最新信息。本例中is_completed字段不存在,也就是說乘客尚未結賬。然后獲得BASE列的行程信息,通過函數(shù)調用信用卡provider來結賬。在本例中,我們成功用信用卡付費,并返回成功信息到Mezzanine,然后設置STATUS列的is_completed為True。

  Trigger框架確保在每個Schemaless實例中的每個單元至少調用bill_rider一次。一般來說只觸發(fā)trigger函數(shù)一次,不過在出錯的情況下(無論是trigger功能還是其他功能短暫出錯),都可能需要多次調用該函數(shù)。也就是說trigger函數(shù)是冪等的,在本例中要檢查單元是否處理完畢。如果答案為是,則返回函數(shù)。

  在查看下文中Schemaless如何在流程中提供支持時,要記得這個案例。我們將會解釋Schemaless如何被看作變更日志,并討論與Schemaless相關的API,分享讓流程支持可擴展和可容錯的技術。

  將Schemaless視為日志

  Schemaless包含所有單元,也就是說包含指定行鍵、列keypair的所有版本。由于包含單元的所有歷史版本,除了隨機訪問key-value存儲外,Schemaless還可作為變更日志。事實上它就是一個分區(qū)日志,每個分片都是自己的日志,如下圖:

  

  根據(jù)行鍵(也就是UUID)將每個單元寫入特定的分片。分片中的所有單元都有唯一標識符,稱為添加ID。添加ID是一個自動遞增的字段,代表著單元的插入順序(越新的單元,添加ID的數(shù)字越大)。除了添加ID之外,每個單元都有單元寫入的時間(datetime)。在所有分片備份中,單元的添加ID是唯一的,這點對于故障時轉移非常重要。

  Schemaless的API支持隨機訪問和日志類訪問。隨機訪問API是針對單獨的單元,均由row_key、column_key和ref_key一同定義。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關規(guī)定!

      ?