欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

REA模型實(shí)戰(zhàn):用資源事件代理建模積分結(jié)算系統(tǒng)

REA模型實(shí)戰(zhàn):用資源事件代理建模積分結(jié)算系統(tǒng) 做后端和架構(gòu)的同學(xué)應(yīng)該都對(duì)這種場(chǎng)景不陌生。業(yè)務(wù)方丟過(guò)來(lái)一句話“我們要上一個(gè)積分系統(tǒng)買東西得積分積分能抵現(xiàn)。”你第一反應(yīng)是建表用戶表、訂單表、積分表、流水表。等上線三個(gè)月財(cái)務(wù)說(shuō)要對(duì)賬你發(fā)現(xiàn)積分流水里只有加減沒有“這筆積分來(lái)自哪筆訂單、對(duì)應(yīng)哪次消費(fèi)、被誰(shuí)消耗”問題一下子全出來(lái)了。今天聊的REA模型就是專門用來(lái)解決這類建模問題的。REA全稱是Resource-Event-Agent資源-事件-代理是一套面向經(jīng)營(yíng)活動(dòng)的領(lǐng)域建??蚣懿唤壎ㄈ魏慰蚣芎驼Z(yǔ)言。這篇文章我會(huì)用一個(gè)積分結(jié)算系統(tǒng)的完整建模過(guò)程講清楚REA是什么、怎么建模、怎么落到存儲(chǔ)和查詢最后把實(shí)際踩過(guò)的坑一次說(shuō)清。適合正在做DDD落地、事件溯源以及賬戶、庫(kù)存、積分類系統(tǒng)的開發(fā)者參考。1. REA模型認(rèn)知為什么業(yè)務(wù)建模繞不開它1.1 三個(gè)要素和一個(gè)中心關(guān)系REA模型的三個(gè)核心詞匯展開來(lái)說(shuō)并不復(fù)雜。Resource資源凡是“有價(jià)值、可以衡量、能在業(yè)務(wù)中流動(dòng)”的東西都可以歸入這個(gè)范疇?,F(xiàn)金、庫(kù)存商品、積分、優(yōu)惠券、產(chǎn)能、維修工單中的工時(shí)都是資源。判斷標(biāo)準(zhǔn)很直接這個(gè)東西在業(yè)務(wù)里會(huì)不會(huì)被增加、減少、轉(zhuǎn)移如果會(huì)它就是Resource而不是什么普通實(shí)體或字典表。很多同學(xué)建模時(shí)把積分當(dāng)成“用戶的屬性”直接給用戶表加一個(gè)point字段這恰恰是問題的起點(diǎn)。積分本質(zhì)上是一種可流轉(zhuǎn)、可消耗、有歸屬的資產(chǎn)應(yīng)該被當(dāng)成Resource來(lái)建模。Event事件是發(fā)生在資源上的經(jīng)濟(jì)活動(dòng)。用戶支付、商品出庫(kù)、積分發(fā)放、優(yōu)惠券核銷都屬于Event。它記錄的是“發(fā)生了什么”而不是“現(xiàn)在是什么狀態(tài)”。平時(shí)做CRUD的時(shí)候我們習(xí)慣把賬號(hào)狀態(tài)從待支付改成已支付這是狀態(tài)的覆蓋而在REA里我們記錄的是“誰(shuí)在什么時(shí)間做了什么動(dòng)作”這個(gè)動(dòng)作不會(huì)因?yàn)闃I(yè)務(wù)狀態(tài)變化而被抹掉。Agent代理是參與經(jīng)濟(jì)活動(dòng)的人、系統(tǒng)角色或組織。用戶、供應(yīng)商、平臺(tái)、渠道商甚至一個(gè)負(fù)責(zé)積分過(guò)期任務(wù)的定時(shí)程序都可以是Agent。在REA模型里Agent不是簡(jiǎn)單的標(biāo)簽而是資源流向的歸屬方。每一筆資源變動(dòng)都必須能回答“這個(gè)資源從哪個(gè)Agent流出流入哪個(gè)Agent”。三者的關(guān)系是一個(gè)Event至少連接兩個(gè)Agent同時(shí)連接流入和流出兩類Resource。為什么必須有雙方因?yàn)槿魏我还P經(jīng)濟(jì)活動(dòng)要成立必然存在一方資源減少、另一方資源增加。如果模型中只看到一個(gè)Agent那說(shuō)明你記錄的很可能不是事實(shí)而是某個(gè)操作的結(jié)果快照。1.2 用一杯咖啡看懂REA用一個(gè)最生活化的例子來(lái)拆解比如“你花20元在咖啡店買一杯咖啡”。傳統(tǒng)建模會(huì)怎么寫訂單表記錄商品、金額、訂單狀態(tài)支付表記錄支付結(jié)果庫(kù)存表扣減庫(kù)存??雌饋?lái)邏輯完整但對(duì)賬時(shí)就會(huì)遇到一個(gè)經(jīng)典麻煩訂單顯示已支付財(cái)務(wù)的銀行流水里卻沒有這筆錢或者支付成功但訂單狀態(tài)沒被更新你說(shuō)不清是哪一步發(fā)生的、責(zé)任在哪一方。用REA模型這次交易要被拆成兩個(gè)獨(dú)立的經(jīng)濟(jì)Event。第一個(gè)Event是顧客付款。此時(shí)支付錢包這類Resource從顧客名下流出20元流入咖啡店的收款賬戶涉及到的Agent是顧客和咖啡店。第二個(gè)Event是咖啡交付。咖啡豆或已制作好的咖啡成品從咖啡店的庫(kù)存Resource中流出1杯轉(zhuǎn)入顧客名下涉及到的Agent同樣是顧客和咖啡店。這里一定會(huì)有人問一筆交易為什么要拆成兩個(gè)Event因?yàn)楦犊詈徒桓侗緛?lái)就是兩個(gè)獨(dú)立事實(shí)它們可能不是同一時(shí)刻發(fā)生。顧客觀看菜單后可能先付款再取貨也可能先取走咖啡后補(bǔ)付錢更可能付款后商家倒閉跑路根本拿不到咖啡。如果把兩者揉在一個(gè)訂單Event里后續(xù)處理退款、掉單對(duì)賬、庫(kù)存損耗時(shí)就會(huì)非常痛苦。拆開之后“顧客付了錢但沒拿到咖啡”可以定位到第一個(gè)Event已完成、第二個(gè)Event未發(fā)生“拿到咖啡但沒扣庫(kù)存”也可以從Event里直接查出來(lái)。這背后正是復(fù)式記賬的思路每一筆資源的流入必然對(duì)應(yīng)另一筆資源的流出兩邊都要有據(jù)可查。REA把這種會(huì)計(jì)思想搬到了軟件建模層面很多看似復(fù)雜的業(yè)務(wù)按這個(gè)邏輯梳理后核心關(guān)系會(huì)非常干凈。等等有人會(huì)問“我開發(fā)的是一個(gè)管理后臺(tái)不是財(cái)務(wù)軟件有必要這么較真嗎”確實(shí)不是所有系統(tǒng)都必要但凡是涉及資金、庫(kù)存、積分、兌換碼這類“資產(chǎn)型”數(shù)據(jù)的模塊如果沒有這一層事實(shí)記錄將來(lái)對(duì)賬、審計(jì)、排查數(shù)據(jù)異常時(shí)代價(jià)會(huì)成倍增加。我見過(guò)太多系統(tǒng)因?yàn)樵缙谑×诉@一步后期專門開發(fā)“審計(jì)模塊”“對(duì)賬系統(tǒng)”結(jié)果還是對(duì)不齊最后只能硬編碼各種補(bǔ)丁。1.3 傳統(tǒng)建模與REA建模的對(duì)照把傳統(tǒng)CRUD式的建模和REA建模放在一起對(duì)比區(qū)別會(huì)更直觀。對(duì)比維度傳統(tǒng)建模REA建模核心數(shù)據(jù)狀態(tài)字段比如訂單狀態(tài)不可變的經(jīng)濟(jì)事實(shí)流審計(jì)能力依賴操作日志經(jīng)常缺失環(huán)節(jié)事件天然全鏈路可回溯當(dāng)前余額/庫(kù)存直接查字段值通過(guò)投影計(jì)算可從事件推導(dǎo)業(yè)務(wù)擴(kuò)展需要改表結(jié)構(gòu)、加字段新增事件類型舊事件不動(dòng)冪等保障依賴狀態(tài)校驗(yàn)和鎖依賴事件的業(yè)務(wù)唯一性財(cái)務(wù)對(duì)賬另行開發(fā)對(duì)賬邏輯事件本身就是賬本傳統(tǒng)表結(jié)構(gòu)像給系統(tǒng)拍了一張又一張快照我們能看到的永遠(yuǎn)是當(dāng)前狀態(tài)REA更像一段完整錄像任何時(shí)間點(diǎn)的業(yè)務(wù)都可以被還原。數(shù)據(jù)庫(kù)字段里那個(gè)“訂單狀態(tài)已完成”更像一張抓拍照片而REA事件流里的“下單、支付、出倉(cāng)、簽收”是連續(xù)的事實(shí)序列。對(duì)需要追溯責(zé)任的業(yè)務(wù)來(lái)說(shuō)錄像比照片可靠得多。還不止如此。傳統(tǒng)建模中當(dāng)業(yè)務(wù)需求增加“積分可以跨訂單合并使用”的時(shí)候你要么給積分表加一大堆關(guān)聯(lián)字段要么再寫一套合并邏輯。但在REA里積分合并本質(zhì)上是一筆資源重組Event把兩個(gè)積分賬戶的資源結(jié)余轉(zhuǎn)移到一個(gè)新賬戶事件不改變舊積分賬戶的事實(shí)只是做一個(gè)新事件。這種擴(kuò)展方式對(duì)新老邏輯都比較溫和。1.4 REA與DDD、事件溯源的真實(shí)關(guān)系DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)這么多年都很火但很多團(tuán)隊(duì)落地時(shí)卡在同一個(gè)問題上通用語(yǔ)言怎么定義聚合根怎么劃分領(lǐng)域事件到底應(yīng)該記錄哪些內(nèi)容REA恰好給了一套可落地的詞法規(guī)范。DDD的“領(lǐng)域事件”在REA里對(duì)應(yīng)的是真正的經(jīng)濟(jì)Event而不是系統(tǒng)的每一步操作。比如“用戶點(diǎn)擊了積分明細(xì)頁(yè)”這種操作不算Event因?yàn)樗簧婕叭魏蜶esource的流入流出“用戶用100積分兌換了一張5元優(yōu)惠券”才是Event因?yàn)樗婕皟蓚€(gè)Agent用戶和平臺(tái)、兩類Resource積分和優(yōu)惠券。如果你的團(tuán)隊(duì)在做事件風(fēng)暴時(shí)總是吵不清楚哪些是領(lǐng)域事件引入REA的“雙Agent、雙Resource”校驗(yàn)一下子就能過(guò)濾掉大量噪音。事件溯源Event Sourcing落地時(shí)最常見的問題也是事件庫(kù)亂。有些團(tuán)隊(duì)把“狀態(tài)變更”都當(dāng)成事件存進(jìn)去結(jié)果事件流里魚龍混雜重放時(shí)根本還原不出業(yè)務(wù)。REA的約束正好解決了這個(gè)問題事件必須關(guān)聯(lián)資源、必須關(guān)聯(lián)雙向代理、必須描述經(jīng)濟(jì)活動(dòng)。不符合這三條的就不應(yīng)該進(jìn)事件庫(kù)。所以REA不是DDD的替代品也不是事件溯源框架的前置依賴而是它們之間的粘合劑。我個(gè)人的習(xí)慣是先用REA梳理領(lǐng)域詞表再做DDD的聚合設(shè)計(jì)最后用事件溯源來(lái)落地。順序?qū)α撕竺鏁?huì)順很多。2. 實(shí)操建模用REA給積分結(jié)算系統(tǒng)搭骨架2.1 從一個(gè)不過(guò)分的模擬項(xiàng)目開始為了把REA落地過(guò)程講得具體我假設(shè)自己正在為某社區(qū)團(tuán)購(gòu)平臺(tái)設(shè)計(jì)一套結(jié)算模塊業(yè)務(wù)規(guī)則一共有四條用戶可以用微信充值獲得平臺(tái)余額用戶在商城下單時(shí)用余額支付同時(shí)按支付金額的一定比例獲得積分用戶可以用積分兌換優(yōu)惠券優(yōu)惠券在下一次購(gòu)買時(shí)核銷。需要注意的是充值渠道和商品提供方是外部角色平臺(tái)本身也需要作為Agent進(jìn)入模型。拿到這個(gè)需求第一步不是寫代碼也不是畫架構(gòu)圖而是列事件清單。我把所有可能發(fā)生的經(jīng)濟(jì)活動(dòng)寫下來(lái)用戶發(fā)起充值、充值成功到賬、用戶下單、支付成功、訂單完成出庫(kù)、積分發(fā)放、積分兌換優(yōu)惠券、優(yōu)惠券核銷。事件清單不需要一次就完美后續(xù)隨業(yè)務(wù)梳理不斷補(bǔ)充但第一版必須包含業(yè)務(wù)方最關(guān)心的幾件事尤其是錢和商品的流轉(zhuǎn)。第二步對(duì)每個(gè)事件確認(rèn)它涉及的Resource和Agent。這里直接給出我梳理后的關(guān)系表這個(gè)表本質(zhì)上會(huì)成為后面領(lǐng)域模型和數(shù)據(jù)庫(kù)設(shè)計(jì)的基礎(chǔ)事件流入Resource流出Resource涉及Agent充值成功余額用戶外部資金平臺(tái)用戶、平臺(tái)支付成功下單商品貨權(quán)用戶余額用戶用戶、平臺(tái)訂單完成出庫(kù)商品庫(kù)存平臺(tái)商品在庫(kù)平臺(tái)平臺(tái)、供應(yīng)商積分發(fā)放積分用戶積分池平臺(tái)用戶、平臺(tái)積分兌換優(yōu)惠券優(yōu)惠券用戶積分用戶用戶、平臺(tái)優(yōu)惠券核銷優(yōu)惠券核銷記錄平臺(tái)優(yōu)惠券用戶用戶、平臺(tái)注意這里“商品貨權(quán)用戶”與“商品在庫(kù)平臺(tái)”是兩個(gè)不同的Resource。REA模型鼓勵(lì)把貨權(quán)和庫(kù)存分開看待因?yàn)橛脩粝聠魏筘洐?quán)雖然已經(jīng)轉(zhuǎn)移給用戶但商品仍然在平臺(tái)倉(cāng)管里直到出庫(kù)才減少庫(kù)存。很多庫(kù)存對(duì)不上的問題正是因?yàn)榘沿洐?quán)轉(zhuǎn)移和庫(kù)存減少混為一談。這個(gè)點(diǎn)在實(shí)際做電商系統(tǒng)時(shí)非常重要。第三步確定聚合邊界。我的方案是把“經(jīng)濟(jì)事件”作為獨(dú)立的不可變聚合根每個(gè)Agent的每個(gè)Resource類型對(duì)應(yīng)一個(gè)資源賬戶聚合比如UserAccount聚合里包含用戶的余額賬戶和積分賬戶平臺(tái)的資產(chǎn)品類賬戶單獨(dú)再建一個(gè)聚合。事件聚合負(fù)責(zé)產(chǎn)生事實(shí)賬戶聚合負(fù)責(zé)校驗(yàn)和投影兩者職責(zé)分離不混在一起。2.2 領(lǐng)域模型代碼骨架事件與賬戶分離按照上面的設(shè)計(jì)核心代碼可以拆成三層。Resource層比較簡(jiǎn)單它包含一個(gè)ResourceType和一個(gè)數(shù)量字段。Event層承擔(dān)事實(shí)記錄必須不可變。Agent層負(fù)責(zé)資源賬戶的承載。我用接近Java的偽代碼把它寫出來(lái)public class ResourceAccount { private AgentId agentId; private ResourceType resourceType; private long amount; // 以最小單位存儲(chǔ)比如“分” private int version; public void apply(EconomicEvent event) { // 先校驗(yàn)后變更 } } public class EconomicEvent { private EventId eventId; private EventType eventType; private Instant occurredAt; private ListEntry entries; public static class Entry { private AgentId agentId; private ResourceType resourceType; private long amount; // 流入記正數(shù)流出記負(fù)數(shù) private EntryDirection direction; } } public class Agent { private AgentId agentId; private AgentType agentType; private String name; }這里最核心的是EconomicEvent中的Entry列表。一個(gè)事件至少要有兩條Entry一條表示某Agent的某個(gè)Resource增加另一條表示另一個(gè)Agent的某個(gè)Resource減少。兩條Entry之間滿足金額守恒。比如充值成功事件一條Entry是用戶余額10000分另一條Entry是平臺(tái)外部資金-10000分。兩條金額加起來(lái)為0這個(gè)事件的完整性就初步得到保證。金額守恒看起來(lái)像會(huì)計(jì)學(xué)概念但它對(duì)系統(tǒng)質(zhì)量的作用非常直接。在傳統(tǒng)模型里一個(gè)不經(jīng)意的小Bug可能導(dǎo)致用戶余額憑空多出1分錢而在REA模型里事件本身自檢就能發(fā)現(xiàn)不平衡測(cè)試用例也更容易寫。我經(jīng)常說(shuō)REA等于把會(huì)計(jì)的“借貸平衡”內(nèi)置到了業(yè)務(wù)系統(tǒng)的核心數(shù)據(jù)結(jié)構(gòu)里。當(dāng)然代碼只是骨架真正能不能落地還取決于底層存儲(chǔ)和并發(fā)控制這部分放到第3章細(xì)說(shuō)。2.3 為什么資源單位必須是最小單位這個(gè)坑我踩過(guò)必須單獨(dú)拿出來(lái)講。早期做一個(gè)優(yōu)惠券計(jì)算功能時(shí)我用浮點(diǎn)數(shù)表示折扣比如0.88折結(jié)果計(jì)算過(guò)程中出現(xiàn)了0.30000000000004這類連自己都看不懂的數(shù)字后面所有對(duì)賬全部錯(cuò)位。這不是REA特有的問題而是所有涉及金額、積分、數(shù)量類業(yè)務(wù)都容易犯的錯(cuò)。在REA建模中所有Resource的數(shù)量都必須選擇整數(shù)類型以最小不可分割單位存儲(chǔ)。金額以“分”存儲(chǔ)積分以1個(gè)為單位庫(kù)存以“件”為單位。打折、匯率換算這些計(jì)算放到入賬之前處理一旦進(jìn)入Resource賬戶全部是整數(shù)。這個(gè)設(shè)計(jì)同時(shí)解決了兩個(gè)問題第一浮點(diǎn)數(shù)誤差從源頭消失第二審計(jì)時(shí)看到的每一筆事件都是完整的業(yè)務(wù)事實(shí)不會(huì)出現(xiàn)三條小數(shù)記賬記錄加起來(lái)不等于一條原始記錄的情況。另外Resource的流出方向我建議用direction字段而不是簡(jiǎn)單的正負(fù)號(hào)。正負(fù)號(hào)只有兩個(gè)方向但業(yè)務(wù)里還有“凍結(jié)”“解凍”“沖正”等狀態(tài)只用正負(fù)號(hào)表達(dá)很容易把數(shù)量與狀態(tài)混淆。庫(kù)存不足時(shí)如果系統(tǒng)錯(cuò)誤地產(chǎn)生一個(gè)負(fù)庫(kù)存光看數(shù)據(jù)根本判斷不出異常但如果direction明確標(biāo)記為“凍結(jié)失敗”異常就能被精準(zhǔn)定位。2.4 事件不可變與沖正機(jī)制很多同學(xué)第一次接觸REA時(shí)會(huì)問如果事件寫錯(cuò)了怎么辦用戶的余額被我用一個(gè)錯(cuò)誤事件扣掉了難道不能改掉那條事件嗎答案是原始事件永遠(yuǎn)不能改只能新增一個(gè)“沖正事件”來(lái)糾正。比如充值事件本來(lái)是100元結(jié)果系統(tǒng)錄入成了1000元你不能去修改那條充值事件而是要生成一條“充值沖正”事件把多出的900元從用戶余額里扣回來(lái)并關(guān)聯(lián)到被沖正的原事件ID。這個(gè)規(guī)則看上去死板卻保住了整個(gè)系統(tǒng)的底線。一旦事件可修改之前所有基于事件的審計(jì)、重放、對(duì)賬邏輯都會(huì)失去信任基礎(chǔ)。金融系統(tǒng)里為什么要求“記賬憑證不可涂改”因?yàn)閼{證一旦可改賬本就沒有意義了。REA在這個(gè)層面就是數(shù)字化時(shí)代的記賬憑證。事件不可變的另一個(gè)好處是可以在多系統(tǒng)之間可靠地同步數(shù)據(jù)。下游系統(tǒng)只需要按事件ID增量拉取不需要關(guān)心上游是否修改過(guò)數(shù)據(jù)即使下游處理失敗重新消費(fèi)冪等性也可以通過(guò)事件唯一ID保證。這是事件驅(qū)動(dòng)架構(gòu)中一個(gè)很實(shí)用的基礎(chǔ)設(shè)計(jì)。3. 從模型到落地事件存儲(chǔ)、快照與查詢投影3.1 事件存儲(chǔ)表結(jié)構(gòu)怎么設(shè)計(jì)模型最終要落到存儲(chǔ)。在數(shù)據(jù)量不大時(shí)完全可以用普通關(guān)系型數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)事件存儲(chǔ)而不必一上來(lái)就引入專門的事件溯源中間件。我用PostgreSQL風(fēng)格的表結(jié)構(gòu)來(lái)說(shuō)明但換成MySQL也成立。核心就兩張表一張保存事件流元數(shù)據(jù)一張保存每個(gè)具體事件的數(shù)據(jù)。CREATE TABLE event_streams ( id BIGSERIAL PRIMARY KEY, aggregate_type VARCHAR(64) NOT NULL, aggregate_id VARCHAR(64) NOT NULL, version INT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE (aggregate_type, aggregate_id, version) ); CREATE TABLE events ( id BIGSERIAL PRIMARY KEY, stream_id BIGINT NOT NULL REFERENCES event_streams(id), version INT NOT NULL, event_type VARCHAR(128) NOT NULL, event_id VARCHAR(64) NOT NULL UNIQUE, payload JSONB NOT NULL, recorded_at TIMESTAMPTZ NOT NULL DEFAULT now() );這里的event_streams表代表一個(gè)聚合的版本序列。version字段是遞增的整數(shù)每次追加新事件時(shí)必須指定基于哪個(gè)version寫入。如果兩個(gè)并發(fā)請(qǐng)求都用version3去追加下一個(gè)事件數(shù)據(jù)庫(kù)的唯一約束就會(huì)讓其中一個(gè)失敗沖突在源頭被攔下來(lái)。events表的event_id是這個(gè)事件的業(yè)務(wù)唯一ID不是自增主鍵。比如支付成功事件的事件ID就是支付流水號(hào)充值沖正事件的事件ID就是沖正單號(hào)。加上唯一約束后即使消費(fèi)者重復(fù)投遞消息數(shù)據(jù)庫(kù)也會(huì)把重復(fù)事件擋在外面這是冪等性的最后一道保險(xiǎn)。我見過(guò)不少團(tuán)隊(duì)把事件和業(yè)務(wù)數(shù)據(jù)混在一起事件表里既存原始事實(shí)又存當(dāng)時(shí)算出來(lái)的余額結(jié)果重放時(shí)數(shù)據(jù)結(jié)構(gòu)混亂。記得原則Event只存事實(shí)數(shù)據(jù)比如數(shù)量、單價(jià)、關(guān)聯(lián)訂單號(hào)所有可推導(dǎo)的余額、庫(kù)存、狀態(tài)全部放投影不要放事件。3.2 快照策略與應(yīng)用恢復(fù)事件存儲(chǔ)解決了事實(shí)保存但性能上不能無(wú)限依賴“從頭重放所有事件”。假設(shè)一個(gè)用戶賬戶有10萬(wàn)條積分流水每次加載賬戶狀態(tài)都要重放10萬(wàn)次系統(tǒng)必然扛不住。這時(shí)候需要快照??煺站褪蔷酆显谀硞€(gè)版本時(shí)刻的完整存檔?;謴?fù)時(shí)只從最近的快照開始重放后續(xù)事件而不是從零開始。比如用戶賬戶已經(jīng)發(fā)生10萬(wàn)條事件系統(tǒng)每100條生成一個(gè)快照那么恢復(fù)時(shí)最多重放100條性能得到了數(shù)量級(jí)提升。快照的生成策略要兼顧實(shí)時(shí)性和成本。我常用的方案是在追加事件的事務(wù)里判斷當(dāng)前版本號(hào)是否達(dá)到“上次快照版本100”如果達(dá)到了就在同一事務(wù)里把聚合狀態(tài)序列化后寫入快照表??煺找部梢耘浜隙〞r(shí)任務(wù)做但要注意版本對(duì)齊避免快照版本與事件版本不一致導(dǎo)致重放重復(fù)或缺失。CREATE TABLE snapshots ( stream_id BIGINT NOT NULL REFERENCES event_streams(id), version INT NOT NULL, state JSONB NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (stream_id, version) );讀取聚合狀態(tài)時(shí)先取版本號(hào)最大的快照再加載該版本之后的所有事件順序重放得到最新狀態(tài)??煺兆鳛閮?yōu)化手段不能取代事件本身如果快照損壞最多重建一個(gè)空聚合重放全量事件不影響數(shù)據(jù)正確性。3.3 查詢投影別拿事件庫(kù)當(dāng)查詢庫(kù)事件庫(kù)和普通業(yè)務(wù)庫(kù)的查詢特性完全不一樣。事件表的寫入是追加式?jīng)]有任何update拿它來(lái)做“查詢用戶當(dāng)前余額”這類高頻業(yè)務(wù)請(qǐng)求非常不適合。正確做法是建立查詢投影用一份獨(dú)立的讀模型來(lái)服務(wù)查詢。還是說(shuō)積分系統(tǒng)的例子。我可以建一張賬戶余額讀模型表專門用來(lái)支撐業(yè)務(wù)查詢CREATE TABLE account_balance_read_model ( user_id VARCHAR(64) PRIMARY KEY, balance_amount BIGINT NOT NULL, total_points BIGINT NOT NULL, coupon_count INT NOT NULL, updated_at TIMESTAMPTZ NOT NULL );這張表的數(shù)據(jù)不直接寫入業(yè)務(wù)邏輯而是由事件訂閱者異步更新。充值成功、支付成功、積分兌換等事件發(fā)布后訂閱者收到消息重新計(jì)算該用戶的最新余額和積分然后更新表中的記錄。查詢接口只讀這張表響應(yīng)速度很快。這個(gè)寫模型與讀模型分離的思路本質(zhì)上就是CQRS。REA和CQRS天然合拍REA負(fù)責(zé)把寫側(cè)變成一串不可變的事實(shí)CQRS負(fù)責(zé)把讀側(cè)變成面向業(yè)務(wù)場(chǎng)景的投影。在寫側(cè)我們強(qiáng)調(diào)一致性、完整性和審計(jì)能力在讀側(cè)我們強(qiáng)調(diào)查詢性能和響應(yīng)速度。兩者互不拖累。需要注意的是投影更新存在“最終一致”窗口事件寫入后到讀模型更新完成前用戶可能看到舊數(shù)據(jù)。對(duì)大多數(shù)積分、余額業(yè)務(wù)來(lái)說(shuō)這個(gè)時(shí)間差可以接受如果業(yè)務(wù)要求強(qiáng)一致可以在同一個(gè)事務(wù)里同時(shí)更新事件表和投影表代價(jià)是寫入延遲升高。我剛落地REA時(shí)只顧著保證事件一致性忘了設(shè)計(jì)讀模型結(jié)果上線后接口響應(yīng)慢得沒法看后來(lái)補(bǔ)了投影表才解決問題。3.4 冪等、并發(fā)控制與重試事件驅(qū)動(dòng)系統(tǒng)里的冪等性遠(yuǎn)比單體CRUD里需要考慮得多。同一個(gè)支付成功事件可能因?yàn)橄⒅虚g件重投、下游服務(wù)重啟等原因被處理兩次。如果沒有冪等保護(hù)用戶的300元可能被入賬兩次積分翻倍優(yōu)惠券重復(fù)發(fā)放。冪等的第一道防線在事件唯一鍵上。我用支付回調(diào)里的平臺(tái)流水號(hào)作為eventId數(shù)據(jù)庫(kù)對(duì)eventId加唯一索引重復(fù)插入必然失敗。第二道防線在賬戶聚合的版本號(hào)上。每個(gè)賬戶記錄當(dāng)前version更新時(shí)必須攜帶期望version如果version對(duì)不上說(shuō)明有其他事件已經(jīng)先入賬當(dāng)前請(qǐng)求需要重新加載最新狀態(tài)再合并計(jì)算。這里給出一個(gè)典型的寫入流程偽代碼public void processPayment(PaymentReceivedEvent event) { for (int retry 0; retry 3; retry) { AgentAccount account accountRepository.load(userId); if (eventStore.exists(event.getEventId())) { return; // 已經(jīng)處理過(guò)直接忽略 } try { account.apply(event); accountRepository.save(account, account.getVersion()); eventStore.append(event); return; } catch (VersionConflictException ex) { // 說(shuō)明有并發(fā)事件先寫入重新加載重試 } } throw new RecoverableException(concurrent payment processing); }這個(gè)寫法里事件唯一鍵保證了重復(fù)消息不會(huì)入賬版本沖突保證了并發(fā)更新不會(huì)互相覆蓋。我實(shí)際測(cè)試過(guò)即使兩個(gè)線程同時(shí)收到同一事件最終也只有一個(gè)線程能成功寫入另一個(gè)會(huì)在下一輪重試時(shí)發(fā)現(xiàn)事件已存在并退出。這套機(jī)制簡(jiǎn)單可靠比分布式鎖輕量很多。4. 復(fù)盤避坑REA落地時(shí)最常踩的6個(gè)坑4.1 坑一把派生數(shù)據(jù)混進(jìn)事件里這是REA建模中最典型的錯(cuò)誤幾乎每個(gè)初學(xué)的人都會(huì)犯。有人設(shè)計(jì)“用戶支付”事件時(shí)除了記錄支付金額、訂單號(hào)還會(huì)加一個(gè)字段叫“支付后余額”目的是查詢方便。結(jié)果事件溯源重放到最后一筆時(shí)發(fā)現(xiàn)余額和真實(shí)余額差了10元。為什么因?yàn)樵缙诘哪硹l事件里的“支付后余額”算錯(cuò)了而這個(gè)錯(cuò)誤在之后的N條事件里被當(dāng)成基礎(chǔ)數(shù)據(jù)繼續(xù)疊加。正確做法是事件只記錄業(yè)務(wù)事實(shí)支付了多少錢、來(lái)自哪個(gè)訂單、發(fā)生于何時(shí)。用戶支付后的余額是多少由投影計(jì)算得出不能寫進(jìn)事件。把這個(gè)原則記住你的事件流就能永遠(yuǎn)保持純凈和可重放。4.2 坑二漏掉系統(tǒng)自動(dòng)任務(wù)的Agent身份有一類特殊Agent特別容易被遺漏——系統(tǒng)本身。比如平臺(tái)規(guī)定“90天未使用的積分自動(dòng)過(guò)期”這個(gè)定時(shí)任務(wù)每天掃描積分賬戶并執(zhí)行過(guò)期操作。很多建模者覺得它不是人就不給它Agent身份。結(jié)果積分過(guò)期后業(yè)務(wù)審計(jì)想查“誰(shuí)的積分被清了、為什么被清”時(shí)事件流里只有一個(gè)資源減少記錄沒有任何Agent承擔(dān)責(zé)任。正確做法是把“積分過(guò)期服務(wù)”或者“系統(tǒng)管理Agent”納入模型給它分配一個(gè)AgentId。事件里的雙向Agent就變成了“用戶”和“系統(tǒng)管理Agent”。這樣審計(jì)時(shí)才能回答這筆積分是用戶主動(dòng)兌換掉還是被規(guī)則自動(dòng)清理的規(guī)則歸屬哪個(gè)系統(tǒng)服務(wù)。4.3 坑三濫用浮點(diǎn)數(shù)處理金額和積分這個(gè)坑前面已經(jīng)提過(guò)但值得放進(jìn)避坑清單里再次強(qiáng)調(diào)。任何Resource的入賬和出賬都使用以最小單位為基準(zhǔn)的整數(shù)。打折、匯率、稅率等計(jì)算全部放在事件入賬之前計(jì)算結(jié)果必須四舍五入到最小單位后再進(jìn)入事件。如果某天計(jì)算結(jié)果出現(xiàn)0.1個(gè)積分業(yè)務(wù)上要么向下取整要么單獨(dú)生成一個(gè)“零頭積分”的Resource絕不能讓一個(gè)小數(shù)出現(xiàn)在賬戶流水里。4.4 坑四事件表膨脹查詢性能失控事件存儲(chǔ)的量級(jí)和普通業(yè)務(wù)表完全不一樣。一個(gè)用戶一年可能產(chǎn)生上千條積分流水一個(gè)平臺(tái)一年就是上億條。如果不做任何優(yōu)化任何一次加載聚合狀態(tài)都要掃描幾十萬(wàn)條數(shù)據(jù)系統(tǒng)會(huì)卡到?jīng)]法用。解決方案有分層第一層是快照把上千條事件壓縮到最多回放100條第二層是歸檔把超過(guò)3個(gè)月的舊事件歸檔到冷存儲(chǔ)業(yè)務(wù)查詢走投影表只在審計(jì)、對(duì)賬、糾紛處理時(shí)查冷數(shù)據(jù)第三層投影表本身也要定期清理和壓縮避免重復(fù)投影數(shù)據(jù)越來(lái)越多。記住一條事件庫(kù)是“真相”投影模型才是“讀接口”不要讓用戶請(qǐng)求直接親吻事件庫(kù)。4.5 坑五團(tuán)隊(duì)不認(rèn)可新模型方案被噴成過(guò)度設(shè)計(jì)REA落地最大的阻力往往不是技術(shù)而是團(tuán)隊(duì)協(xié)作。業(yè)務(wù)方會(huì)覺得你繞了一大圈明明一張訂單表就能解決的問題你非要拆成幾個(gè)事件和賬戶開發(fā)同事會(huì)覺得這套模型復(fù)雜要學(xué)新的概念還要寫一套以前沒寫過(guò)的代碼。我的建議是不要試圖一次性全面鋪開。先挑一個(gè)最痛的點(diǎn)比如財(cái)務(wù)月結(jié)算對(duì)不上賬、積分明細(xì)查不清用REA做一個(gè)影子模塊和舊系統(tǒng)并行跑一段時(shí)間用報(bào)表比對(duì)新舊模型的結(jié)果。當(dāng)數(shù)據(jù)證明舊模型有缺失、新模型能精準(zhǔn)還原后團(tuán)隊(duì)自然會(huì)接受。技術(shù)方案存在的最終目的是解決問題不是證明誰(shuí)更高級(jí)。如果想靠“這個(gè)模型很經(jīng)典很權(quán)威”來(lái)說(shuō)服團(tuán)隊(duì)阻力只會(huì)更大。4.6 坑六把REA當(dāng)成萬(wàn)能銀彈最后一條坑是反過(guò)來(lái)走向極端什么系統(tǒng)都往REA上套。一個(gè)簡(jiǎn)單的用戶配置管理系統(tǒng)只有查詢和修改既不涉及資源流轉(zhuǎn)也不需要審計(jì)對(duì)賬硬套R(shí)EA只會(huì)增加無(wú)意義的復(fù)雜度。判斷是否該用REA的標(biāo)準(zhǔn)很簡(jiǎn)單業(yè)務(wù)里是否存在多方資源流轉(zhuǎn)、是否存在審計(jì)追溯訴求、當(dāng)前狀態(tài)是否依賴歷史事實(shí)推導(dǎo)如果三個(gè)都否普通CRUD可能就夠用了。我自己的經(jīng)驗(yàn)是REA最適合的場(chǎng)景是“用戶持有資產(chǎn)型數(shù)據(jù)”的業(yè)務(wù)錢包、積分、優(yōu)惠券、庫(kù)存、配額。這類業(yè)務(wù)中的數(shù)據(jù)不僅是一個(gè)字段更是一種有生命周期、有歸屬方、可流轉(zhuǎn)的資產(chǎn)。判斷清楚再上模型會(huì)給你帶來(lái)巨大回報(bào)判斷不清楚硬上就會(huì)變成過(guò)度設(shè)計(jì)。最后把六個(gè)坑整理成速查表方便排查時(shí)對(duì)照坑位問題表現(xiàn)解決思路派生入事件重放結(jié)果與真實(shí)余額不一致事件只記錄原始事實(shí)漏掉系統(tǒng)Agent自動(dòng)過(guò)期等操作無(wú)責(zé)任方補(bǔ)建系統(tǒng)Agent浮點(diǎn)數(shù)量計(jì)算誤差導(dǎo)致對(duì)賬失敗全部使用整數(shù)最小單位查詢撞事件庫(kù)響應(yīng)越來(lái)越慢用快照投影歸檔團(tuán)隊(duì)阻力方案被質(zhì)疑影子運(yùn)行用數(shù)據(jù)說(shuō)話過(guò)度設(shè)計(jì)簡(jiǎn)單CRUD也套R(shí)EA先評(píng)估業(yè)務(wù)是否匹配寫在最后一個(gè)實(shí)用體會(huì)。我最早接觸REA時(shí)也覺得一個(gè)訂單要拆成好幾個(gè)事件實(shí)在太繞。直到后來(lái)一次對(duì)賬財(cái)務(wù)要我說(shuō)清楚“某用戶1月5日20點(diǎn)03分用余額買了一箱牛奶之后余額去哪了、積分發(fā)了多少、是否存在資金漏洞”傳統(tǒng)模型里的訂單狀態(tài)和流水表根本理不清是REA幫助我從事件流里逐條還原把資金鏈路完整講了出來(lái)。從那以后凡是涉及錢、庫(kù)存、積分這類模塊我都會(huì)先問自己一句我建的是狀態(tài)還是事實(shí)如果只能給一條建議那就是在建模第一周先用Excel把所有事件、資源流入流出、Agent列成一張大表把關(guān)系徹底捋順了再寫代碼。這個(gè)笨辦法比畫100張架構(gòu)圖都有效。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品美女久久久久AV超清 | 久久99jiu9| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 五月婷婷天天| 综合色网站| 婷婷婷婷婷婷婷婷| 999婷婷综合| 另类小说色婷婷| 一区无码| 久8色色| 婷婷久久网| 欧美丁香婷婷天天操| 99亚洲天堂| 天天射美女| 吊色AV男人的天堂| 国产无套精品一区二区| 久1色色| 色情综合| 综合视频五月| 五月天激情图片网| 天天草天天爽| 婷婷丁香人妻天久久| 久久怡红院| 久久这里这里有精品免费视频| 亚洲人人操| 蜜乳人妻一区二区三区| 色婷婷九月| 大香蕉啪啪啪| 91九色PORNY肉丝在线| 性色视频| 日本精品99网站| 丁香五月成人| 五月婷婷丁香六月在线| 婷婷五月色综合| 欧美一级色| 亚洲国产精品成人免费一区久久久在线观看AAAA | 性生生活大片又黄又| 99在线观看亚洲| 校花娇喘呻吟校长陈若雪视频 | 思思热天天看| 色伦专区97中文字幕| 五月丁香啪啪综合网| 亚洲色99综合天堂| 五月天激情四射| 亚洲色婷婷婷婷人人爽| 午夜日韩久久久网站| 亚洲国产成人在线| 久久99热精品a片在线观看| 精品一区久热| 99视频精品| 色五月av| 97婷婷五月激情六月丁香伊人| 久久99色色| 狠狠丁香| 久色激情| 丁香五月欧美激情| 这里只有精品视频一区| 97婷婷色| 亚洲无码色| 伊人婷婷99热精品| 婷婷五月天美女21p| 丁香五月婷婷激情四射| 国产XXXX搡XXXXX搡麻豆| 五月婷六月综合在线观看| 丁香五月激情综合| 丁香五月av| 色五月婷婷中文字幕在线观看 | 性爱久久| 精品色色| 能看的AV网站| 99久视频| 成人毛片在线免费观看| 高潮毛片又色又爽免费| 亚洲激情网| 色吧五月婷婷| 欧美激情五月| 天天爽,天天操。| 久久综合影院| 色青五月天| 极品人妻VIDEOSSS人妻| 日本va欧美va国产激情| 日本操碰碰| 激情网婷婷婷| 秋霞电影理论| 婷婷色色综合激情| 婷婷色五月婷婷姐妹| 激情丁香五月AV| 大战熟女丰满人妻AV| 热久久91| 久99久在线| 人人草人人视| 婷婷五月天日本无码| 性爱网久久| 9热在线视频| 国产AV影片| h在线看免费版在线看| www.日本91| 亚洲激情精品| 人人视频色| 26uuu色噜噜精品一区| 激情综合国产| 婷婷人人操| 伊人大香蕉综合在线| 色伊人91在线视频| 日本韩国视频在线观看社区免费的9| 久久婷婷亚洲| 99网| 九九婷| 五月婷婷六月丁香| 成人国产欧美大片一区| 国产毛片精品一区二区色欲黄A片| 超碰免费人人| 激情五月婷婷网| 亚洲AV中文在线| 人。妻久久| 色五月激情基地| 久久激情综合| 99秘 在线| 三区激情四射av| 天天操夜夜爽天天操| 好看的国产精品| 97热这里精品在线视频| 在线看片av| 色色五月天婷婷丁香| 天啪色| 亚洲最大视频网站| 91色在线 | 日韩| 激情性爱婷婷| 99久久新视频| 国产精品久久..4399| 婷婷五月丁香啪啪| 思思热久久阴99| 天天五月香欧美| 色噜噜狠狠色综| 九九碰九九爱97| 99日本精品视频热| 色人五月婷婷| 丁香五月亚综合图片| 婷婷丁香色五月久久88| 久久伊人五月天| 五月丁香六月综合激情无码软件亮点 | 丁香五月天在线| 五月婷视屏在线观看| 婷婷干五月综合在线播放| 天天撸天天干天天插| 激情五月天激情综合网| 超碰人人干| 婷婷的色色五月天| 99热综合网| 婷婷五月天基地| 玖玖在线视频| 在线色婷婷| 色色丁香五月天社区| 五月婷婷,狠狠操| 中文精品在| 丁香六月综合激情| 色青五月天| 色久激情在线| 精品在线网站| 精品久久9| 1024日韩| 无码 av电影| 久久婷婷综合五月| 丁香激情五月少妇| 91超碰九色| 99热 这里只有精品 国产 日韩| 免费的日逼视频| 婷婷久久免费看| 婷婷六月开心网| 国产五月天激情小说| 日韩激情人伦人| 互月天综合| 婷婷五月天黄色小说| 色欲一区二区三区精品A片| 激情五月丁香亭亭| 狼友视频在线观看18| 中文av网| 99在线看视频| 欧美激情综合| 99九九精品视频| 强伦轩人妻一区二区电影| 五月丁香自拍| 五月天激情网图片 - 百度| 噜噜噜噜在线| 久久五月天色婷婷| 97操操网| 99福利导航| 激情美女五月天| 99成人无码| 天天日本夜夜谢| 丁香五月婷婷基地| 亚洲AV无码成人电影| 婷婷欧美激情| 夜夜www| 婷婷五月色情天| 婷婷综合五月| 在线sebiav精品视频| 久久久jd| 色停停影院五月天| 五月天激情四射| 久久er九九| 深爱1激情网| 天天日天天干天天操| 婷婷精品| 啪啪东京热| 色欲丁香| 99热免费看| 六月婷婷中文字幕| 激情丁香久久| 婷婷激情五月天在线视频| 婷婷五月天无码| 九九av| 日韩在线观看网址| 五月天开心激情网色欲无码| 天天草天天摸| 久久久亚洲精品一区二区三区浴池| 大香蕉75线| 婷婷激情五月天网站| 五月天五月天激情网| 伊人久久婷婷| 婷婷丁香成人五月天| 26uuu.| a久久| 中国女人做爰A片| 色情婷| 五月丁香色五月| 国产成人高清| 国产婷婷久久| 婷婷五月丁香综合人妻| 俺去也婷婷| 色播五月综合网| 色综合色综合婷婷热| 99亚洲精品视频| 婷色五月天| 偷偷操99| 六月丁香成人网| 中文av网| 色婷婷97| 久久色五月| 久久免费高| 五月婷婷黄色| 99自拍视频网站| 热久久这里只有三级视频| 激情网五夜婷婷| 七七色色综合| 国精产品一区二区三区| 丁香五月综合在线视频| 久久久久久久久月丁| 色色综合色视频| 五月天色社区| 九九九九中文字幕| 九九在线这里只有精品视频| 刘玥精品一区| 五月涩涩网| 色999亚洲人成色| 久久六月天| 999热这里只有精品| 99久| 婷婷色爱| 亚洲成人丁香花| 天天摸夜夜爽天天做| 九九99精品视频在线观看| 性爱人人网| 婷婷干五月综合在线播放| 国产婷婷色综合AV蜜臀AV| 性爱综合网| 91美女被操| 九九综舍久久| 丁香五月综合激情性爱| 99亚洲精品视频| 亚洲另类视频| 久久视频婷婷| 五月婷婷,狠狠操| 91成人看| 婷婷五月六月丁香| 久婷婷五月综合欧美| 在线综合网| 国产探花一片区| 五月丁香AV在线| 乱乱av| 玖玖在线资源视频| 男同91| 能看的AV网站| 久久99免费视频网站| 五月开心激情网| 色五月AV| 97婷婷丁香五月| 丁香激情五月| 中文不卡一二区| 婷色天堂| 婷婷狠狠色| 久久9情免费| 日日日影院| 七月丁香五月婷婷在线| 激情亚洲网| 亚洲影院婷婷色| 天天爱夜夜爽| 9久久AV| 久久久久亚洲AV无码网影音先锋| www.久久| 五月色情| 婷婷丁香基地在线| 九九综合网色全集 | 午夜天堂一区人妻| 丁香五月天啪啪激情综和网| 99人人看| 五月婷婷六月激情| 色色色欧美色色| 狠狠色综合图片| 99操逼| 丁香五月婷婷大香蕉| 大香蕉久久久| 国产色色网站网址| 97碰碰草| 九九99热| 久久66er久久| 麻豆忘忧草午夜| 婷婷五月色播| 久久婷婷丁香五月一二三| 97超碰婷婷五月天| 操九色| 天天做天天爱高潮片| 中字幕视频在线永久在线观看免费| 99精品久久久久久久婷婷久久| 日韩啪图| 日日夜夜狠狠| 熟女激情五月天 | 久9热在线免费观看| 色色射| w婷婷五月婷婷w| 婷婷丁香熟妇综合网| 99综合一区| 超碰爱爱爱| 91欧美| 第六色在线| 色婷婷最新域名| 色婷婷成人| 婷婷天天综合| 亚韩在线视频| 综合网天天| 欧美日韩aaaa| 丁香婷婷六月婷婷六月婷婷六月婷婷| 嫩草视频。| 婷婷的久久网站| 激情亚洲五月| 97色婷婷五月天| 中国女人做爰A片| 亚洲中文乱字字幕在线永久| 狠色狠色狠狠色综合网| 五月丁香婷婷啪啪综合| 禁欲电影完整版在线播放| 六月婷婷久久大全| 色色色在线免费视频| 婷婷五月激情综合啪啪| 中字幕视频在线永久在线观看免费| 日本颜色视频人人爱| 99热99色| 欧美激情久| 五月天com| 99re思思热久久| 天天色综合天天| 丁香五月天亚洲综合| 天天色粽合合合合合合合| 97丁香五月| 欧美va精品va老师va| 黄色aa观看aaguochan| 天天插综合| 五月开心色| site:xmssd.com| 九色综合五月天婷五月| 99热.com| 人人干99| 狠狠干五月天| 日韩在线五月天婷婷| 激情深爱婷婷网| 久久视频婷婷| 亚洲色图啪啪| 国成人网| 99热99艹在线观看| 成人短视频在线观看| 婷婷中文无码| 五月婷婷六月丁香五月| 99国产在线| 天天操,天天插| 丁香六月婷婷开心| 天天综合网、天天综合色| 影音先锋91资源站| 日本WWW九九九| 久久久9久| 欧美爆乳一区二区三区| 深爱开心五月天| 丁香五月激情婷婷视频| 超碰91av| 色婷婷情片| 婷婷五月丁香综合桃花色网| 青吴乐视频| 婷婷成人基地| 国产在线aaa片一区二区99| 色优久久| 五月天啪啪啪| www.久久久久久久| 久久久久久激情| 婷婷五月天AV| 色婷婷亚洲婷婷在线观看| 色情五月天婷婷| 99 这里只有精品| 五月丁香综合网色欲| 啪啪激情综合| 99热99色| 久久精典| 丁香婷婷五月份| 亚洲精品色| 色香欲综合| 九九色逼| 久久五月天综合| 99热国产这里只有精品| 亚洲综合五月天| 五月婷婷综合网| 超碰久热| 丰满少妇乱A片无码| 99re热视频这里只精品| 涩丁香| 婷婷无五月无码视频| 国产日韩精品SUV| 国产乱子轮XXX农村| 天天做天天爱天天高潮| 三人荫蒂添的好舒服A片| 国产又黄又爽又色的免费| www.色婷婷| 人妻丰满精品一区二区A片| 亚洲激情网| 国产乱子轮XXX农村| 超碰人妻公开在线| 婷综合六月| 九月久久婷婷| 九九99精品| 久久五月天精品视频| 亚洲黄色影视| 激情五月六月丁香| 色五婷婷在线视频| 9.1综合网| 99国产er热视频| 亚洲性爱干干| 99爱在线视频观看| 婷婷永久在线| 男女啪啪做爰高潮无遮挡| 丁香性爱在线视频| 成人毛片在线免费观看| 91精品久久久久| 狠狠狠婷婷五月综合| 丁香六月婷婷高清| 人妻久久久| 玖玖综合色| www.超碰在线| yw.av| 99热99极品观看| 五月丁欧美| 五月天婷婷导航| 色色色热| 色综合久| 91精品丝袜久久久久久久久粉嫩| 欧美内射AA| 情情五月天色| 99热这里只有精品9| 五月色综合| 五月丁香亭亭电影久久| 丁香蜜臀黄色婷婷五月天| www.天天干.com| 色爱终和网| 久久久久婷| 91Chinese在线| 欧美偷偷操| 久久综合干| 成人五月天在线视频在线观看| 狠狠插日日干撸| 91丨九色丨国产打屁股| 丁香五月色情av| 色五婷婷| 久噜久噜| 丁香婷婷色五月| 丁香五月婷婷啪啪视频| 99er这里只有精品| 色色色99| 97超碰,人人舔,人人操,人人摸 | 色情五月婷婷| 精品女人九九九| 久久精品小视频| 99视频九九热| 久久男人网婷婷| 99re99在线看| 美欧成人视频| 五月丁香综合网| 五月丁香综合网色欲| 日韩视频99| 欧美日综合| 极品另类| 激情丁香五月婷婷啪啪| 99视频| 久久总和99| 五月综合精品| 久久精品99国产精品日本| 98色花堂98t.R| 色在线五月天免费| 97 A I色色| 国产免费av在线| 天天开心AV色综合婷婷五月天| 日韩另类| 婷婷大乡焦噜噜| 天天干狠狠艹| 婷婷色色综合| 精品一区二区三区四区五区六区介绍 | 丁香五月停停av| 六月色伊人婷婷| 2020日日干| 亚洲图色五月天| 六月丁香深深爱| 六月丁香婷| 情一色一乱一伦一91A| 丁香婷婷久久老熟女综合网| 中文字幕永久在线| 99爱这里只有精品| www.婷婷五月| 超碰在线免费| 在线中文亚洲| 婷婷综合在线播放| 可以看的AV| 99久久偷拍视频| 婷婷六月色情| 成人av在线网| 99热最新网址| 91妻人人爽人人看片| 婷婷欧美色| 国产免费一区二区在线A片视频| 婷婷丁香社区| 这里只有精品在线视频在线观看| 99热黄| 国产精品视频久久99| 日本三级大片| 免費亭亭成人| 国产午夜精品一区二区三区嫩草| 激情涩涩网| www.minyis.com【JT】实力收量可预付QQ2101460746 | 色综合99无码 | 91色久| 在线综合网| 99热福利| 成人片在线播放| 中文字幕日韩成人| 激情五月天视频| 蜜臀99久久精品久久久久| 国产VA亚洲VA96| 色婷婷yy久| 婷婷5月九九| 九九九九热99超碰| 五月天狠狠| 成年视频免费观看| 91九色精品| 先锋资源91| 大香蕉久久婷婷| 久久伊人婷婷| 夜夜躁爽日日| 五月婷婷狠天天色综合| 影音先锋日本三级资源| 伊人色综在线| 亚洲免费av观看| 91人操| 99久久婷婷国产综合| 99久久9| 激情美女五月天| 中文字幕欧美日韩VA免费视频| 婷婷五月在线综合| 亚洲第一成人无码A片| 久久这里只有精品无码| 极品五月天| 五月天偷拍| 久久久99视频| 国产欧美性成人精品午夜| 亚洲精品久久久久久久久久吃药| 婷婷五月天大香蕉在线视频观看| 五月综合久久| 丁香五月激情啪啪| 丁香色婷婷色手机免费在线| 欧美婷婷成人| 久久久18| 日本三级成人秘书精品片| 99国产小视频| 激情五月色综合网| 狠狠干,狠狠操| 天天操天天操天天操| 色婷婷人人| 五月天久久综合| 九九久久99精品免费观看www| 狠狠干,狠狠操| 三十路磁力链接| 999九九九久久久99HD| 大香蕉久久久| 久久奄也去色色网站| 丁香六月婷婷色XXXXX| 色五月激情网| 欧美噜一噜| 久久嘟嘟丁香| 天天综合精品| 成人在线视频一区| site:esunnet.com| 婷婷五月天毛片| 综合激情视频| 深爱婷婷丁香五月激情| 丁香五月亚洲AV| 丁香五月天大香蕉啪啪| 99色网站| 五月丁香六月婷综合成人综合| 超碰无码318604| 国产69久久久欧美黑人A片| 狠狠色综合精品视频在线| 五月天激情小说| 色色丁香婷婷五月天| 亚洲综合婷婷| 五月丁香六月婷婷国产视频| 五月天国产成人| 婷婷五月丁香性爱| 五月天丁香| 五月色综合网| 五月丁香婷婷六月天| 六月激情婷婷综合| 高清资源站日A美A欧亚…| 在线观看欧美| 天天色综合综合| 亚洲小视频免费播放| 久久六月综合| 超pen个人视频97| www.婷婷,com| 思思久久99热只有频精品66| 秋霞黄色一级久久| 2015超碰| 曰本久久女| 色99色| 丁XX 成人| 99热精国产这里只有精品| 国产操碰| 久久五月天网| 免费视频1区| AA片在线观看视频在线播放 | 婷婷五月六月丁香| 六月婷婷影院| 天天综合.com| 综合色色五月| 丁香五月影院| WWW99热| 五月天久久成人| 五月天色婷婷激情综合| 大香蕉五月天婷婷丁香91| 婷婷丁香五月社区亚洲| 欧美成人精品A片免费一区99| 天天色视频| www.五月天社区| 五月亭亭六月激情| 九九家庭影院| 五月婷婷综合激情| 99久久久久| 日本人人干| 婷婷不卡基地| 色婷婷综合久久| 成AV人片一区二区三区久久| 五月丁香六月激情综合| 日韩人妻无码专区| 久久久久亚洲AV无码网影音先锋| 婷婷久久大香蕉| 国产综合婷婷| 9999热在线免费观看| 久草 tingting| 色婷婷网大全在线| 少妇水多A片太爽了| 99热综合| 99精品视频在线观看| 五月丁香啪啪啪| 9久久久久久久久久久| 激情婷婷丁香色五月| 热久久99视频| 2025最新亚洲激情在线| www.精品99| WWW丁香五月| 翔田千里aV中文字幕| Av狠狠色丁香婷| 欧美色婷婷| 丁香五月天堂网| 激情黄色小说色五月| 婷婷丁香激情综合色情| 久九色| 色婷婷九月| 亚洲色综合| 五月天色婷婷激情综合| 九热在线这里有精品6| 亚洲日本激情| www.狠狠色.com| 色色综合成人网| 亚洲天天免费| 99九九视屏| 69色色视频| 五月丁香婷婷激情视频| 色色热| 婷婷五月激情欧美| 久久综合五月| 欧美成人精品A片免费一区99| 少妇熟女视频一区二区三区| 99爱在线观看视频| 综合婷婷都市激情| 99re视频在线播放| 日韩成人无码人妻| 色婷婷六月| 97亚洲视频在线| 国产在线网址1| 日本123区日韩欧美不卡在线看| 蜜臀av粉嫩av懂色av| 欧美性爱五月天| 色五月激情问网站| 天天肏天天爽夜夜爽| 五月丁香综合网| 五月婷婷六月天| 91操人视频| 婷婷五月激情黄色| 九九人人自拍| 成人精品一区二区三区四区五区 | 99精品在线| 亚洲AV无码电影| 久操干| 永久的网站AAAA| 99热这里精| 人人舔人人| 婷婷综合亚洲| 国产精品久久久久久久久久| 人操91在线| 狠狠色中色| 五月天综合久久| 国产综合激情五月久久| 色色色成人网| 亚洲不卡| 91人妻人人操| 激情久久久久久| 婷婷深爱五月天在线| 激情五月,色播五月| 色综合色色| 日比视频91| 久草 天堂| 亚洲综合色丁香五月天| 五月丁香琪琪| 超碰人妻公开在线| 天天日夜夜欢| 5月婷婷性视频| 超碰com| 免费观看全黄做爰的视频| 久久sp免费视频| 综合欧美五月婷婷| 婷婷五月天av| 中文中文在线| 影音先锋一区| 色情一区二区播放| AV在线资源| 91怕怕网| 色七色九九| 久久久天天啊| 狠狠精品干练久久久无码中文字幕 | 大香蕉久久| 91色在线 | 日韩| 久久五月天综合视频网站| 五月叮香啪| 伊人婷婷五月天| 久久在线视频免费观看| 色五月婷婷基地| 久久视频这里99| 国产毛片精品一区二区色欲黄A片| 激情婷婷五月在线合集| 色小说婷婷五月天天天| 久久婷婷国产| 久久久久久久91| 狼人婷婷久久| 激情婷婷啪啪| 蜜桃五月天| 成人 在线 日韩| 丁香五月区| 久久婷婷五月天| 五月丁香色婷婷色| 亚洲天天综合| 色婷青青| 美妞av| 九九自拍网| 涩涩激情五月婷婷| 色五月色五天色情网| 亚洲操操操| 91人人澡人人爽人人看| 洗浴中心操B视频| 97亚洲视频在线| 五月开心婷婷中文字幕| 玖玖99免费视频| 热久久这里只有三级视频| 国产精品久久久久久久久久久久| 丝袜激情网| www激情婷婷com| 精品成人无码A片观看香草视频| 九九久久99| 密桃激情五月天综合网| 人妻丰满精品一区二区A片| 亚洲色精彩| 久婷五月| 草草操操| 成人欧美日韩| www.日本91| av人人干| 久久99久久久| 九九热在线99| 香港九九六区八区99| 99婷婷五月天| 丁香五月婷婷在线| 成人电影一区| 丁香五月91| 色三级色三级| 日本一级一片免费视频 | 99色干| 99碰| 99热精品在线观看| 天天插天天射天天干| 熟女激情五月天| 色约约视频一区二区三区四区五区 | 五月丁婷香| 综合久久婷婷| 色五月天.con| 激情综合网五月激情| 久久激情五月婷婷| 任你日视频| 久操大香蕉| 在线不卡视频| 日本va欧美va欧美va精品| 天天插天天插天天插天天插| 日本一道久久| 欧美在线视频99| 色色色欧美| 婷婷五月天视频| 综合激情网五月激情| 亚洲成人免费电影| 开心婷婷五月天综合| 99热免费| 综合xx网| 2025超碰| 深爱开心激情| 国产亚洲99久久| 婷婷五月天亚洲综合| 日本毛片内射| 丁香六月久久| 狠狠色五月激情| 熟妇人妻中文字幕无码老熟妇| 五月婷婷六月爱| 91se精品国产| 六月综合在线| 一本色道久久88加勒比—| 亚洲综合草草| 天搞天天天天天| 禁欲电影完整版在线播放| 另类国产综合| 丁香花五月天婷婷成人社区| 五月婷视屏在线观看| 97色在线观看视频| 婷婷六月综合激情| 开心日韩丁香婷婷五月| 综合五月激情| 一区二区免费看| 啪啪色激情五月天| 最近免费中文字幕大全高清大全1| 久久九九蜜| 丁香五月天天| 色九月婷婷| 欧美性丁香色色五月天综合爱爱| www.婷婷com| 五月婷婷激情综合| 色色色色色热| 大香蕉视频婷婷| 色色色地址| eeuus五月婷| 69天堂99| 五月丁香性爱| 婷婷5月天av| 亚洲V国产V欧美V久久久久久| 天天爽,夜夜爽| 中文字幕综合网| 99精品视频在线观看| 99爱视频在线| 九九av| 99视频免费播放| 一区二区免费看| 99re这里只有精品国产99| 99久久婷婷精品视频| 人人摸人人澡人人| 亚洲五月婷婷| 99热有精品在线观看| 色噜噜狠狠色综合网| 啪啪婷婷五月天激情| 日韩AV成人电影| 五月天激情国产综合婷婷| 婷婷五月天干干| 久9热| 色九四色| 99久在线精品99re8热| 丁香五月亚洲天堂| 91爱啪啪| 超碰在线观看三级片| 超碰三级片| 五月婷婷久久内射| 成人中文字幕在线| 疯狂做受XXXX高潮A片动画| 亚洲色婷婷五月天| 五月丁香啪啪网| 亚洲丁香婷婷| 亚洲色网址| 九九热视| 色五月丁香激情视频| 久操干| 久久婷婷五月天| 亚洲色另类| 综合狠狠干| 婷婷97碰碰| 国产免费av网站| 99久视频| 色综合色综合色综合色综合| 五月婷婷六月激情在线| 婷婷激情视频| 婷婷在线五月综合| 大香蕉五月婷婷| 色五月亚洲开心网| 婷婷五月天中文字幕.| 色欲五月丁香| 99综合| 九九热视频99| 色五月婷婷一二| 日本成人噜噜噜噜噜| 色色色99| 色欲影香| 激情五月天色色色| 影音先锋男人女人| 色吧五月婷婷| 五月丁香六月激情欧美综合| 婷婷狠狠久久| 色一区高清| 97操碰碰无码视频| 日韩成人电泉AV| 久久久天堂国产精品女人| 狠狠狠狠狠狠狠狠| 97欧美在线| 婷婷五月激情天| www 五月天 com| 九九热在线亚洲免费视频| 996er热| 999九九九久久久99HD| 日韩成人中文| 国产精品A成V人在线播放| 99久久久| 色玖玖综合网| 26UUU欧美激情一区二区| 99热99色| wwwC0maV五月花| 9九热视频| 色狠狠999综合| 99久久久久久久| 91聚色综合网| 99久久婷婷国产综合精品| 五月丁香综合激情| 26uuu最新地址| 99久久9| 成人婷99最新| www久久艹| 狠狠爱婷婷| 亚洲欧美丁香五月天亚洲欧美| 热久视频| 开心五月深爱五月丁香五月激情五月| 色五月视频无码播放| 狠狠舔| 99精品在线播放| 婷婷五月亚洲综合| 五月婷婷亚洲色图| 97碰碰电影| 亚洲视频无| 色级婷婷| 97碰碰人人视频| 疯狂做受XXXX高潮A片| 99热99艹在线观看| 天天色综网| 超碰97在线操| a级毛片一区二区免费视频| 婷婷五月丁香基| 婷婷五月色播天| av在线婷婷| 日韩成人不卡| 99热99在线| 国产精品色色| 久久精品国产AV一区二区三区 | 伊人丁香在线| 亚洲AV久久久久久久久久久久久久久久| 99燥99日| 激情五月天色色色| 亚洲成人AV电影网| 九九综合图片网| 99综合自拍| 色婷婷久久久| 人妻操逼视频。| 欧美丁香六月在线观看视频| 人人射av| 色婷婷基地| 五月天播播中文字幕| 五月天激情网站| 五月婷丁香| 五月丁香影视| 色色色五月天婷婷| 色欧美日| 9操在线| 久久精品9| 综合在线网| 丁香婷五月| 草综合14| 夜夜 操无码| 超碰99热| 国产激情一区| 98热精品| 99久久.www| 午夜婷婷丁香| 五月激情偷拍婷婷| 《蜘蛛女》梁铮1995| 99re在线视频| 99精品在线观看| 教师性爱毛片| 激情伊人网| 日韩欧美成人片| 日韩色色色99| 热久久99视频| 日韩五月丁香| www.婷婷.com| 六月成人网| 超碰在线超碰| 日韩一区二区在线播放| 天天干天天爽天天爽| 天天干一干| 超碰在线国产| 亚洲AV日韩AV永久无码网站| 国产免费一区二区三区三州老师F1F1.CC | 久久香蕉福利| 婷婷综合网| 久久婷婷五月天激情唯美| 国产亚洲色婷婷久久99精品91| 激情五月天电影| 狠狠色综合五月人人| 久婷婷色| 99热这里有精品6| 涩婷婷五月天| AV性爱网| www.夜夜爱.com| 另类A片| 亚洲久久婷婷| 久久与婷婷| AV色色天堂中文| 五月婷婷六月丁香综合| 亚洲 在线 性爱| 97性视频| 久久97久久99久久综合欧美| 亚洲视频国产一区| 凹凸探花电影| 性综合网| 青青久在线视频免费观看| 538任你爽视频不一样的| 丁香五月婷婷成人色区| 午夜婷婷久久 | 超碰免费大香蕉| 婷婷丁香18| 51XX午夜影福利| 综合性视频99| 亚洲愉拍99热成人精品| 99干免费视频| 天天开心天天色| 亚洲综合激情五月| 狠狠干狠狠干| 超碰色综合| 婷婷综合网站| 中文字幕在线免费观看视频| 久久综合五月| 免费试看小视频 99| 综合色99| 丁香狠狠干| 激情综合青草| 激情五月天开心| 五月日韩中文字幕| 色婷婷电影网| 婷婷五月丁香六月天亚洲综合| 色久天| 九月婷婷综合网| 这里只有精品视频在线看| 99视频只有精品| 9久热免费视频99| 这里只有精彩视| 91精品综合久久久久久五月丁香| 午夜爱插插| 五月天婷婷无码视频| 噼里啪啦在线观看免费完整版视频| 久久久久久久久久91| 深爱五月最新网址| 专区无日本视频高清8| 99热国产精品| 天天干天天干天天干| 国产女18毛片多18精品| 精品无码人妻一区| 国产激情综合五月久久| 91pornav在线| 99国产这里只有精品| 欧类av怡春院| 日本美女上人| 色综合天天综合成人网| WWW.五月com| 99这里只有精品在线| 996er热| 99久久.www| 九九性视频| 日本欧美成人片AAAA| 九九精品在线视频观看| 思思99久久| 99久久久久久久| 97丁香五月| 狠狠爱丁香婷| 五月婷婷丁香六月在线| 中文字幕在线免费看线人| 久色视频在线| 五月丁香综合网| 九九热超碰| 99这里只有精品|v| 色综合网址| 人人九色| 91狠狠综合网| 啪啪操超碰| 操草草草| 五月丁香基地| 日韩精品在线观看9| 久久久精久人妻| 日本一级淫| 六月丁香婷啪射| 99亚州综合精品成人网| 五月婷色色| 亚洲成人影视在线观看| 色五月天堂| 9l视频自拍九色9l视频自拍九色9l社区 | 色婷婷综合亚洲| 日韩精品一曲二曲三曲四曲五曲| 婷婷五月天在婷| 超碰69天堂| 79精品视频| 狠干综合| 天天视频亚洲| 91n啪啪| www.五月天婷婷| 午夜丁香六月婷| 夜夜干夜夜操| 色婷另类| 亚洲av网站在线观看| 99ri在线观看视频| 99色在线| 免费色色色| 99精品偷自拍| 五月婷婷色吧!| 精品一区久热| 五月天播播| 色五月婷婷操逼| 五月丁香六月激情在线| 天天天天天天天干| 激情综合五| 激情婷婷综合| 丁香花社区av| 久久五月天激情| 99热九九在线| 色五月超碰| 丁香五月婷婷深爱综合激情| 精品久热| 久热a| 伊人影院久久网| 任你日视频| 爱久综合| 六月婷婷激情| 婷婷五月精品在线| 色播色丁香五月| 色播五月综合网| 婷婷欧美偷拍综合| 久久精品国产精品| 九九色99| 超碰色天堂| 色女人久久| 五月丁香婷婷无码中文| 五月婷在线| 五月丁香婷在线| 婷婷六月丁香五月图区| 激情丁香五月婷婷| 另类天堂| 狠狠干.com| 播五月开心婷婷欧美综合| 国产午夜精品一区二区| 99热免费精品| 色五月激情基地| 婷婷激情啪啪| www夜夜| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 天天操夜夜肏| 国产视频福利| 五月丁香综合网| 五月天播播综合| 欧美日韩成人综合9| 久久99热免费最新版| 天天日夜夜高潮| 色婷婷人人| 亚洲综合五月| 激情婷婷网| 五月大香蕉| 日本在线播放97| 97人人超| 五月婷AV| 久久99婷婷| 婷婷丁香激情五月天色色色| 最新久久网址| 亚洲看av的网站| 精品牛仔裤超碰| 婷婷五月天亚洲激情戏精品| 噜噜在线| 五月天播播综合| 久久九九亚洲| 五月婷婷五月天| 天天舔天天操| 九九热再线九九视频免费在线观看| 伊人香大香蕉视频| 亚洲操操| 久久婷婷激情视频| 人人干天天舔| 综合九九日本| 噼里啪啦完整版中文在线观看 | 丁香五月电影| 久婷五月| 青青草蜜臀| 久久综合爱| 人妻在线观看视频| 久久香蕉影院| 99热精品在线在线| 五月天五月色| 夜夜 操无码| 操操熟女| 久久六月综合| 九九热这里只有精品6| 婷婷免费精品视频| 性爱网六月丁香| 99精品自拍| 激情五月六月婷婷| 色狠狠综合网| 亚洲综合九九| 黄页免费一级视频懂色| 亚洲亚洲人成综合网络| 久久xxxx| 丁香五月成人av| 婷婷丁香五月激情图片| 99在线视频播放| 丁香花操逼| 九九亚洲天堂| 庭庭久久内射| 蜜乳中文字| 久久九九99字幕| 五月激情网站| 五月五月婷婷| 中字幕视频在线永久在线观看免费| 五月丁香久久久久| 天天日天天插|