我有些很好的消息要告訴 Amazon DynamoDB用戶(hù)。首先,DynamoDB Streams特性現(xiàn)在可用了,你今天就可以開(kāi)始使用它了!正如你將從這篇博客帖中看到的,現(xiàn)在使用 AWS Lambda處理一個(gè)數(shù)據(jù)流中的更改記錄是非常簡(jiǎn)單的。其次,我們正在努力使你從一個(gè)DynamoDB表復(fù)制內(nèi)容到另一個(gè)表變得真正簡(jiǎn)單,不管是跨域復(fù)制還是在一個(gè)域內(nèi)部復(fù)制。
讓我們深入了解一下吧!
DynamoDB Streams特性
去年秋季,就在 AWS re:Invent大會(huì)開(kāi)始前幾天,我們?cè)趦?nèi)部對(duì)DynamoDB Streams特性進(jìn)行了試映。正如我當(dāng)時(shí)寫(xiě)到的,我們開(kāi)發(fā)了這一特性是因?yàn)楹芏郃WS客戶(hù)表達(dá)了他們的愿望,希望能夠跟蹤對(duì)DynamoDB表所做的更改。
現(xiàn)在DynamoDB Streams特性已經(jīng)可以用于生產(chǎn)了。一旦你為一張表開(kāi)啟了這一特性,對(duì)這張表所做的所有更改(添加,更新和刪除)都會(huì)被24小時(shí)滾動(dòng)跟蹤,并準(zhǔn)實(shí)時(shí)地在一條stream record(流記錄)中顯示。多個(gè)流記錄被分組在碎片中,并作為一個(gè)單元返回,以便進(jìn)行更快更有效的處理。
對(duì)一條主鍵所做的一系列更改的相關(guān)排序?qū)?huì)被保存在一個(gè)碎片中。此外,一個(gè)特定的鍵值將會(huì)顯示在特定時(shí)間點(diǎn)活躍的一組兄弟碎片中的至多一個(gè)碎片中。結(jié)果是,為了準(zhǔn)確跟蹤對(duì)一個(gè)項(xiàng)目所做的更改,你的代碼只能處理一個(gè)碎片中的流記錄。
你的代碼可以檢索碎片,循環(huán)訪問(wèn)這些記錄,以任何希望的方式處理它們。你可以以表的配置寫(xiě)入能力的大約兩倍的速率來(lái)檢索記錄。
你可以在調(diào)用CreateTable時(shí),通過(guò)提供流規(guī)格參數(shù),在表創(chuàng)建時(shí)就為表開(kāi)啟DynamoDB Streams特性。你也可以通過(guò)向UpdateTable提供相似的規(guī)格,為既存的表開(kāi)啟DynamoDB Streams特性。在上述任何一種情況下,規(guī)格都必須包括一個(gè)標(biāo)記(指明啟動(dòng)或關(guān)閉特性)和一個(gè)查看類(lèi)型(指明是僅存儲(chǔ)和返回項(xiàng)目鍵值,僅存儲(chǔ)和返回新映像,或存儲(chǔ)和返回新舊映像)。
想要了解這一新特性的更多信息,請(qǐng)參閱新的 DynamoDB Streams Developer Guide(DynamoDB Streams開(kāi)發(fā)指南)。
你可以免費(fèi)創(chuàng)建DynamoDB Streams特性。你只需付費(fèi)從Streams中讀取數(shù)據(jù)。數(shù)據(jù)讀取按照讀取請(qǐng)求單元進(jìn)行測(cè)量;對(duì)GetRecords的一次調(diào)用被計(jì)做一個(gè)請(qǐng)求單元,可以返回多達(dá)1MB的數(shù)據(jù)。想要獲取更多信息,請(qǐng)參閱 DynamoDB Pricing(DynamoDB計(jì)價(jià))頁(yè)面。
DynamoDB Streams + Lambda =數(shù)據(jù)庫(kù)觸發(fā)器
AWS Lambda使你能夠在云中輕松地寫(xiě)入,承載和運(yùn)行代碼(目前只支持Node.js和Java代碼),不用擔(dān)心容錯(cuò)或規(guī)模伸縮,所有操作都是在很經(jīng)濟(jì)的基礎(chǔ)上進(jìn)行的(你只需按照運(yùn)行代碼所用的計(jì)算時(shí)間,以100毫秒的時(shí)間增量進(jìn)行付費(fèi))。
作為今天發(fā)布的可用于生產(chǎn)的DynamoDB Streams特性的核心亮點(diǎn),我們也正在努力使你輕松地使用Lambda處理流記錄,而不需寫(xiě)很多代碼或在你的表規(guī)模變大或操作增多時(shí)擔(dān)心系統(tǒng)的規(guī)模。
你可以將Streams和Lambda的結(jié)合看做是實(shí)現(xiàn)數(shù)據(jù)庫(kù)觸發(fā)器的一個(gè)清潔和輕便的方式,NoSQL風(fēng)格!以前,關(guān)系型數(shù)據(jù)庫(kù)觸發(fā)器在數(shù)據(jù)庫(kù)引擎內(nèi)實(shí)現(xiàn)。同樣地,對(duì)操作的可能響應(yīng)就局限于引擎所定義的所有操作。使用Lambda實(shí)施與觸發(fā)器關(guān)聯(lián)的動(dòng)作(插入,刪除和更改表項(xiàng)目)是更加強(qiáng)大,更具有表現(xiàn)力的。你可以寫(xiě)簡(jiǎn)單代碼來(lái)分析這些更改(通過(guò)比較新舊項(xiàng)目映像),對(duì)其他格式的數(shù)據(jù)發(fā)起更新,實(shí)施業(yè)務(wù)規(guī)則,或激活同步或異步業(yè)務(wù)邏輯。你可以允許Lambda管理承載和伸縮業(yè)務(wù)以便你可以專(zhuān)注應(yīng)用獨(dú)特而有價(jià)值的部分。
完成準(zhǔn)備工作后運(yùn)行你自己的代碼處理更改真的是很簡(jiǎn)單的。讓我們使用一張新表來(lái)快速演練一下。為L(zhǎng)ambda創(chuàng)建一個(gè)調(diào)用角色(以便Lambda可以代表我訪問(wèn)DynamoDB)后,我打開(kāi)Lambda Console,點(diǎn)擊Create a Lambda function。然后我選擇標(biāo)記有dynamodb-process-stream的藍(lán)圖:

每一個(gè)藍(lán)圖都配置了一個(gè)事件源和Lambda功能框架,以便你開(kāi)始。Console提醒我配置事件源。我將它連接到一張DynamoDB表(user_table),指明我的代碼一批可以處理多達(dá)100條流記錄,并且指明我想處理新記錄(我也可以選擇處理既存記錄,可處理的既存記錄的范圍可追溯到該數(shù)據(jù)流的時(shí)間范圍):

該藍(lán)圖包含一個(gè)可以立即用于測(cè)試的功能;我只是賦予了它一個(gè)名稱(chēng)(ProcessUserTableRecords)并選擇了一個(gè)IAM角色以便該功能可以訪問(wèn)DynamoDB: