久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

REA模型實戰(zhàn):用資源事件代理建模積分結(jié)算系統(tǒng) 做后端和架構(gòu)的同學(xué)應(yīng)該都對這種場景不陌生。業(yè)務(wù)方丟過來一句話“我們要上一個積分系統(tǒng)買東西得積分積分能抵現(xiàn)。”你第一反應(yīng)是建表用戶表、訂單表、積分表、流水表。等上線三個月財務(wù)說要對賬你發(fā)現(xiàn)積分流水里只有加減沒有“這筆積分來自哪筆訂單、對應(yīng)哪次消費、被誰消耗”問題一下子全出來了。今天聊的REA模型就是專門用來解決這類建模問題的。REA全稱是Resource-Event-Agent資源-事件-代理是一套面向經(jīng)營活動的領(lǐng)域建模框架不綁定任何框架和語言。這篇文章我會用一個積分結(jié)算系統(tǒng)的完整建模過程講清楚REA是什么、怎么建模、怎么落到存儲和查詢最后把實際踩過的坑一次說清。適合正在做DDD落地、事件溯源以及賬戶、庫存、積分類系統(tǒng)的開發(fā)者參考。1. REA模型認(rèn)知為什么業(yè)務(wù)建模繞不開它1.1 三個要素和一個中心關(guān)系REA模型的三個核心詞匯展開來說并不復(fù)雜。Resource資源凡是“有價值、可以衡量、能在業(yè)務(wù)中流動”的東西都可以歸入這個范疇?,F(xiàn)金、庫存商品、積分、優(yōu)惠券、產(chǎn)能、維修工單中的工時都是資源。判斷標(biāo)準(zhǔn)很直接這個東西在業(yè)務(wù)里會不會被增加、減少、轉(zhuǎn)移如果會它就是Resource而不是什么普通實體或字典表。很多同學(xué)建模時把積分當(dāng)成“用戶的屬性”直接給用戶表加一個point字段這恰恰是問題的起點。積分本質(zhì)上是一種可流轉(zhuǎn)、可消耗、有歸屬的資產(chǎn)應(yīng)該被當(dāng)成Resource來建模。Event事件是發(fā)生在資源上的經(jīng)濟活動。用戶支付、商品出庫、積分發(fā)放、優(yōu)惠券核銷都屬于Event。它記錄的是“發(fā)生了什么”而不是“現(xiàn)在是什么狀態(tài)”。平時做CRUD的時候我們習(xí)慣把賬號狀態(tài)從待支付改成已支付這是狀態(tài)的覆蓋而在REA里我們記錄的是“誰在什么時間做了什么動作”這個動作不會因為業(yè)務(wù)狀態(tài)變化而被抹掉。Agent代理是參與經(jīng)濟活動的人、系統(tǒng)角色或組織。用戶、供應(yīng)商、平臺、渠道商甚至一個負(fù)責(zé)積分過期任務(wù)的定時程序都可以是Agent。在REA模型里Agent不是簡單的標(biāo)簽而是資源流向的歸屬方。每一筆資源變動都必須能回答“這個資源從哪個Agent流出流入哪個Agent”。三者的關(guān)系是一個Event至少連接兩個Agent同時連接流入和流出兩類Resource。為什么必須有雙方因為任何一筆經(jīng)濟活動要成立必然存在一方資源減少、另一方資源增加。如果模型中只看到一個Agent那說明你記錄的很可能不是事實而是某個操作的結(jié)果快照。1.2 用一杯咖啡看懂REA用一個最生活化的例子來拆解比如“你花20元在咖啡店買一杯咖啡”。傳統(tǒng)建模會怎么寫訂單表記錄商品、金額、訂單狀態(tài)支付表記錄支付結(jié)果庫存表扣減庫存??雌饋磉壿嬐暾珜~時就會遇到一個經(jīng)典麻煩訂單顯示已支付財務(wù)的銀行流水里卻沒有這筆錢或者支付成功但訂單狀態(tài)沒被更新你說不清是哪一步發(fā)生的、責(zé)任在哪一方。用REA模型這次交易要被拆成兩個獨立的經(jīng)濟Event。第一個Event是顧客付款。此時支付錢包這類Resource從顧客名下流出20元流入咖啡店的收款賬戶涉及到的Agent是顧客和咖啡店。第二個Event是咖啡交付??Х榷够蛞阎谱骱玫目Х瘸善窂目Х鹊甑膸齑鍾esource中流出1杯轉(zhuǎn)入顧客名下涉及到的Agent同樣是顧客和咖啡店。這里一定會有人問一筆交易為什么要拆成兩個Event因為付款和交付本來就是兩個獨立事實它們可能不是同一時刻發(fā)生。顧客觀看菜單后可能先付款再取貨也可能先取走咖啡后補付錢更可能付款后商家倒閉跑路根本拿不到咖啡。如果把兩者揉在一個訂單Event里后續(xù)處理退款、掉單對賬、庫存損耗時就會非常痛苦。拆開之后“顧客付了錢但沒拿到咖啡”可以定位到第一個Event已完成、第二個Event未發(fā)生“拿到咖啡但沒扣庫存”也可以從Event里直接查出來。這背后正是復(fù)式記賬的思路每一筆資源的流入必然對應(yīng)另一筆資源的流出兩邊都要有據(jù)可查。REA把這種會計思想搬到了軟件建模層面很多看似復(fù)雜的業(yè)務(wù)按這個邏輯梳理后核心關(guān)系會非常干凈。等等有人會問“我開發(fā)的是一個管理后臺不是財務(wù)軟件有必要這么較真嗎”確實不是所有系統(tǒng)都必要但凡是涉及資金、庫存、積分、兌換碼這類“資產(chǎn)型”數(shù)據(jù)的模塊如果沒有這一層事實記錄將來對賬、審計、排查數(shù)據(jù)異常時代價會成倍增加。我見過太多系統(tǒng)因為早期省了這一步后期專門開發(fā)“審計模塊”“對賬系統(tǒng)”結(jié)果還是對不齊最后只能硬編碼各種補丁。1.3 傳統(tǒng)建模與REA建模的對照把傳統(tǒng)CRUD式的建模和REA建模放在一起對比區(qū)別會更直觀。對比維度傳統(tǒng)建模REA建模核心數(shù)據(jù)狀態(tài)字段比如訂單狀態(tài)不可變的經(jīng)濟事實流審計能力依賴操作日志經(jīng)常缺失環(huán)節(jié)事件天然全鏈路可回溯當(dāng)前余額/庫存直接查字段值通過投影計算可從事件推導(dǎo)業(yè)務(wù)擴展需要改表結(jié)構(gòu)、加字段新增事件類型舊事件不動冪等保障依賴狀態(tài)校驗和鎖依賴事件的業(yè)務(wù)唯一性財務(wù)對賬另行開發(fā)對賬邏輯事件本身就是賬本傳統(tǒng)表結(jié)構(gòu)像給系統(tǒng)拍了一張又一張快照我們能看到的永遠是當(dāng)前狀態(tài)REA更像一段完整錄像任何時間點的業(yè)務(wù)都可以被還原。數(shù)據(jù)庫字段里那個“訂單狀態(tài)已完成”更像一張抓拍照片而REA事件流里的“下單、支付、出倉、簽收”是連續(xù)的事實序列。對需要追溯責(zé)任的業(yè)務(wù)來說錄像比照片可靠得多。還不止如此。傳統(tǒng)建模中當(dāng)業(yè)務(wù)需求增加“積分可以跨訂單合并使用”的時候你要么給積分表加一大堆關(guān)聯(lián)字段要么再寫一套合并邏輯。但在REA里積分合并本質(zhì)上是一筆資源重組Event把兩個積分賬戶的資源結(jié)余轉(zhuǎn)移到一個新賬戶事件不改變舊積分賬戶的事實只是做一個新事件。這種擴展方式對新老邏輯都比較溫和。1.4 REA與DDD、事件溯源的真實關(guān)系DDD領(lǐng)域驅(qū)動設(shè)計這么多年都很火但很多團隊落地時卡在同一個問題上通用語言怎么定義聚合根怎么劃分領(lǐng)域事件到底應(yīng)該記錄哪些內(nèi)容REA恰好給了一套可落地的詞法規(guī)范。DDD的“領(lǐng)域事件”在REA里對應(yīng)的是真正的經(jīng)濟Event而不是系統(tǒng)的每一步操作。比如“用戶點擊了積分明細(xì)頁”這種操作不算Event因為它不涉及任何Resource的流入流出“用戶用100積分兌換了一張5元優(yōu)惠券”才是Event因為它涉及兩個Agent用戶和平臺、兩類Resource積分和優(yōu)惠券。如果你的團隊在做事件風(fēng)暴時總是吵不清楚哪些是領(lǐng)域事件引入REA的“雙Agent、雙Resource”校驗一下子就能過濾掉大量噪音。事件溯源Event Sourcing落地時最常見的問題也是事件庫亂。有些團隊把“狀態(tài)變更”都當(dāng)成事件存進去結(jié)果事件流里魚龍混雜重放時根本還原不出業(yè)務(wù)。REA的約束正好解決了這個問題事件必須關(guān)聯(lián)資源、必須關(guān)聯(lián)雙向代理、必須描述經(jīng)濟活動。不符合這三條的就不應(yīng)該進事件庫。所以REA不是DDD的替代品也不是事件溯源框架的前置依賴而是它們之間的粘合劑。我個人的習(xí)慣是先用REA梳理領(lǐng)域詞表再做DDD的聚合設(shè)計最后用事件溯源來落地。順序?qū)α撕竺鏁樅芏唷?. 實操建模用REA給積分結(jié)算系統(tǒng)搭骨架2.1 從一個不過分的模擬項目開始為了把REA落地過程講得具體我假設(shè)自己正在為某社區(qū)團購平臺設(shè)計一套結(jié)算模塊業(yè)務(wù)規(guī)則一共有四條用戶可以用微信充值獲得平臺余額用戶在商城下單時用余額支付同時按支付金額的一定比例獲得積分用戶可以用積分兌換優(yōu)惠券優(yōu)惠券在下一次購買時核銷。需要注意的是充值渠道和商品提供方是外部角色平臺本身也需要作為Agent進入模型。拿到這個需求第一步不是寫代碼也不是畫架構(gòu)圖而是列事件清單。我把所有可能發(fā)生的經(jīng)濟活動寫下來用戶發(fā)起充值、充值成功到賬、用戶下單、支付成功、訂單完成出庫、積分發(fā)放、積分兌換優(yōu)惠券、優(yōu)惠券核銷。事件清單不需要一次就完美后續(xù)隨業(yè)務(wù)梳理不斷補充但第一版必須包含業(yè)務(wù)方最關(guān)心的幾件事尤其是錢和商品的流轉(zhuǎn)。第二步對每個事件確認(rèn)它涉及的Resource和Agent。這里直接給出我梳理后的關(guān)系表這個表本質(zhì)上會成為后面領(lǐng)域模型和數(shù)據(jù)庫設(shè)計的基礎(chǔ)事件流入Resource流出Resource涉及Agent充值成功余額用戶外部資金平臺用戶、平臺支付成功下單商品貨權(quán)用戶余額用戶用戶、平臺訂單完成出庫商品庫存平臺商品在庫平臺平臺、供應(yīng)商積分發(fā)放積分用戶積分池平臺用戶、平臺積分兌換優(yōu)惠券優(yōu)惠券用戶積分用戶用戶、平臺優(yōu)惠券核銷優(yōu)惠券核銷記錄平臺優(yōu)惠券用戶用戶、平臺注意這里“商品貨權(quán)用戶”與“商品在庫平臺”是兩個不同的Resource。REA模型鼓勵把貨權(quán)和庫存分開看待因為用戶下單后貨權(quán)雖然已經(jīng)轉(zhuǎn)移給用戶但商品仍然在平臺倉管里直到出庫才減少庫存。很多庫存對不上的問題正是因為把貨權(quán)轉(zhuǎn)移和庫存減少混為一談。這個點在實際做電商系統(tǒng)時非常重要。第三步確定聚合邊界。我的方案是把“經(jīng)濟事件”作為獨立的不可變聚合根每個Agent的每個Resource類型對應(yīng)一個資源賬戶聚合比如UserAccount聚合里包含用戶的余額賬戶和積分賬戶平臺的資產(chǎn)品類賬戶單獨再建一個聚合。事件聚合負(fù)責(zé)產(chǎn)生事實賬戶聚合負(fù)責(zé)校驗和投影兩者職責(zé)分離不混在一起。2.2 領(lǐng)域模型代碼骨架事件與賬戶分離按照上面的設(shè)計核心代碼可以拆成三層。Resource層比較簡單它包含一個ResourceType和一個數(shù)量字段。Event層承擔(dān)事實記錄必須不可變。Agent層負(fù)責(zé)資源賬戶的承載。我用接近Java的偽代碼把它寫出來public class ResourceAccount { private AgentId agentId; private ResourceType resourceType; private long amount; // 以最小單位存儲比如“分” private int version; public void apply(EconomicEvent event) { // 先校驗后變更 } } 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列表。一個事件至少要有兩條Entry一條表示某Agent的某個Resource增加另一條表示另一個Agent的某個Resource減少。兩條Entry之間滿足金額守恒。比如充值成功事件一條Entry是用戶余額10000分另一條Entry是平臺外部資金-10000分。兩條金額加起來為0這個事件的完整性就初步得到保證。金額守恒看起來像會計學(xué)概念但它對系統(tǒng)質(zhì)量的作用非常直接。在傳統(tǒng)模型里一個不經(jīng)意的小Bug可能導(dǎo)致用戶余額憑空多出1分錢而在REA模型里事件本身自檢就能發(fā)現(xiàn)不平衡測試用例也更容易寫。我經(jīng)常說REA等于把會計的“借貸平衡”內(nèi)置到了業(yè)務(wù)系統(tǒng)的核心數(shù)據(jù)結(jié)構(gòu)里。當(dāng)然代碼只是骨架真正能不能落地還取決于底層存儲和并發(fā)控制這部分放到第3章細(xì)說。2.3 為什么資源單位必須是最小單位這個坑我踩過必須單獨拿出來講。早期做一個優(yōu)惠券計算功能時我用浮點數(shù)表示折扣比如0.88折結(jié)果計算過程中出現(xiàn)了0.30000000000004這類連自己都看不懂的數(shù)字后面所有對賬全部錯位。這不是REA特有的問題而是所有涉及金額、積分、數(shù)量類業(yè)務(wù)都容易犯的錯。在REA建模中所有Resource的數(shù)量都必須選擇整數(shù)類型以最小不可分割單位存儲。金額以“分”存儲積分以1個為單位庫存以“件”為單位。打折、匯率換算這些計算放到入賬之前處理一旦進入Resource賬戶全部是整數(shù)。這個設(shè)計同時解決了兩個問題第一浮點數(shù)誤差從源頭消失第二審計時看到的每一筆事件都是完整的業(yè)務(wù)事實不會出現(xiàn)三條小數(shù)記賬記錄加起來不等于一條原始記錄的情況。另外Resource的流出方向我建議用direction字段而不是簡單的正負(fù)號。正負(fù)號只有兩個方向但業(yè)務(wù)里還有“凍結(jié)”“解凍”“沖正”等狀態(tài)只用正負(fù)號表達很容易把數(shù)量與狀態(tài)混淆。庫存不足時如果系統(tǒng)錯誤地產(chǎn)生一個負(fù)庫存光看數(shù)據(jù)根本判斷不出異常但如果direction明確標(biāo)記為“凍結(jié)失敗”異常就能被精準(zhǔn)定位。2.4 事件不可變與沖正機制很多同學(xué)第一次接觸REA時會問如果事件寫錯了怎么辦用戶的余額被我用一個錯誤事件扣掉了難道不能改掉那條事件嗎答案是原始事件永遠不能改只能新增一個“沖正事件”來糾正。比如充值事件本來是100元結(jié)果系統(tǒng)錄入成了1000元你不能去修改那條充值事件而是要生成一條“充值沖正”事件把多出的900元從用戶余額里扣回來并關(guān)聯(lián)到被沖正的原事件ID。這個規(guī)則看上去死板卻保住了整個系統(tǒng)的底線。一旦事件可修改之前所有基于事件的審計、重放、對賬邏輯都會失去信任基礎(chǔ)。金融系統(tǒng)里為什么要求“記賬憑證不可涂改”因為憑證一旦可改賬本就沒有意義了。REA在這個層面就是數(shù)字化時代的記賬憑證。事件不可變的另一個好處是可以在多系統(tǒng)之間可靠地同步數(shù)據(jù)。下游系統(tǒng)只需要按事件ID增量拉取不需要關(guān)心上游是否修改過數(shù)據(jù)即使下游處理失敗重新消費冪等性也可以通過事件唯一ID保證。這是事件驅(qū)動架構(gòu)中一個很實用的基礎(chǔ)設(shè)計。3. 從模型到落地事件存儲、快照與查詢投影3.1 事件存儲表結(jié)構(gòu)怎么設(shè)計模型最終要落到存儲。在數(shù)據(jù)量不大時完全可以用普通關(guān)系型數(shù)據(jù)庫來實現(xiàn)事件存儲而不必一上來就引入專門的事件溯源中間件。我用PostgreSQL風(fēng)格的表結(jié)構(gòu)來說明但換成MySQL也成立。核心就兩張表一張保存事件流元數(shù)據(jù)一張保存每個具體事件的數(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表代表一個聚合的版本序列。version字段是遞增的整數(shù)每次追加新事件時必須指定基于哪個version寫入。如果兩個并發(fā)請求都用version3去追加下一個事件數(shù)據(jù)庫的唯一約束就會讓其中一個失敗沖突在源頭被攔下來。events表的event_id是這個事件的業(yè)務(wù)唯一ID不是自增主鍵。比如支付成功事件的事件ID就是支付流水號充值沖正事件的事件ID就是沖正單號。加上唯一約束后即使消費者重復(fù)投遞消息數(shù)據(jù)庫也會把重復(fù)事件擋在外面這是冪等性的最后一道保險。我見過不少團隊把事件和業(yè)務(wù)數(shù)據(jù)混在一起事件表里既存原始事實又存當(dāng)時算出來的余額結(jié)果重放時數(shù)據(jù)結(jié)構(gòu)混亂。記得原則Event只存事實數(shù)據(jù)比如數(shù)量、單價、關(guān)聯(lián)訂單號所有可推導(dǎo)的余額、庫存、狀態(tài)全部放投影不要放事件。3.2 快照策略與應(yīng)用恢復(fù)事件存儲解決了事實保存但性能上不能無限依賴“從頭重放所有事件”。假設(shè)一個用戶賬戶有10萬條積分流水每次加載賬戶狀態(tài)都要重放10萬次系統(tǒng)必然扛不住。這時候需要快照??煺站褪蔷酆显谀硞€版本時刻的完整存檔。恢復(fù)時只從最近的快照開始重放后續(xù)事件而不是從零開始。比如用戶賬戶已經(jīng)發(fā)生10萬條事件系統(tǒng)每100條生成一個快照那么恢復(fù)時最多重放100條性能得到了數(shù)量級提升??煺盏纳刹呗砸骖檶崟r性和成本。我常用的方案是在追加事件的事務(wù)里判斷當(dāng)前版本號是否達到“上次快照版本100”如果達到了就在同一事務(wù)里把聚合狀態(tài)序列化后寫入快照表??煺找部梢耘浜隙〞r任務(wù)做但要注意版本對齊避免快照版本與事件版本不一致導(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)時先取版本號最大的快照再加載該版本之后的所有事件順序重放得到最新狀態(tài)。快照作為優(yōu)化手段不能取代事件本身如果快照損壞最多重建一個空聚合重放全量事件不影響數(shù)據(jù)正確性。3.3 查詢投影別拿事件庫當(dāng)查詢庫事件庫和普通業(yè)務(wù)庫的查詢特性完全不一樣。事件表的寫入是追加式?jīng)]有任何update拿它來做“查詢用戶當(dāng)前余額”這類高頻業(yè)務(wù)請求非常不適合。正確做法是建立查詢投影用一份獨立的讀模型來服務(wù)查詢。還是說積分系統(tǒng)的例子。我可以建一張賬戶余額讀模型表專門用來支撐業(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ā)布后訂閱者收到消息重新計算該用戶的最新余額和積分然后更新表中的記錄。查詢接口只讀這張表響應(yīng)速度很快。這個寫模型與讀模型分離的思路本質(zhì)上就是CQRS。REA和CQRS天然合拍REA負(fù)責(zé)把寫側(cè)變成一串不可變的事實CQRS負(fù)責(zé)把讀側(cè)變成面向業(yè)務(wù)場景的投影。在寫側(cè)我們強調(diào)一致性、完整性和審計能力在讀側(cè)我們強調(diào)查詢性能和響應(yīng)速度。兩者互不拖累。需要注意的是投影更新存在“最終一致”窗口事件寫入后到讀模型更新完成前用戶可能看到舊數(shù)據(jù)。對大多數(shù)積分、余額業(yè)務(wù)來說這個時間差可以接受如果業(yè)務(wù)要求強一致可以在同一個事務(wù)里同時更新事件表和投影表代價是寫入延遲升高。我剛落地REA時只顧著保證事件一致性忘了設(shè)計讀模型結(jié)果上線后接口響應(yīng)慢得沒法看后來補了投影表才解決問題。3.4 冪等、并發(fā)控制與重試事件驅(qū)動系統(tǒng)里的冪等性遠比單體CRUD里需要考慮得多。同一個支付成功事件可能因為消息中間件重投、下游服務(wù)重啟等原因被處理兩次。如果沒有冪等保護用戶的300元可能被入賬兩次積分翻倍優(yōu)惠券重復(fù)發(fā)放。冪等的第一道防線在事件唯一鍵上。我用支付回調(diào)里的平臺流水號作為eventId數(shù)據(jù)庫對eventId加唯一索引重復(fù)插入必然失敗。第二道防線在賬戶聚合的版本號上。每個賬戶記錄當(dāng)前version更新時必須攜帶期望version如果version對不上說明有其他事件已經(jīng)先入賬當(dāng)前請求需要重新加載最新狀態(tài)再合并計算。這里給出一個典型的寫入流程偽代碼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)處理過直接忽略 } try { account.apply(event); accountRepository.save(account, account.getVersion()); eventStore.append(event); return; } catch (VersionConflictException ex) { // 說明有并發(fā)事件先寫入重新加載重試 } } throw new RecoverableException(concurrent payment processing); }這個寫法里事件唯一鍵保證了重復(fù)消息不會入賬版本沖突保證了并發(fā)更新不會互相覆蓋。我實際測試過即使兩個線程同時收到同一事件最終也只有一個線程能成功寫入另一個會在下一輪重試時發(fā)現(xiàn)事件已存在并退出。這套機制簡單可靠比分布式鎖輕量很多。4. 復(fù)盤避坑REA落地時最常踩的6個坑4.1 坑一把派生數(shù)據(jù)混進事件里這是REA建模中最典型的錯誤幾乎每個初學(xué)的人都會犯。有人設(shè)計“用戶支付”事件時除了記錄支付金額、訂單號還會加一個字段叫“支付后余額”目的是查詢方便。結(jié)果事件溯源重放到最后一筆時發(fā)現(xiàn)余額和真實余額差了10元。為什么因為早期的某條事件里的“支付后余額”算錯了而這個錯誤在之后的N條事件里被當(dāng)成基礎(chǔ)數(shù)據(jù)繼續(xù)疊加。正確做法是事件只記錄業(yè)務(wù)事實支付了多少錢、來自哪個訂單、發(fā)生于何時。用戶支付后的余額是多少由投影計算得出不能寫進事件。把這個原則記住你的事件流就能永遠保持純凈和可重放。4.2 坑二漏掉系統(tǒng)自動任務(wù)的Agent身份有一類特殊Agent特別容易被遺漏——系統(tǒng)本身。比如平臺規(guī)定“90天未使用的積分自動過期”這個定時任務(wù)每天掃描積分賬戶并執(zhí)行過期操作。很多建模者覺得它不是人就不給它Agent身份。結(jié)果積分過期后業(yè)務(wù)審計想查“誰的積分被清了、為什么被清”時事件流里只有一個資源減少記錄沒有任何Agent承擔(dān)責(zé)任。正確做法是把“積分過期服務(wù)”或者“系統(tǒng)管理Agent”納入模型給它分配一個AgentId。事件里的雙向Agent就變成了“用戶”和“系統(tǒng)管理Agent”。這樣審計時才能回答這筆積分是用戶主動兌換掉還是被規(guī)則自動清理的規(guī)則歸屬哪個系統(tǒng)服務(wù)。4.3 坑三濫用浮點數(shù)處理金額和積分這個坑前面已經(jīng)提過但值得放進避坑清單里再次強調(diào)。任何Resource的入賬和出賬都使用以最小單位為基準(zhǔn)的整數(shù)。打折、匯率、稅率等計算全部放在事件入賬之前計算結(jié)果必須四舍五入到最小單位后再進入事件。如果某天計算結(jié)果出現(xiàn)0.1個積分業(yè)務(wù)上要么向下取整要么單獨生成一個“零頭積分”的Resource絕不能讓一個小數(shù)出現(xiàn)在賬戶流水里。4.4 坑四事件表膨脹查詢性能失控事件存儲的量級和普通業(yè)務(wù)表完全不一樣。一個用戶一年可能產(chǎn)生上千條積分流水一個平臺一年就是上億條。如果不做任何優(yōu)化任何一次加載聚合狀態(tài)都要掃描幾十萬條數(shù)據(jù)系統(tǒng)會卡到?jīng)]法用。解決方案有分層第一層是快照把上千條事件壓縮到最多回放100條第二層是歸檔把超過3個月的舊事件歸檔到冷存儲業(yè)務(wù)查詢走投影表只在審計、對賬、糾紛處理時查冷數(shù)據(jù)第三層投影表本身也要定期清理和壓縮避免重復(fù)投影數(shù)據(jù)越來越多。記住一條事件庫是“真相”投影模型才是“讀接口”不要讓用戶請求直接親吻事件庫。4.5 坑五團隊不認(rèn)可新模型方案被噴成過度設(shè)計REA落地最大的阻力往往不是技術(shù)而是團隊協(xié)作。業(yè)務(wù)方會覺得你繞了一大圈明明一張訂單表就能解決的問題你非要拆成幾個事件和賬戶開發(fā)同事會覺得這套模型復(fù)雜要學(xué)新的概念還要寫一套以前沒寫過的代碼。我的建議是不要試圖一次性全面鋪開。先挑一個最痛的點比如財務(wù)月結(jié)算對不上賬、積分明細(xì)查不清用REA做一個影子模塊和舊系統(tǒng)并行跑一段時間用報表比對新舊模型的結(jié)果。當(dāng)數(shù)據(jù)證明舊模型有缺失、新模型能精準(zhǔn)還原后團隊自然會接受。技術(shù)方案存在的最終目的是解決問題不是證明誰更高級。如果想靠“這個模型很經(jīng)典很權(quán)威”來說服團隊阻力只會更大。4.6 坑六把REA當(dāng)成萬能銀彈最后一條坑是反過來走向極端什么系統(tǒng)都往REA上套。一個簡單的用戶配置管理系統(tǒng)只有查詢和修改既不涉及資源流轉(zhuǎn)也不需要審計對賬硬套REA只會增加無意義的復(fù)雜度。判斷是否該用REA的標(biāo)準(zhǔn)很簡單業(yè)務(wù)里是否存在多方資源流轉(zhuǎn)、是否存在審計追溯訴求、當(dāng)前狀態(tài)是否依賴歷史事實推導(dǎo)如果三個都否普通CRUD可能就夠用了。我自己的經(jīng)驗是REA最適合的場景是“用戶持有資產(chǎn)型數(shù)據(jù)”的業(yè)務(wù)錢包、積分、優(yōu)惠券、庫存、配額。這類業(yè)務(wù)中的數(shù)據(jù)不僅是一個字段更是一種有生命周期、有歸屬方、可流轉(zhuǎn)的資產(chǎn)。判斷清楚再上模型會給你帶來巨大回報判斷不清楚硬上就會變成過度設(shè)計。最后把六個坑整理成速查表方便排查時對照坑位問題表現(xiàn)解決思路派生入事件重放結(jié)果與真實余額不一致事件只記錄原始事實漏掉系統(tǒng)Agent自動過期等操作無責(zé)任方補建系統(tǒng)Agent浮點數(shù)量計算誤差導(dǎo)致對賬失敗全部使用整數(shù)最小單位查詢撞事件庫響應(yīng)越來越慢用快照投影歸檔團隊阻力方案被質(zhì)疑影子運行用數(shù)據(jù)說話過度設(shè)計簡單CRUD也套REA先評估業(yè)務(wù)是否匹配寫在最后一個實用體會。我最早接觸REA時也覺得一個訂單要拆成好幾個事件實在太繞。直到后來一次對賬財務(wù)要我說清楚“某用戶1月5日20點03分用余額買了一箱牛奶之后余額去哪了、積分發(fā)了多少、是否存在資金漏洞”傳統(tǒng)模型里的訂單狀態(tài)和流水表根本理不清是REA幫助我從事件流里逐條還原把資金鏈路完整講了出來。從那以后凡是涉及錢、庫存、積分這類模塊我都會先問自己一句我建的是狀態(tài)還是事實如果只能給一條建議那就是在建模第一周先用Excel把所有事件、資源流入流出、Agent列成一張大表把關(guān)系徹底捋順了再寫代碼。這個笨辦法比畫100張架構(gòu)圖都有效。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天爽夜夜爽夜夜爽精| 久久99手机免费视频| 久久久国产精品亚洲精品| 强奸乱伦动态污图免费| 精品无码久久久久久国产浪潮| 香蕉大久久久| 亚洲激情色片| 亚洲AV无码天美传媒一区| 亚洲国产成人福利在线观看| 插入逼91| 欧美天堂在线| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 久久久久久九九九| 国产免费一区| 亚洲欧洲日韩国产自在线| 无码78| 久久一区,青青青青草视频在线播放| 国产三级多多影院2022国产AA一级毛片无码 | 玖玖蜜臀资源网| 免费精品福利在线观看| 五月丁香综合| 日韩欧美经典在线观看| 色狠狠 - 百度| 一区二区中文| V A在线| 亚洲欧美不卡线| 亚洲日韩精品久久久久一区壹牛| 欧美综合网在线| 97日韩欧美亚洲| 欧美 日韩 另类 亚洲| 99热这里只有精| 骚逼高潮久久精品| 少妇二级| 精品国产嫩穴视频| 97色诱| 欧美一区二区三区蜜桃| 国产精品视频麻豆入口| 久久亚洲欧美中文字幕国语| 黄色av网站在线播放| 白丝被操91| 日韩亚洲欧美中文字幕| 国产久久av| 九九探花视频在线观看| 九九综合久久| 大香蕉啪啪网| 色诱avtt| 日韩精品电影| 欧美色图片色哟哟| 亚欧美色| 亚洲好看强奸乱伦| 97色婷婷| 久久性爱网站| 真实高潮91| 日本精品88888888| 日日天天久久啊啊aaa| 91在线免费观看处女| 97久精品| 欧美色一二三| 亚洲高清无毛一区二区| 欧美gv在线观看| 色在线综合| 日韩美女操b| 一区二区三区视频| 欧美性天天影视| 男人天堂站| 91伊人大香蕉| 超碰97极品9| 国产呦精品系列在线观看| 日韩无码一级黄色av片| 久久性爱城| 亚洲综合在线高清| 久草色在线观看| 亚洲日韩精品一区二区| 370p日韩欧美亚洲精品| 色五91| 丝袜狠狠草尤物人妻av91| 啊啊啊慢点| 久久久久国产精品久久久| 国产一区在线播放| av在线播放国产一区| 久久黄色视频一区二区三区| 眼镜人妻101.com| 一区二区三区四区理论片| 97干97色| 777奇米影视777四色| 97网址www| 国产精品九9| 午夜精品久久久久久久| 黑人娇小av在线播放| 琪琪精品免费一区二区三区 | 岛国A V在线免费看| 亚洲欧洲综合视频在线| 夜夜爽妓女| 劲爆欧美人妖三区91| 97超碰欧美精品| 黄色AAAAAAAAAAA大片| 亚洲图片欧美91N| 欧美日韩97在线| 国产精品国产亚洲区艳妇糸列| 日本色色的视频| 夜夜操老骚逼视频网站| 天躁夜夜躁2021| 欧美色性爱| 欧美性色综合网| 亚洲欧美洲综合| 久久精品国产亚洲AV嘿嘿| 亚洲欧美一区二区三区在钱蜜桃| 超碰色美女| 97人妻免费中文字幕| 超碰激情808| 超碰人妻久久| 999热这里只有精品| 人人贴人人摸| 九九热精品| 亚洲欧美日韩有码| 亚洲无码超碰免费| www.四虎在线| 亚洲综合另类| 日韩紧密久久| 五月丁香六月综合缴清无码 | 91人妻视频在线| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 97精品一区二区视频| 日本三级黄页| 色综合国产在线观看| 国产原创自拍| 免费精品无码一级毛片牛牛影视| 欧美成不卡网| WWW操逼| 精品伊人久久久大香线蕉小说| 97在线亚洲| 约操熟妇| 国产精品午夜精品| 人人扣人人操| 精品国产乱码久久久久久网站入口| 色香综合| 麻豆国产成人精品| 东京热男人的天堂| 大香蕉宅男伊人| 91九色蝌蚪在线观看| 欧洲精品久久| 嗯嗯啊啊视频在线看| 九九热九九| 国产农村妇女毛片精品久久| 人妻少妇视频在线播放| 九九视频黄色片| 内射黑丝袜| 欧美疯狂做爰xxxx| 极品销魂美女一区二区| 日本大香蕉综合网| 97久久精品亚洲中六字幕| 性色av蜜臀av色欲aV| 3级毛片一二| 人妻碰碰碰碰碰碰| 亚洲成人av电影在线| 亚洲se电影| 色香阁在线| 久久综合国产精品国产| 欧中美三级一区二区三区| 亚洲18禁| 91精品丝袜在线观看| 91老司机在线| 男人把坤坤插入女人的下体| 日韩啪啪啪啪啪| 秋霞一集毛片观看| 欧美亚洲清纯| 天天综合香 ld视频| 制服乱伦| 99色天堂| 精品国产丝袜一区二区三区乱码| 操逼无码操逼| 久久永久无码人妻视频| 婷婷精品国产欧美精品亚洲人人爽| 国产激情视频在线观看| 人人做,人人操,人人摸| 操久久久久| 久久久久久九九九九-美女久久久久久久-成人AV | 午夜九九| 9999亚洲电影| 91免费看一区二区三区| 死我十八禁| AV一二区| 九一亚洲国产免费| 亚州情色j区| 五月天婷精品激情| 亚洲图片欧洲图片aⅴ| 欧美97爱| 91伊人| 中文字幕精品探花视频| 青青草五月份天| 97香焦色区| 久久大香蕉手机高清视频| 蜜臀一区二区三区在线| 久久 久久国内精品亚洲| 国产天天骚| 91粉嫩萝控精品福利网站_精品影音先锋国 | 免费日韩黄片| 91成人无码| 九九精品99| 天天干18禁| 97视频新免费| 免费97视频| 妇女视频网站| 伊人国产av| 97资源制服丝袜| 激情久久久| 白天啪啪晚上啪啪视频| 无码在线亚洲| 亚州AV无码国产精品| 日韩综合无码色欲vv| 最新亚洲黄色免费电影 | 久久精品国内Av熟女高清| 91五十路| 五月婷婷综合在线| 激情综合久久| 国产11页| 人妻精品一区二区全免费| 91人妻丝袜无码| 色综合中文字幕不卡| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 日本日逼视频网| 亚洲熟女av日韩熟女| 先锋色眉乱伦资源| 国产精品午夜精品| 第45页一区二区| 国产9 9在线 | 亚洲| 一级做a爰片性色毛片久久| 亚洲av性爱电影| 色在线综合| 无码免费在线观看黄色片| 翔田千里Av在线| 麻花传媒免费网站在线观看| 91站街按摩店老熟女熟女| 婷婷五月天成人网| 色婷婷成人综合| 91麻豆天美传媒HD| 久肏视频字幕| 99久久精品欧美国产| 国产AV久久野战精品| 爽 好舒服 无码刺激久久| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 婷婷色在线| 久久久久精| 欧美页片| 亚洲高潮影院| 日本三级A片网站com| 日本熟妇人妻中出视频| 观看免费区二区三区二| 久久99深爱久久99精品| 91站街按摩店老熟女熟女| 午夜精品99久久久久传媒| 欧美性爱一区二区三区四区| 变态综合色| 午夜视频黄| 爆操无码| 一区,二区,三区视频| 亚洲少妇自拍中文字幕懂色| 夜夜嗨一区二区| 丁香色五月 97干| 欧美在线官网| 自拍丝袜美腿人妻| 国产一区二区精品在线视频| 西西美女视频网| 久久久精品中文字幕爱豆| 久久久久成人亚洲国产| 嗯嗯啊啊操死我| 老鸭窝日丰县女人| 97超碰中文| 日本天堂在线播放| 高清国产精品福利网站| 黑丝自慰喷水网站| 九一屌逼| 久久无码精品| 日韩av乱伦| 国产乱弄免费在线视频。 | 99视频这有这里有精品| 亚洲日产专区| 国产丁香精品露脸视频| 午夜爽爽爽在线观看永久入口姬片| 亚洲一区二区三区久久 亚洲一区二区| 欧美一品道| 国内精品久久人妻性色av| 久久人妻视频网| 欧美综合色综合| 美国一区二区三区视频| 欧美日韩大陆黑人少妇99| 91亚洲综合| 精品久热| 人妻熟女一区二区在线视频| www色色色com| 天堂综合网| 免费看日产一区二区三区| 91黑丝操| www九九热| 亚洲国产精品9999在线观看| 69人妻人人揉人人躁人人精品| 超碰97久| 激情深爱五月天| 9久9久9久9久视频网站| 大香蕉黄色一区| 亚洲清纯综合| 1024亚洲中文字幕久在线看片你懂的 | 亚洲精品天天影视综合网| 精品黄色电影| 亚洲天堂人人妻| 91精品国产日韩欧美综合| 神马久久啊啊| 久久男女激情视频网站| 日曰骚久久精品| www.狠狠| 亚洲中字幕日本一区二区三区| 精品久久99| 日B操| 色综合超碰超| 色婷婷丁香五月| 蜜臀久久一区二区| 日本一卡二区在线| 99色视频| 岛国视频一二三区| 曰本道人妻久久久在线不卡色视频| 国内毛片国产专区二| 亚洲中文字幕久久无码精品| 97久久精品亚洲| 绯色一区二区三区不卡少妇| 亚洲熟女一区| 精品无码一区二区| 最新国产亚洲精品精品国产亚洲综合| 91综合中文字幕| 2019AV天堂| 网页导航五月天免费一二三区| 精品国产乱码久久久久久免费| 久久黄黄| 国产在线精品偷| 日本影视久久免费| 97美日韩视频| 亚洲精品久久一区二区三区蜜桃臀| 国产欧美一区激情交| 欧美色图片| 国产精品久久久久久久久久久久久久久| 久操视频资源站公开| 天天日天天干少妇日| 国产操逼网站亚洲一级黄色| 欧美在线视频观看一二三四区高清 | 日韩性爱电影一区| 日韩电影在线观看网址| 国产91丝袜 在线播放| 亚洲色图加勒比| 一级免费啪啪片| 人人干人人操人人爱| 97伦乱| 国产一区二区三区不卡手机在线| 中文字幕一区日韩精| 国产精品探花色| 殴美性天天| 综合网亚洲1| 自拍欧美| 99热导航| 欧美天天谢综合网| 中文字幕在线24| 国产性爱在线视频一区二区| 一及黄久一点| 99热在线播放| 91粉嫩萝控精品福利网站_精品影音先锋国| 国产又黄又粗又猛大片| 国产美女自拍视频| 麻豆色约约| 嫩草黄页| 97操综合| 性九九九九九九| 美腿丝袜高跟网免费视频免费视频| 91美女中出| 国产成人综合网| 亚洲精品a人片在线观看视| 久久久久亚洲精品| 一区二区偷拍拍视频| 最新中文字幕在线亚洲| 日韩精品人妻一| 国产精品网址| 91影库| 蜜乳成人AV| 理论久久婷婷网 8| 中文字幕一区 二区三四五 区日 日骚| 国产乱伦一二三区| 色999五月色| 日韩性爱播放| 99热| 蜜桃传媒一区二区亚洲| 91色五月俺来也| 淫色网综合| 欧美色图亚洲特色| 欧美91网站| 夜夜夜夜爽| 伊人96在线| 91美女高潮| 国产一区二区在线看| 床戏久久久av一区二区麻豆| 一区二区影视| 情趣丝袜无码操逼视频| 搡老人老9丨女老熟人| 午夜影美女日鸡鸡天天视频国产| 国内三级自拍小视频在线观看| 精品成人av一区二区三区在线| 国产欧美一区激情交| 五月丁香六月激情| 国产精品色哟哟| 制服中出中文人人精品| 精品无人区麻豆乱码1区2区图片| 国产高清自拍视频| 秋霞蝌科网日本一区| 岛国片在线观看视频亚洲| 欧美日韩性感| 欧美日韩人妻少妇 一区二区三区| 蜜桃网熟妇| 亚洲综合首页| 噜噜噜在线视频| 9l视频自拍9l九色成人| 一区麻豆 高清中文字幕| 日本九九久久99| 快播电影网日韩新片| J?P?NESEHD熟女熟妇伦| 亚洲 国产 精品一区| 26uuu国产| 殴洲老熟女| 久久免费9| 亚洲av综合色区图片亚洲| 亚洲码专区| 欧美在线色图| 欲色综合| 中文字幕精品资源在线| 99999精品| 美女尤物人人操| 六六久久日韩不卡| 中文字幕午夜精品久久久| 清纯唯美亚洲| 99久视频| 夜夜嗨TV| 囯产操逼片| 亚洲情色一区三区| 老女人综合| 亚洲av综合色| 欧美 综合| 97欧美综合| 美女被艹尤物视频| 久草草一二三四区久久| 亚洲天堂电影精品一区| A一区片| 涩五月婷婷| 天天操人人操骚逼网站| 人妻少妇久久中文字幕一区二区 麻豆| 国产精品一区二区三区,亚洲综合| www.狠狠干.coom| 性高潮久久久| 精品区国产区一区二区三区| 成人片视频| 亚洲码在线中文在线观看| 日韩久久三区| 五月天婷婷社区| 91精品无码人妻系列| 国产白丝在线| 久久黄色视频一区二区三区| 亚洲影视第一页| 欧美韩国你懂得在线 | 日本新免费二区三区| 国产精品一区二区手机看片| 国产精品久久发布| 国产精品人妻无码久久久互動交流| 亚洲精品久久一区二区三区蜜桃臀| 成人精品无码| 超碰人妻中文在线| 99久久婷婷丁香| 中文字幕诱惑制服人妻丝袜美丝袜美 | 日韩成年人性爱视频| 亚洲黑丝在线| 五十路熟女人妻一区二区在线观看 | 天天日日日射| 6080YYY午夜理论片在线观看| 国产怡红院| 午夜视频久久久久一区| 日本大香蕉| 93人人操人人| 久久精品女同亚洲女同13| www.色操逼| 日夜精品| 国产午夜福利视频在线| 亚欧毛片基地国产毛片基地| 欧美综合网1| 五月天婷精品激情| 欧美网站免费| 九区国产| 日韩中文字幕二区| 九九九久久久| 很很很很操| 亚洲九区| 五码视频在线观看| 五月天人妻综合| 五月花婷婷| 永久免费观看的毛片的网站| 97超碰免费人人性爱| 久久久久久国产手机AV| 久久αⅴ| 97视频www| 99热这里只有精品8| 亚洲av噜噜噜噜噜噜| 超碰在线97国产| 欧美性爱在线无码| 日本影视久久免费| 天天干夜夜肏| 在线观看精品国产免费| 中文字幕乱碼在线| 丝袜熟女一区二区三区| 国产精品96| 91处女在线视频| 日本亚洲嫩草影院啪啪| 欧美大香蕉卡久久| 天天视频黄网站| 清清一区二区三区四区不卡视频| 粉嫩国产精品久久粉嫩| 激情综合二| 综合网 欧美| 久湿久久| 天天享受天天看| 91无码中出人妻视频| 精品无码久久久久久国产浪潮| 大茄子熟女AV导航| 亚洲综合性网址| 亚洲欧美校园另类春色| 国产精品久久久三级无码| 日韩一级性爱无码| 亚州一区二区| 国产搭汕a级片| 操逼短片| 久久精品99久久久久久| 超碰色中文| 天天做天天爱天天爽| 色欲蜜臀AV| 豆花视频操逼网址| 欧美色女人| 哈哈操 大香蕉| 久久人妻无码毛片A片麻豆| 欧美人妻精品| 久久午夜伦| 色五月丁香五月| 强奸乱伦大香蕉网| 丰满人妻无码一区二区三区| 国产欧美精选激情视频| 午夜男女爽爽爽影院视频| 搡老女人老熟女91老熟女综合网| 天美av在线| 五月婷婷青青草娱乐伊人| 一区| 色九九九综合| 97欧美日韩中文| 天美欧美国产| 素颜老阿姨乱情色| 色悠久久久av| 999久久久久久久久| 欧成人精品一区二区三区| 97超色| 污电影在线观看| 91强在线播放| AV色图| 久久久久96| 老鸭窝在线视频播放| www.成人无码| 精品国产乱子伦一区二区三区,精品一| 欧美人妻熟女在线| 亚洲天堂男| 啊啊啊啊啊在线| 美女被啪到深处抽搐视频| 91狠狠综| 午夜福利无毒不卡| 国产精品探花在线| 中文字幕一品色图| 国产AV天美传媒一区二区三区 | 日本女优在线视频福利| 亚洲乱码尤物193YW| 日韩一级片在线看| 欧洲天天在线| 久久爽爽精品| 日日97| 国产精品视频内谢女人| 中文字幕乱码人妻二区三区| 秋霞无码av鲁丝片一区| 大香蕉综合网| 97内射偷拍| 97超级色碰碰| 亚洲日韩国产精品| 老熟妇一区二区三区…| 久/久精品99看9| 亚洲熟妇图片| 国产精品九九| dy888午夜老子影视达达兔| 亚洲高清无毛一区二区| 黄色一级视| 四虎影视国产精品| 全国男人天堂网| 最新亚洲黄色免费电影| 国产自产一区视频在线| 丁香五月综合| 欧美亚洲日韩16色| 黑人在线91| 日本人妻中文字幕精品| 亚洲欧洲综合视频在线| av在线人气| 少妇特黄一区二区三区| 色99999| 欧美色网| 黄色av片三级三级三级免费看| 亚洲国产精品久久久久久久久久| 999综合色| 亚洲欧美在线丝袜| 3d成人精品一区二区| 校园春色 男人天堂 | 亚洲熟女乱色一区二区三区| 亚洲女毛多水多21P| 久久天天躁日日躁狠狠躁 | 久久久久久91香蕉国产| 97色欧洲| 九九九九精品| 色悠久久久av| 久久久新亚洲AV| 免费看欧美美女黄色大片 | 后入福利视频| 国产综合在线视频网站| 粉嫩国产精品久久粉嫩| 91超碰丝袜制服| 一本久道在线综合视频| 精品无吗久久| 激情五月天中文字幕色| 人妻少妇久久久| 免费男人的天堂| 郑州宾馆老熟女露脸啪啪| 日本加靬比网站发布页| 男人天堂电影院| 亚洲激情网一二三四区| 后入精品| 九九久久综合| 国产sv美女内射| 久久99亚洲精品久久99果| 黄久在线| 日韩免费看黄片| 精品久久九| 伊人激情五月天一区二区 | 国产人伦a片信息免费片| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 大香蕉99热| 十八禁啪啦拍视频无遮挡| 99re95| 日本天天操| 加勒比大香蕉视频在线| 国产乱不卡| 久久九九热| 亚洲精品无码成人久久久99| 日韩ab网| 可以免费观看的日韩av毛片| 亚洲欧美日韩中文久久自慰| 性开放中文AV高清无码免费看| 性爱AV天堂| 日本视频一区二区三区| 日韩黄色小说| 色五月婷婷中文字幕| 亚洲国产天堂| 天天谢天天干| 夜夜爽妓女| 欧美区亚洲区偷拍区| 婷婷五月丁香五月| 国产成人五月天丁香花| 人妻久久久久久久久久久久久久久| 日日躁夜夜躁狠狠躁超爽| 中文字幕黑人大片| 超碰97人人cao| 亚州综合AⅤ| 亚洲精品日日夜夜52| 91中文字幕制服丝袜免费视频| 亚洲天堂色图| 成人a大片在线观看| 亚洲第一页综合在线| 久久黄黄| 亚洲伊人a线观看视频| 综合网亚洲1| 好湿好紧好爽 视频| 影音先锋每日最新资源在线观看| 人妻丝袜肏逼| 超碰人人妻| 俄罗斯一区二区视频在线观看| 亚洲天堂久| 伊人大香蕉在线| 嫩草影院在线观看精品| 天天综合官网| 亚拍在线| 久久9久9久99久9久9| 亚洲日韩美国人妻| 9久久久久| 黄色片G G G| 欧美亚洲性爱一区二区| 亚洲成人美女无吗| 日韩操啪| 亚洲小说视频| 亚洲天堂美臀在线| 按摩中文字幕| 五月婷婷爱六月丁香色| 国产一在线观看| 超碰色老头| 亚洲国产精品有声| 久久六六| 激情在线青青操| 美女黄码视频午夜| 肥臀熟女福利视频一区二区| 91一起操| 国产精品色片一区二区| 欧美真人抽搐一进一出gif| 激情婷婷丁香网| 金典av| 96AV久久久| 99re9在线| 婷婷久久大香蕉| 无码精品一区二区三区潘金莲| 色欲天天综合久久久无码网中文| 亚洲色图欧美色图在线播放| 91少妇香蕉久久精品| 久久超碰、| 九九久久一区二区三区| 中文字幕日韩综合| 成人片在线播放| 簧片免费看视频| 久久久麻豆精品| 乱伦图av| 国产精品制服丝袜清纯唯美| 99这里只有精品国产| 精品人妻视频入口| 乱伦熟女论坛| 国产丝袜美女在线一区| 操逼网站网站| 色哟哟AⅤ| 亚洲熟女乱色一区二区三区| www.亚洲黄色| 国产中文字幕在线点播| 成人26uuu| 国语对白露脸XXXXXX| 2024年最新色情网站在线观看| 91亚州| 国产二区三区免费视频| 国内精品嫩模A∨私拍小视频| 1区2区3区视频| 91在线免费精品视频| 一级黄色性爱裸体视频| 欧美成人一级麻豆| 大香蕉乱级| 欧美一级久久久久久久大片动画 | 九九AV| 熟妇人妻精品一区二区视频色欲| 美女刺激久久国产欧美| 亚洲精品819| 男插女青青影院| 亚洲欧美日韩电影网站一区| 风月影院男女十八禁| 天天综合91入口| 青青草福利视频| 91性高朝久久久久久久久| 亚洲欧洲综合av在线| 思思在线免费视频| 五月婷婷基地| 黄色二级片网站| 91欧美另类| 精品无人区麻豆乱码1区2区图片| 欧美色图 色综合图| 伊人网免费视频| 日韩亚洲国产视频| 色婷婷久久| 女人天堂AV五区在线| 国厂麻豆77q4| 夜夜夜夜久久久久| 97无码视频在线播放| 成人亚欧免费视频| 精品妇女一区二区三区| 亚州综合AⅤ| 欧美伊人电影| 国产v片在线免费观看| 国产操偷| 色一射色一射| 久久久久久裸体| 国产强奸乱伦第1页| 在线a v| 九色97| 中文字幕 国产区| 乱伦系列一区二区| 中文字幕在线观看第二页| 999 久久久| 久久这里只| 日韩精品碰碰| 精品国产乱码久久久久久影片| 欧美日韩亚洲高清不卡一区二区三区| 97操综合| 亚洲无线码欧洲精品区别| 免费啪啪啪网站18岁| 国内黄色精品| 大香蕉中文201| 日本无码1| 国产伦精品免编号公布| 天天综合网亚洲综合网| 国产91av在线播放| 人妻少妇视频在线播放| 伊人久久亚洲色欲综合网站| 亚洲精品国产精品成人| 激情专区综合| 青青草无码视频| 20cm女自慰在线日韩欧美| av一区二区三区 中文| 美女主播色欲91抠b在线播放| 外国免费性情大片| 家庭乱伦性爱av| 欧美狠狠弄| 91精品丝袜久久久久久| 99久久久er直播网址| 91 国产丝袜在线放观看| 久久久月天| 青娱乐国产精品| 欧洲亚洲国产综合在线| 亚洲 综合 欧美| 精品丰满熟妇人妻一区| 综合久久六月久久婷婷| 久久蜜色情在线视频xxx免费观看| 999999精品| 婷婷五月天激情网| 亚洲第一页色网| 性爱av网站| 人人澡人人澡人人| 欧日a| 精品视频久久区| 免费看国产曰批40分钟怎么下载| 日日骚 av| 免费看黄片现成| 美女淫穴| 欧美1区二区三区公司| 中文字幕在在线观看网站| 亚洲久久久久| 九九天堂| 美女裸体无遮挡永久免费观看网站| 无码91| 2018天天日天天日| 亚洲色图加勒比| 欧美日韩黄片精品在线| 日韩精品99久久久久久中文字幕 | 亚洲中文字幕精品久久久久久直播| 亚州国产成人精品女人久久| 午夜寂寞欧美| 91青青在线| 色丁香五月婷婷| 蜜臀久久99精品久久久电影| 高清不卡一二三区视频......| 一级毛片电影免费看| 91色爽欧美| 欧美国产精品| 久久r精品| 亚洲欧洲另类| 乱伦熟女论坛| 97人妻色| 五月天综合在线| 人人妻人人爽| 伊人色综合超碰| www.99中文字幕| 久久r精品| 日韩欧美女优电影| 国内偷自视频区视频综合| 中文无线日韩一区| 婷婷五月天伊人| 亚洲在线网站| 蜜臀av中文字幕| 色婷婷基地| 性色AV网站| 久久熟女久| 99只有精品| 国产欧美日本亚洲精品| 色777999综合| 人妻天天操天天爽视频免费 | 久久不卡一区二区| 国产一区二区精品久久99| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 99国内熟女露脸视频| 丰满人妻一区二区三区四区| 俺去久久| 日韩综合97p| 丁香五月性| 99精品国产户外露出| 嗯嗯啊好大| 人妻AV 中文字幕的| 日韩免费看在线黄色片| 亚洲日韩狠狠撸视频| 日韩久久超碰色| 狠狠操综合| 人人贴人人摸| 夜夜嗨视频| 蜜汁欧美| 天天摸天天舔天天操| 国产人妻精品久久久一区二区三区 | 日韩精品资源专区二区| 久久精品国产97欧美精品亚洲| 欧美一区二区在线资源| 丁香五月天激情网站| 亚洲国产91精品一区二区久久| 91精品丝袜久久久久久| 夜夜骑操视频| 躁躁日曰躁2020| 六月丁香五月婷婷| 欧美熟女操屄| 99e久久国产精品| 天天综合欧美| 亚洲人妻色图| 蜜臀一二三区| 操婢日韩| 青青青青操国内视频在线| 国产AV人人夜夜澡人人爽麻豆| 日本三级小说中文字幕| 五月婷婷啪啪| 亚洲无码久久久久久久| 日本三级一区二区 在线| 啊啊啊想要| 变态综合色| 新怡红院| 超碰97综合网| 免费99精品国产自在在线| 国产AV人人 夜夜人人澡| 亚洲天堂性爱| 亚码激情| 亚洲一区日韩精品中文字幕| 国产欧美成人精品| 抽插爽| 大吊色| 精品久久久久黄少妇| 大香蕉在线视频15| 91蜜臀在线久久久久| 96精品在线| 人妻啊啊人妻啊啊| 夜夜操二区| 精品区9| 六六久久日韩不卡| 婷婷香蕉欧美在线一区二区三区 | 天天爽入口| 久久久国产护士丝袜美腿一| 久久亚洲天堂| 亚洲天堂少妇| 校园激情狠狠四射| 亚洲熟女av中文字幕| 九热中文字幕| 成人一二| 久久国产乱子伦精品免费女人| 国产野战露脸在线播放| AV不卡在线| 激情五月天丁香社区| 天天色播| 久久久99久9| 成人A片男人的天堂| 久久一二三四五六七八九区区| 97超碰久久色| 久久久一二三四区| 亚洲色人阁| 日韩成人私密一级精品av| 久久这里只精品免费福利| 国产大陆天天艹| 人人射人人操人人摸| 色噜噜婷婷| 天天综合网久久ww| 人妻出轨一区二区三区| 国产精品老熟女一区二区| 久久免费老司机精品| 久久夜嗨| 少妇熟女视频一区二区三区| 久久久性爱| 欧美精品久久久久久久丰满| 黄色在线网站| 色综合99| 欧美日韩国产电影| 91麻豆天美国产欧美高潮| 国产精品乱码久久| 久操com| 防屏蔽在线视频| 歐美性天天| 一本久久久精品| 超碰在线欧美性爱激情| 自拍大香蕉乱插| 亚洲欲色9532548967一区| 91天天c| 精品999一区二区| 人人操肉肉| 亚乱色| 操熟女91| 国产黄色影片在线观看| 亚洲Av无码成人精品国产| 激情国产乱伦Av| 精品国产一区二区三区香蕉欧美| 岛国毛片手机在线观看| 五月丁香啪啪啪| 亚洲天堂情色| 一区二区影视| 日韩一区二区高清在线观看的| 国产精品麻豆成人AV艾秋| 麻豆成人av| 在线视频97| 日本3级一区二区免费| 91嫩草欧美| 大香蕉中文在线| 国产麻豆福利av在线播放| 麻豆区99999| 日韩人妻无码不卡网站| 五月丁香拍拍激情综合三级| 久久国产精品91| 东京热91| 色综合久久88色综合久久天天| 伊人久久国产免费观看视频| 精品国产乱码久久久久久免费| 国产一区二区三区白丝| 欧美不卡在线美女| 国产在线激情| 久久婷婷综合国际产色怕| 操逼精品视频| 男插女青青影院| 啊啊啊啊一区| 91日产桃蜜| 91强奸乱轮| 97天天在线| 操迟操逼在巾线Fre看| 日日干夜夜操视频h| 97日韩欧美| 中文字幕日韩国产传媒欧美精品| 新91视频.cmp| 免费一级毛片在线视频观看| 91色色综合| 日韩熟女乱伦中出| 欧美在线啊啊啊 | 无码一区二区精品视频久久久春药 | 精品一区二区国产日韩| 97超碰中文在线| 色色五月婷| 五月天AV资源| 黄片直播三级黄片两女一男| 成人欧美日超碰| 在线观看成人性爱免费小视频| 艳尻美人妻| 大香蕉www.超碰| 91久久国产综合精品| 国产一区自拍欧美日韩| 日日夜夜青青草母狗| 色操逼网| 五月开心久久AV官网| 凹凸久久人人| 成年人免费观看网站| 中文字幕av乱伦| 九七超碰人人乐| 天天干美少妇一区| 91亚洲欧美| 九九九九日本| 搡老女人老妇女AAA一VU麻豆| 日本九九久久99| 尤物国产一区在线观看| 日本国产二线女色| 日韩成人精品中文字幕| 日日夜夜免费| 久久这里精品国产99丫e6| 波多野结衣之双飞调教在线播放 | 桃色人妻在线视频| 日韩黄色一区二区三区| 91N综合网| 国产人妻精品久久久一区二区三区 | 日韩av影片在线观看| 久久久性爱| 少妇同性| 亚洲欧洲日韩国产自在线| 青青久草| 女同性恋一区二区三区精品视频| 欧美日日操| 91中文字幕在线观看| 91neishe| 日本免费一级AAA大片器| 日本高清一本二本免费不卡| 日韩AV电影网站| 亚洲性爱免费电影| 欧美丝袜中文字幕07在线| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 影音先锋中文字幕日本好一区二区| 97中文综合| 欧美亚洲丝袜美女电影| 亚洲免费成人精品电影| 高清无码人妻久久久一区二区三区aⅴ| 精品国产污一区二区三区| 天天色综亚洲91污| 白丝一区| 中文字幕精品亚洲熟女| 91蜜臀在线久久久久| com 首页 18岁 禁区 女优 免费 精选 同城 | 日韩欧美麻豆 | 国产精品原创巨作?v网站| 精品人妻视频一区二区在线播放| 日韩一级二级| 午夜啪啪片| 久久久久9999| 玖色av| 91+欧美| 99只有精品| 91动漫操逼视频| 天天射天天操天天干天天吃2018| 伊人嫩草| 性色av一区二区| 日韩久久激情精品| 天堂日本亚洲欧美| 中文字幕 国产 精品| 亚洲**2021在线观看| 久久久无码精品人妻二区| 超硑97精品| 视频二区美腿丝袜制服人妻欧美| 九色在线熟女国产黑人| 自拍偷拍第26| 夜夜爽夜夜爽| 欧美综合综合| 学生妹天天看| 久久骚少妇| 亚洲精品一二三四区| 91国产精品在线看| 美女被艹尤物视频| 思思热在线cao| AV一起草在线| 香蕉欧美| 亚洲日韩天堂| 成人性交午夜免费片| 国产视频97| 欧亚日本情色| 日韩 女同 综合| 91欧美综合在线| 99色婷婷中文字幕乱色| 亚洲av总站| 四虎AV无码| 江都AV在线| 性色avv| 欧美熟爽综合| 99热99re超碰精品| 九九热九九热| 天美av在线观看| 亚洲不卡AV在线| 青青网三级视频| 天美传媒av 在线| 亚洲夜色在线| 天天日日舔舔| 亚洲天堂另类小说男人| 快点操死我| 成人日韩中文字幕| 久久一二三四不卡| 久草综合视频| 日日摸日日碰| 亚洲好色人妻| 日天天九九天堂666| 国际精品久久久| 一区二区三区一亚洲中文字幕、综合区灬| 久热精品在线| 熟女少妇视频| 男人的天堂网页| 久久成年片色大黄全免费网站| 天天看天天日天天操| 明星性猛交ⅹxxx乱大交| 成人av性爱电影在线观看| 婷婷丁香九月| 日韩三级天堂在线观看|