ACID同CAP嘅分別?
近期好忙,因為公司要起新project,所以要不斷自學好多嘢。而其中一樣就係同database有關嘅,事源係新project喺想起d microservice,而service背後都會儲data。咁就當然會考慮用邊隻database。而依家市面上有好多選擇,relational database已經有好多,依家仲有一埋nosql database,同時nosql database又有好多唔同類型,例如key-value、column family、document、graph、等等等等。
咁要決定用邊隻就有好多因表例如:business data model,使唔使好快,會唔會有update動作,使唔使search,點search,使唔使做clustering同幾銀等等等等。但今次我想講嘅只係一細part,因為我發現我好多同事唔知咩係CAP同埋會同ACID搞亂咗。希望我喺度會可以解釋清楚你聽。😄
首先講過出名嘅先,ACID。WIKI其實都有詳細解釋,我就嘗試深入淺出講下。
- Atomicity
依個對好多情況好重要!有佢會令到一個transaction(小心,transaction係有分level,例如relational database可以做到唔同statements喺同一條transaction,但好多出名嘅document database就只可係document level transaction)一係全部得,一係全部唔得。
最出名嘅例子係櫃員機過數:我過錢俾你,我戶口扣咗錢,你戶口加錢。咁如果你戶口加唔到錢,理應我戶口就唔應該扣錢,咁只要扣錢同加錢喺同一個transaction度,就唔會出現扣咗錢但冇加到去人哋戶口嘅情況。 - Consistency
為咗可以令到data喺任何operation之後都唔會爛,為咗可以做到依點,所以relational database會有trigger、cascade、constraint等功能。
用返上邊個例子,每個戶口可以有上限係一千蚊,咁如果我過五百去你邊,扣錢嗰度就冇問題,但到你加錢嗰度,如果加五百後多過一千,咁個database就會鬧你同唔俾你做住依樣。同時如個依兩個動作係Atomicity(同一個transaction),咁我個戶口就會還原(rollback)。 - Isolation
同時我哋會預咗個database會喺同一時間俾好多人用,由其係依個係distrubited computing年代,technical d講就會要識處理concurrent case。要處理concurrent case其實唔難😎,如果大家都係對住同一個住做嘢,解決方法就係「等」。我做緊嗰時你就要等,咁當然你要話俾人知做緊嘢啦,方法就係我做之前睇下有冇做喺度開咗transaction,如果有,變相其實佢個lock咗依度。咁我就唯有等等佢完晒先做嘢。
又有上邊嘅例子,我又過錢俾你,但同時某某又過錢俾你,我喺個database就會叫某某個operation等等,當我個operation完成咗或者衰咗,咁某某個operation就會開始 - Durability
最後依個其實係common sense。用得database就梗係想佢唔會唔見咗,依個要求就係話當個database話你知你過數成功後,就算佢死機,佢都唔會冇咗你做過嘅嘢。
再再用上邊例子,我過完數俾你,點知database死咗,但當佢著返時,我個戶口過咗俾你嘅錢係不變,同時你都會收到嗰筆錢。
好啦,到新嘢,咁當然講講少少背景先,喺WIKI度可以知道CAP係講緊喺distributed computer system度我哋只可以做到是但兩個(即係CA、AP或者PC)。依樣嘢好緊要,因為我識好多同行係唔知道
- CAP同ACID其他係講繄唔同level嘅嘢
- CAP:cluster level
- ACID:single instance level
- 唔會有distributed database可以做晒CAP
同埋個「C」係唔同意思嘅,詳情如下:
- Consistency
依個Consistency係指cluster level,即係喺同一個cluster度,唔同嘅node之間會唔會儲咗唔同嘅嘢。例如我有十隻node,咁頭先我喺node 1度過咗數俾你,完成咗。喺distributed computer system,你係唔會知你去咗邊個node度,如是者我過咗數後,你去check,可能你會入咗node 2度,咁你當然會預你會睇到筆錢過咗入你戶口啦。依個要求就係CAP嘅Consistency。
而市面上大多數都係用eventually consistent,即係唔係即刻update晒全部node,而佢只係保證有朝一日全部node都會update咗。 - Availability
依個即係話佢一定會俾到反應你,即使唔係最update嘅。咁樣會令你唔會因為佢某一個node有事而令你做唔到樣。 - Partition tolerance
即使網絡有事,有d nodes之間communicate唔到,但佢哋各自都function到。喺依個情況就要做出取捨,一係要Consistency,一係要Availability。
希望大家睇完唔會再搞錯ACID同CAP啦。😎
Recent Posts