在需要添加約東時(shí),例例如讓物品從用戶(hù)看到它們直到用戶(hù)購買(mǎi)它們都存在,要認真考慮。雖然某些特殊情況可能會(huì )令客戶(hù)失望,但是彌補客戶(hù)比起不能擴展來(lái)說(shuō)容易得多。
在數學(xué)和機器學(xué)習(人工智能)領(lǐng)域,有一套約東滿(mǎn)足問(wèn)題(CSP),其中的對象必須滿(mǎn)足某些約束。CSP通常復雜度很高,需要啟發(fā)式搜索和組合式搜索方法結合才能解決的。兩個(gè)經(jīng)典的CSP難題是數獨游戲和地圖著(zhù)色問(wèn)題。數獨游戲的目標是填寫(xiě)一個(gè)大九宮格,每行每列都有9個(gè)單元格,大九宮格可以分為小九宮格,要在每個(gè)小九宮格中填入1到9的數字,使得大九宮格每一行和每一列的數字都不重復。地圖著(zhù)色問(wèn)題是對地圖進(jìn)行著(zhù)色,使相鄰的地區具有不同的顏色。

CSP問(wèn)題還會(huì )衍生出時(shí)序約束滿(mǎn)足問(wèn)題(TCSP),其中變量表示的是事件,約束表示兩個(gè)事件之間可能的時(shí)序關(guān)系。這類(lèi)問(wèn)題的目標是確保變量間的約束,決定滿(mǎn)足約束的各種場(chǎng)景。對變量強制實(shí)行本地一致性,可以確保問(wèn)題中的所有節點(diǎn)、弧和路徑都滿(mǎn)足約東。機器學(xué)習領(lǐng)域和計算機科學(xué)中的很多問(wèn)題都可以建模為T(mén)CSP,如機器視覺(jué)、調度、平面布局設計、SaS系統中的用例等,都可以看作是TCSP。
常見(jiàn)的SaS應用中的時(shí)序約束的例子是用戶(hù)購買(mǎi)一個(gè)物品。用戶(hù)瀏覽該物品,把它放入購物車(chē)并結算,這些操作都需要一些時(shí)間。有人認為,考慮到絕對的最佳用戶(hù)體驗,無(wú)論這個(gè)物品是否存在,都要在整個(gè)過(guò)程中使它保持統一的狀態(tài)。要實(shí)現這一點(diǎn),就需要在用戶(hù)關(guān)掉該頁(yè)面,或者放棄了購物車(chē),或者結算之前,把該物品在數據庫中標識為“扣押”的狀態(tài)。如果我們站點(diǎn)的用戶(hù)數不多,這種方法簡(jiǎn)單實(shí)用。對用戶(hù)來(lái)說(shuō),在把物品加入購物車(chē)之前,瀏覽了100個(gè)或更多的物品是很常見(jiàn)的。我們的一個(gè)客戶(hù)聲稱(chēng),他們的用戶(hù)在把一個(gè)物品加入購物車(chē)之前,要瀏覽500多個(gè)檢索結果。對于這種情況,我們的應用可能需要幾個(gè)數據庫的讀副本,使得更多的人能夠檢索和瀏覽物品,而不是購買(mǎi)物品。這樣就產(chǎn)生了問(wèn)題,大多數 RDBMS難以保持節點(diǎn)間的所有數據完全一致。即使數據庫的讀副本或者從數據庫在數據一致性上只有幾秒鐘的差別,還是會(huì )產(chǎn)生特殊情況,例如兩個(gè)用戶(hù)都想查看某個(gè)物品,而它只剩下最后一個(gè)。后面我們會(huì )來(lái)解決這個(gè)問(wèn)題,但是首先讓我們看看為什么數據庫會(huì )造成這個(gè)問(wèn)題。
造成RDBMS難以進(jìn)行分布式擴展的屬性是一致性。CAP定理,又稱(chēng)為布魯爾定理,是以計算機科學(xué)家 Eric Brewer的名字命名的,它描述了在分布式環(huán)境中設計應用的三點(diǎn)核心要求,但這三點(diǎn)要求不可能同時(shí)滿(mǎn)足。這三點(diǎn)要求用縮寫(xiě)CAP表示。
一致性(Consistency)--客戶(hù)端發(fā)現一組操作同時(shí)發(fā)生了
可用性(Avalability)一一在收到計劃中的響應后,任何操作都要終止。
分區容忍性(Partition Tolerance)-即使個(gè)別組件不可用,操作也會(huì )完成。
這個(gè)問(wèn)題的解決方案叫做BASE,是解決CAP的架構的縮寫(xiě),代表基本可用(Basic Available)、軟狀態(tài)( Soft State)和最終一致性(Eventually Consisten)通過(guò)放松、一致性的ACID屬性,在擴展性方面可以得到更大的靈活性。采用BASE架構可以使數據庫最終達到一致。這可能只需要幾分鐘,甚至幾秒鐘,但在前面的例子中我們看到了,如果應用程序希望能夠“鎖定”數據,那么即使幾毫秒的不一致也會(huì )造成問(wèn)題。
放松時(shí)序約束可以重新設計我們的系統、從而使它能夠達到最終致性。用戶(hù)剛瀏覽過(guò)一個(gè)物品,不能確保該物品還存在。只有把該物品放入購物車(chē),應用才會(huì )鎖定數據,鎖定操作會(huì )在主寫(xiě)入副本或主數據庫中執行。由于我們具有ACID屬性、所以可以確保如果交易完成了,就可以把該物品的記錄標志為“鎖定的”、然后用戶(hù)就可以繼續放心購買(mǎi)了因為該物品已經(jīng)為他們保留了。而對其他瀏覽該物品的用戶(hù)來(lái)說(shuō),它則可能還有,也可能沒(méi)有了。
另一個(gè)常常發(fā)現時(shí)序約束的應用領(lǐng)域是轉移物品(錢(qián))或在用戶(hù)間通信。在單一數據庫中,很容易確保用戶(hù)A把錢(qián)、消息或物品轉移到了用戶(hù)B的賬戶(hù)。把數據分布到多個(gè)數據副本上,使得保持這種一致性變得很困難。解決這種問(wèn)題的方法是不要希望對即時(shí)轉移操作有時(shí)序約東。讓用戶(hù)A在看到用戶(hù)B轉給他的錢(qián)之前等待幾分鐘,是完全可以接受的原因很簡(jiǎn)單,轉移物晶的雙方通通常不會(huì )在系統中同步轉移物品。顯然與同步通信不同,如聊天。你很容易在網(wǎng)站設計系統中加人時(shí)序約束,因為看來(lái),這能提供最好的客戶(hù)體驗。但是,在添加時(shí)序約東前,最好考慮一下這樣做產(chǎn)生的長(cháng)期問(wèn)題,因為這種約東有可能使得系統擴展變得很困難。
本文地址:http://havencoinwallet.com//article/3467.html