亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

daisy-framework事件監(jiān)聽機(jī)制全解析:定義、注冊、異步與事務(wù)

daisy-framework事件監(jiān)聽機(jī)制全解析:定義、注冊、異步與事務(wù) 最近在維護(hù) daisy-framework 的時候我重新把 event、listener 這套事件監(jiān)聽機(jī)制從源碼到業(yè)務(wù)用整個過了一遍。說實話事件監(jiān)聽在任何一個服務(wù)端框架里都不算新東西但真正能把“事件怎么定義、監(jiān)聽器怎么注冊、發(fā)布之后是同步還是異步、異常怎么處理”講清楚的文章并不多。daisy-framework 把事件監(jiān)聽作為一個獨立模塊放進(jìn)核心包初衷很簡單把業(yè)務(wù)主流程里的橫切動作拆出去讓下單只操心下單庫存、通知、日志這些事由事件驅(qū)動去完成。這篇文章我會從設(shè)計思路開始依次講清楚事件對象的定義規(guī)范、監(jiān)聽器的三種注冊方式、事件發(fā)布全流程、異步監(jiān)聽和事務(wù)綁定的取舍最后附上我實際踩坑整理的問題排查表。適合正在用 daisy-framework 做業(yè)務(wù)開發(fā)的伙伴也適合任何想搞懂事件驅(qū)動設(shè)計的人。文章里的代碼都來自一個我稱之為“模擬項目X”的真實改造過程很直接不繞彎。1. 為什么 daisy-framework 要內(nèi)置一套事件監(jiān)聽機(jī)制1.1 事件監(jiān)聽解決的是哪個層面的問題業(yè)務(wù)代碼里最難纏的不是算法而是各種“順便處理”的業(yè)務(wù)。訂單支付成功要減庫存、發(fā)優(yōu)惠券、更新會員等級、寫審計日志、通知運營群——如果這些代碼全部寫在支付回調(diào)里一個方法幾百行是常態(tài)。更要命的是它們之間沒有先后邏輯但因為寫在同一個方法里被強(qiáng)制串行執(zhí)行哪天通知服務(wù)變慢了支付主流程也跟著慢。事件監(jiān)聽就是把這堆“順便處理”從主流程里剝離的手段。支付回調(diào)只做一件事發(fā)布一個訂單支付成功事件。至于誰關(guān)心這個事件由 daisy-framework 的事件調(diào)度器去分發(fā)。事件發(fā)布方和被通知方之間沒有直接依賴這正是事件驅(qū)動最核心的價值。我在實際項目里最直觀的感受是沒有事件監(jiān)聽時加一個新動作要改老代碼有了事件監(jiān)聽后加一個新動作只是新增一個監(jiān)聽器主流程代碼一行不動。這個差別在項目中期特別明顯功能越多優(yōu)勢越大。1.2 daisy 事件機(jī)制的幾個關(guān)鍵設(shè)計約束daisy-framework 的事件模塊在基礎(chǔ)包里實現(xiàn)API 不大但約束很明確。事件默認(rèn)在進(jìn)程內(nèi)分發(fā)不依賴外部存儲。發(fā)布事件是內(nèi)存操作性能好但同時也意味著事件不會持久化進(jìn)程重啟后未處理的事件就沒了。這決定了 daisy 的事件適合做業(yè)務(wù)編排和狀態(tài)通知不適合做需要保證不丟數(shù)據(jù)的消息傳遞。監(jiān)聽器默認(rèn)同步執(zhí)行。同步的好處是事務(wù)、日志上下文、用戶會話都能天然傳遞。需要異步時用顯式注解聲明異步是例外而不是默認(rèn)。這個設(shè)計我非常認(rèn)可它強(qiáng)迫你先思考“這個監(jiān)聽器真的需要異步嗎”而不是一股腦把問題丟給線程池。支持優(yōu)先級排序和條件過濾。同一個事件可以被多個監(jiān)聽器按優(yōu)先級從小到大依次處理條件過濾則通過注解的 condition 屬性實現(xiàn)避免在監(jiān)聽器方法內(nèi)部寫一堆 if 判斷。1.3 和消息隊列的區(qū)別先分清楚再動手很多初學(xué)者把框架事件監(jiān)聽和消息隊列混在一起我見過不止一次。daisy 的事件監(jiān)聽強(qiáng)調(diào)的是“進(jìn)程內(nèi)解耦”消息隊列強(qiáng)調(diào)的是“跨進(jìn)程可靠傳遞”。舉個例子訂單支付后給用戶發(fā)送 App 推送這件事可以走 daisy 監(jiān)聽器因為推送邏輯在同一個服務(wù)進(jìn)程內(nèi)失敗了大不了記錄日志稍后重試或者接受偶發(fā)失敗。但如果訂單數(shù)據(jù)要同步到大數(shù)據(jù)平臺那就不能只靠事件監(jiān)聽了應(yīng)該把訂單支付成功事件轉(zhuǎn)成消息投遞到消息中間件由下游服務(wù)消費。說白了事件監(jiān)聽解決的是代碼結(jié)構(gòu)問題消息隊列解決的是系統(tǒng)架構(gòu)問題。判斷用哪套機(jī)制有個很簡單的標(biāo)準(zhǔn)監(jiān)聽器和發(fā)布者會不會部署在兩個不同的進(jìn)程里如果會就不要用 daisy 自帶事件如果不會優(yōu)先用自帶事件。別一上來就上消息隊列成本和復(fù)雜度完全不同。2. 事件定義與監(jiān)聽器聲明動手前的關(guān)鍵設(shè)計2.1 先寫事件類好的事件對象長什么樣事件類看起來簡單其實設(shè)計不好很影響后續(xù)維護(hù)。先看我常用的寫法以訂單支付成功事件為例public class OrderPaidEvent implements DaisyEvent { private final String orderNo; private final Long userId; private final BigDecimal paidAmount; private final LocalDateTime paidAt; public OrderPaidEvent(String orderNo, Long userId, BigDecimal paidAmount, LocalDateTime paidAt) { this.orderNo orderNo; this.userId userId; this.paidAmount paidAmount; this.paidAt paidAt; } public String getOrderNo() { return orderNo; } public Long getUserId() { return userId; } public BigDecimal getPaidAmount() { return paidAmount; } public LocalDateTime getPaidAt() { return paidAt; } }這里有三條經(jīng)驗都是我在真實項目里付出過代價換來的。第一事件對象建議做成不可變字段全用 final只提供 getter。原因很簡單事件在發(fā)布后可能被多個監(jiān)聽器讀取如果有人中途改了某個字段后面的監(jiān)聽器拿到的數(shù)據(jù)就是不一致的這種 bug 極難定位。事件發(fā)布出去之后就把它當(dāng)成一個只讀快照誰都不該碰它的內(nèi)部狀態(tài)。第二事件里傳 ID 而不是傳整個實體。傳 Order 對象雖然方便但監(jiān)聽器處理時如果去讀 Order 的某個屬性而這個對象已經(jīng)脫離了數(shù)據(jù)庫狀態(tài)甚至已經(jīng)被后續(xù)流程修改它并不代表真實數(shù)據(jù)。傳 orderNo、userId 這類 ID監(jiān)聽器在需要完整數(shù)據(jù)時自己按 ID 去查詢能保證拿到的數(shù)據(jù)是最新的也能避免事件對象被無意改壞。第三事件命名用過去時。OrderPaidEvent、StockDeductedEvent 這類完成時態(tài)名字暗示“已經(jīng)發(fā)生”而 OrderPayEvent 這種命令式勉強(qiáng)能用但語義不清晰。命令式事件容易讓人把監(jiān)聽器寫成“替發(fā)布者執(zhí)行任務(wù)”這就和命令模式混淆了事件模型就變味了。2.2 用注解聲明監(jiān)聽器最常用的方式我在模擬項目X里90% 的監(jiān)聽器都用注解方式寫。代碼看起來是這樣的Component DaisyEventListener public class OrderPaidListener { DaisySubscribe(priority 10) public void deductStock(OrderPaidEvent event) { // 庫存扣減邏輯 } DaisySubscribe(priority 20) public void grantCoupon(OrderPaidEvent event) { // 發(fā)券邏輯 } }解釋一下 DaisySubscribe 的 priority。值越小越先執(zhí)行默認(rèn)值是 100。業(yè)務(wù)上如果“先扣庫存后發(fā)券”有嚴(yán)格順序就把優(yōu)先級拉開。但我一般不建議把太多順序依賴放到優(yōu)先級上。如果監(jiān)聽器之間存在強(qiáng)順序依賴更好的辦法是合并成一個監(jiān)聽器或者把這個順序用注釋寫清楚放在文檔里。DaisySubscribe 可以直接加在普通方法上框架通過反射拿到方法參數(shù)列表的第一個參數(shù)作為事件類型。方法可以額外接收事件上下文參數(shù)拿到發(fā)布源、時間戳等信息。這個細(xì)節(jié)很多文檔沒寫我替大家踩過了后面排查問題時會用到。還有一個值得提的點一個監(jiān)聽器類可以定義多個方法分別監(jiān)聽不同類型的事件。這在實際開發(fā)中很方便比如同一個類里處理訂單相關(guān)的所有通知動作不用拆得七零八落。2.3 接口方式注冊監(jiān)聽器的適用場景注解不是唯一的注冊方式daisy 也保留了接口式注冊例如Component public class StockChangeListener implements DaisyEventListenerStockChangedEvent { Override public void onEvent(StockChangedEvent event) { // 庫存變化后的處理 } }這種寫法的好處是事件類型通過泛型直接確定不需要反射解析參數(shù)排查起來更加直白。缺點是每個監(jiān)聽器類只能處理一種事件一個類要監(jiān)聽多個事件就得寫多個類。我看到有些團(tuán)隊把接口方式和注解方式混用這本身沒問題。但建議在項目規(guī)范里約定同一個模塊盡量統(tǒng)一用一種方式。我這里的基本約定是單個事件的復(fù)雜處理邏輯用接口方式一個監(jiān)聽器里承載多個相似事件、處理方法很短的用注解方式。兩種方式生成的監(jiān)聽器對象在注冊表里是共存的不會有沖突。2.4 監(jiān)聽器的掃描與注冊機(jī)制daisy 在應(yīng)用啟動時會做兩件事掃描加了 DaisyEventListener 的類以及掃描實現(xiàn) DaisyEventListener 接口的類。掃描到的監(jiān)聽器實例統(tǒng)一以單例保存在一個注冊表里key 是事件類型value 是該事件對應(yīng)的一組監(jiān)聽器方法包裝對象。每次 publish 一個事件調(diào)度器先從注冊表按事件類型找到候選監(jiān)聽器集合如果事件類型是某個父類的子類也會匹配到監(jiān)聽父類的監(jiān)聽器。這個“父子事件匹配”特性很有用比如所有業(yè)務(wù)事件都繼承同一個基類事件那只需要寫一個監(jiān)聽基類的監(jiān)聽器就能統(tǒng)一做埋點或?qū)徲嫛W⒁獗O(jiān)聽器注冊發(fā)生在應(yīng)用啟動階段。如果你在運行期手動 new 了一個監(jiān)聽器但沒注冊進(jìn)容器那它是永遠(yuǎn)不會被觸發(fā)的。這也是排查“監(jiān)聽器不生效”問題時要先確認(rèn)的一點。3. 從發(fā)布到觸發(fā)事件監(jiān)聽的完整執(zhí)行鏈路3.1 業(yè)務(wù)代碼里如何發(fā)布事件先給出最直觀的調(diào)用方式RestController public class OrderController { private final EventDispatcher dispatcher; public OrderController(EventDispatcher dispatcher) { this.dispatcher dispatcher; } PostMapping(/pay) public Result pay(RequestBody PayRequest request) { // 1. 支付相關(guān)業(yè)務(wù)處理 OrderPaidResult paidResult paymentService.pay(request); // 2. 發(fā)布事件 dispatcher.publish(new OrderPaidEvent( paidResult.getOrderNo(), request.getUserId(), paidResult.getPaidAmount(), LocalDateTime.now() )); return Result.success(); } }發(fā)布接口很簡單但有幾個執(zhí)行細(xì)節(jié)值得注意。EventDispatcher.publish 默認(rèn)是同步的它會在當(dāng)前線程里依次調(diào)用所有匹配的監(jiān)聽器方法全部執(zhí)行完 publish 方法才返回。如果你的監(jiān)聽器里有耗時操作發(fā)布這一行也會跟著變慢。我見過有人因此誤判“事件發(fā)布很慢”實際上慢的是監(jiān)聽器里的業(yè)務(wù)邏輯。另外發(fā)布事件時傳入的事件對象不要重復(fù)使用。publish 之后如果還在同一個方法里對它做改動監(jiān)聽器看到的可能是改到一半的狀態(tài)。最保險的做法是發(fā)布后立即丟棄引用或者堅持使用不可變對象。3.2 一個訂單支付事件實際執(zhí)行順序還原我在模擬項目X里做過一個完整測試當(dāng)時注冊了三類監(jiān)聽器第一個優(yōu)先級是 10負(fù)責(zé)扣減庫存第二個優(yōu)先級是 20負(fù)責(zé)發(fā)送 App 推送第三個優(yōu)先級是 30負(fù)責(zé)寫審計日志。它們的執(zhí)行順序是嚴(yán)格按 priority 從小到大在同一線程里逐個執(zhí)行。具體流程可以這樣理解入口是訂單支付接口支付成功后在當(dāng)前線程調(diào)用 dispatcher.publish(event)框架根據(jù) event 的實際類型找到候選監(jiān)聽器列表框架按 priority 排序依次執(zhí)行扣庫存、發(fā)推送、寫日志所有監(jiān)聽器返回后publish 方法返回控制器繼續(xù)執(zhí)行。這條鏈路里沒有創(chuàng)建新線程也沒有切換線程上下文。正因為都是在調(diào)用線程里跑監(jiān)聽器里的事務(wù)注解、traceId、當(dāng)前登錄用戶都能直接用。這也是同步監(jiān)聽的天然優(yōu)勢。如果你在監(jiān)聽器方法上加了異步注解情況就變了框架會把這個方法包裝成任務(wù)提交到線程池publish 方法不等它執(zhí)行完馬上返回真正的執(zhí)行發(fā)生在線程池的工作線程里。這里必須提醒異步監(jiān)聽器里不要再依賴主線程的事務(wù)和用戶上下文除非你做了顯式傳遞。3.3 監(jiān)聽器拋異常了后面怎么走這個點每種框架設(shè)計都不一樣daisy 的默認(rèn)策略是同步監(jiān)聽器執(zhí)行過程中如果拋出異常異常會沿調(diào)用棧向上拋給 publish 調(diào)用方后續(xù)監(jiān)聽器不再執(zhí)行。也就是說如果扣庫存的監(jiān)聽器掛了訂單支付接口會拿到異常發(fā)推送的監(jiān)聽器也不會執(zhí)行。這個設(shè)計在某些場景下合理在某些場景下就很不近人情。比如你只是寫個審計日志它失敗了卻把訂單支付接口給打掛了這顯然不合理。解決辦法有兩個。方案一在監(jiān)聽器方法內(nèi)部捕獲異常并自行處理適合對異常不敏感的邏輯方案二使用框架提供的忽略異常參數(shù)讓框架捕獲異常并記錄日志不中斷后續(xù)監(jiān)聽器。我的建議是核心業(yè)務(wù)監(jiān)聽器用默認(rèn)的異常上拋策略日志、通知類監(jiān)聽器顯式打開忽略異常別讓輔助邏輯拖垮主流程。4. 異步監(jiān)聽與事務(wù)綁定使用頻率最高也最容易出錯的兩塊4.1 異步監(jiān)聽器正確寫法與線程池配置先看代碼Component DaisyEventListener public class NotificationListener { DaisyAsync DaisySubscribe(priority 20) public void sendPush(OrderPaidEvent event) { // 發(fā)送 App 推送 } }異步注解放在 DaisySubscribe 方法上框架檢測到這個注解后會把監(jiān)聽器方法和異步任務(wù)綁定。對于異步監(jiān)聽我踩過三個坑逐個說。第一個坑是線程池默認(rèn)參數(shù)太小。daisy 默認(rèn)的異步線程池核心線程數(shù)是 CPU 核數(shù)隊列容量 1024。輕量場景沒問題但如果有大量異步監(jiān)聽任務(wù)一旦隊列滿了后續(xù)任務(wù)就會被拒絕。我通常會在配置里顯式調(diào)大daisy.event.async.core-pool-size8 daisy.event.async.max-pool-size32 daisy.event.async.queue-capacity2048 daisy.event.async.keep-alive-seconds60第二個坑是異步監(jiān)聽器里的異常不會被調(diào)用方感知。主流程早就返回了監(jiān)聽器執(zhí)行異常只能靠框架日志和監(jiān)控告警發(fā)現(xiàn)。所以異步監(jiān)聽器內(nèi)部一定要有完善的日志和異常捕獲否則出了問題就是黑盒等用戶來投訴你才知道。第三個坑是上下文丟失。異步線程里沒有主線程的 ThreadLocaltraceId、當(dāng)前用戶 ID 可能都是空的。我的解法是在發(fā)布前把上下文信息塞進(jìn)事件對象里比如在事件里加一個 operatorId 字段或者在異步線程池的任務(wù)包裝中顯式傳遞 ThreadLocal。我更推薦前者代碼里清清楚楚出了問題也好查。4.2 事務(wù)提交后再觸發(fā)事件的必要性這個點特別值得單獨說。假設(shè)你的監(jiān)聽器做的是“支付成功后給用戶發(fā)權(quán)益”如果監(jiān)聽器在事務(wù)提交前執(zhí)行會發(fā)生什么看一個真實場景主服務(wù)方法開啟了事務(wù)業(yè)務(wù)邏輯更新訂單狀態(tài)發(fā)布訂單支付成功事件隨后事務(wù)提交。發(fā)布時監(jiān)聽器同步執(zhí)行它去查詢訂單狀態(tài)發(fā)現(xiàn)訂單還是“待支付”因為事務(wù)還沒提交。這就是典型的“事件先于事務(wù)提交”問題。daisy 提供的解法是事務(wù)同步事件讓事件在事務(wù)提交之后才真正觸發(fā)Transactional public void payOrder(String orderNo, Long userId, BigDecimal amount) { // 更新訂單狀態(tài)、扣減余額 orderDao.updateStatus(orderNo, PAID); // 注冊一個事務(wù)同步事件真正觸發(fā)是在提交成功后 EventDispatcher.publishAfterTransactionCommit( new OrderPaidEvent(orderNo, userId, amount, LocalDateTime.now()) ); }publishAfterTransactionCommit 的底層是注冊一個事務(wù)同步回調(diào)事務(wù)提交成功后由框架回調(diào)觸發(fā)監(jiān)聽器如果事務(wù)回滾了這個事件根本不會發(fā)布。這對一致性非常有價值狀態(tài)變更真正落庫后才通知下游做后續(xù)動作。注意publishAfterTransactionCommit 依賴當(dāng)前線程存在活躍事務(wù)。如果方法沒有事務(wù)daisy 會拋出異常提示。這是框架刻意為之防止你誤以為事件一定在提交后觸發(fā)結(jié)果卻立刻被同步執(zhí)行了。4.3 事務(wù)與異步組合時的執(zhí)行時序有人會問事務(wù)提交后再觸發(fā)監(jiān)聽器方法上又加了異步注解這兩個能組合嗎當(dāng)然可以。組合后的語義是事務(wù)提交成功后再把監(jiān)聽器任務(wù)丟到異步線程池執(zhí)行。這個組合很適合一個場景事務(wù)提交后發(fā)通知但不想阻塞主線程。比如支付成功發(fā)推送既要保證訂單狀態(tài)落庫后才觸發(fā)又不想推送這種耗時操作拖住接口響應(yīng)。代碼大致長這樣DaisyAsync DaisySubscribe(priority 20) public void sendPush(OrderPaidEvent event) { // 事務(wù)提交后異步發(fā)送推送 }執(zhí)行順序要理清楚主事務(wù)提交 - 事務(wù)同步回調(diào)觸發(fā) - 框架把 sendPush 放入異步線程池 - 主線程繼續(xù)返回 - 線程池執(zhí)行 sendPush。這三個環(huán)節(jié)是串行疊加的不是又異步又同步理解這一點就不會搞混。不過我不建議一個項目里大量濫用這種組合。每一次異步都是一次追蹤成本異步加事務(wù)組合更是雙重成本。讓費用花在刀刃上就行大部分場景用默認(rèn)同步就夠了。5. 實戰(zhàn)問題排查監(jiān)聽器不觸發(fā)、重復(fù)觸發(fā)與性能瓶頸5.1 監(jiān)聽器不觸發(fā)的排查清單我在使用過程中收集了一些典型問題整理成速查表現(xiàn)象可能原因排查方向監(jiān)聽器完全沒執(zhí)行事件類型不匹配檢查發(fā)布的事件類型與監(jiān)聽器參數(shù)類型是否一致監(jiān)聽器完全沒執(zhí)行監(jiān)聽器未注冊確認(rèn)類上有注解且被組件掃描監(jiān)聽器完全沒執(zhí)行監(jiān)聽器實例是手動 new 的確認(rèn)監(jiān)聽器由框架容器管理監(jiān)聽器執(zhí)行順序不對優(yōu)先級沒調(diào)檢查注解的 priority 屬性事件沒觸發(fā)發(fā)布代碼在子線程確認(rèn) publish 調(diào)用線程與事務(wù)線程一致事務(wù)事件沒觸發(fā)事務(wù)回滾查看數(shù)據(jù)庫是否真的提交成功異步監(jiān)聽沒執(zhí)行線程池被拒絕查看異步線程池拒絕策略與日志第一條“事件類型不匹配”是最高頻問題。很多人發(fā)布一個子類事件監(jiān)聽器卻寫成監(jiān)聽父類事件如果父子匹配邏輯沒有正確開啟那自然觸發(fā)不了。daisy 默認(rèn)支持子類事件匹配但前提是發(fā)布時傳入的事件對象實際類型是子類不能把子類對象強(qiáng)轉(zhuǎn)成父類后再發(fā)布?!氨O(jiān)聽器未注冊”也經(jīng)常出現(xiàn)。排查辦法很簡單啟動日志里會打印注冊過的監(jiān)聽器列表先確認(rèn)你的監(jiān)聽器類有沒有出現(xiàn)在里面。沒出現(xiàn)就是掃描路徑的問題出現(xiàn)了但不觸發(fā)再去查事件類型和優(yōu)先級。5.2 事件重復(fù)觸發(fā)三種常見姿勢事件重復(fù)觸發(fā)比不觸發(fā)更難排查因為日志看起來一切正常只是下游狀態(tài)亂了。我歸納為三類。第一類是自發(fā)布循環(huán)。監(jiān)聽器處理完業(yè)務(wù)后又發(fā)布了一個同類事件自己監(jiān)聽自己形成無限循環(huán)。這種問題通常表現(xiàn)為某個監(jiān)聽器被反復(fù)執(zhí)行甚至打爆線程池。解決方法是約定監(jiān)聽器里不允許發(fā)布它正在監(jiān)聽的那一類事件如果必須發(fā)布要在事件對象里帶一個來源標(biāo)記自己判斷后跳過。第二類是事務(wù)重試導(dǎo)致的重復(fù)發(fā)布。業(yè)務(wù)方法里先發(fā)布事件事務(wù)失敗后框架重試同一個事件就被發(fā)布了兩三次。這種問題最佳解是事件發(fā)布放在事務(wù)提交成功后也就是用發(fā)布事務(wù)同步事件同時事件對象里帶上唯一標(biāo)識監(jiān)聽器消費時做冪等判斷。第三類是監(jiān)聽器注冊重復(fù)。比如同一個類既加了 DaisyEventListener又在配置里被手工注冊了一次注冊表里就有兩個相同的監(jiān)聽器副本。排查時注意看啟動日志里是否有重復(fù)注冊的警告。5.3 同步鏈路太長怎么優(yōu)化如果你的某個監(jiān)聽器特別慢慢到主接口超時別急著把它改成異步。先定位慢的原因可能是它在查詢大量數(shù)據(jù)可能是它在調(diào)外部接口也可能是它在循環(huán)里做復(fù)雜計算。我的優(yōu)化順序是先給監(jiān)聽器加好日志和耗時統(tǒng)計確認(rèn)瓶頸所在能并行處理的多個監(jiān)聽器可以考慮用框架提供的并行支持允許多個同級監(jiān)聽器并發(fā)執(zhí)行最后才考慮異步化。為什么最后才異步因為異步引入了線程池、上下文傳遞、異常隔離三層復(fù)雜度能不用就不用。并行執(zhí)行適用于那些彼此之間沒有順序依賴、可以同時跑的邏輯。但要注意并發(fā)執(zhí)行時不要共享同一個可變對象事件對象必須是只讀的。否則兩個線程同時讀一個集合一個改一個讀很容易出并發(fā)問題。6. 用事件監(jiān)聽重構(gòu)一段支付鏈路的真實記錄6.1 重構(gòu)前一把梭的支付回調(diào)模擬項目X早期是一段支付回調(diào)寫完所有動作的。核心方法大約 180 行里面依次是更新訂單狀態(tài)、扣庫存、給用戶加積分、寫訂單操作日志、調(diào)用消息服務(wù)發(fā)通知、調(diào)用問卷服務(wù)發(fā)調(diào)查邀請。每次上線加需求都要改這個方法而且必須小心翼翼不破壞原有順序。那段時間最痛苦的是日常問題排查用戶反饋說支付成功但沒收到優(yōu)惠券我得打開這段 180 行的老代碼從頭到尾捋還要看是不是前一步異常導(dǎo)致后面的邏輯沒執(zhí)行。問題定位一次可能花一小時。后來我們把整段邏輯改成事件驅(qū)動效果非常明顯。6.2 重構(gòu)后發(fā)布一條事件各取所需重構(gòu)后的支付回調(diào)只有三件事支付服務(wù)處理真實支付、更新本地訂單狀態(tài)、發(fā)布訂單支付成功事件。后面所有動作都變成獨立的監(jiān)聽器分別監(jiān)聽訂單支付事件。下面是簡化后的監(jiān)聽器規(guī)劃監(jiān)聽器職責(zé)優(yōu)先級是否異步庫存監(jiān)聽器扣減真實庫存10否積分監(jiān)聽器增加用戶積分20否訂單日志監(jiān)聽器寫訂單操作日志30否通知監(jiān)聽器發(fā)送 App 推送40是問卷監(jiān)聽器發(fā)送問卷邀請50是扣庫存、加積分這些和資金資產(chǎn)相關(guān)的動作保持同步因為它們需要強(qiáng)一致性發(fā)推送、發(fā)問卷這些及時性要求不高的動作改成異步。這樣主接口的響應(yīng)時間立刻降下來而且后續(xù)增加一個新動作只需要新增監(jiān)聽器支付回調(diào)一行不用改。6.3 重構(gòu)過程中的三個經(jīng)驗細(xì)節(jié)第一事件字段不要塞太多。最初我把整個 Order 對象放進(jìn)事件后來發(fā)現(xiàn)監(jiān)聽器多了某些字段被偷偷修改定位起來非常麻煩。改成只放訂單號、用戶 ID、金額這幾個關(guān)鍵字段后數(shù)據(jù)一致性問題大幅減少。第二監(jiān)聽器之間嚴(yán)禁直接調(diào)用。我曾看到有同事在通知監(jiān)聽器里直接調(diào)用庫存監(jiān)聽器的某個公共方法理由是“復(fù)用扣減邏輯”。這等于變相把監(jiān)聽器串成了鏈路事件的解耦優(yōu)勢全沒了。正確做法是把公共邏輯抽到 Service 層監(jiān)聽器只做業(yè)務(wù)流程編排。第三一定要給事件加發(fā)生時間字段。之前在事件里沒加支付時間調(diào)試一個歷史訂單時根本無法判斷監(jiān)聽器執(zhí)行時點。后來統(tǒng)一在事件基類里加上 occurredAt用框架的時鐘填充排查問題方便多了。這個字段也可以用來做鏈路耗時統(tǒng)計一舉兩得。7. 一些值得堅持的實操習(xí)慣7.1 給事件和監(jiān)聽器建立統(tǒng)一規(guī)范我在團(tuán)隊里定過三條約定事件類統(tǒng)一放在 events 包下命名以 Event 結(jié)尾用過去時監(jiān)聽器統(tǒng)一放在 listeners 包下一個監(jiān)聽器類只處理同領(lǐng)域的事件監(jiān)聽器方法命名用動詞開頭能一眼看出動作含義。這個看似簡單的約定讓跨模塊協(xié)作的溝通成本下降了很多。代碼結(jié)構(gòu)上我習(xí)慣把同一個領(lǐng)域的事件、監(jiān)聽器、發(fā)布入口放在同一個模塊里。比如訂單模塊內(nèi)部有一個 events 子包包含訂單領(lǐng)域的所有事件和監(jiān)聽器。這樣后來的人接手時不需要在整個項目里到處找事件定義直接翻訂單模塊就能看全。7.2 冪等設(shè)計要提前做事件監(jiān)聽是異步分散的天然會面臨“同一個事件被處理兩次”的可能。哪怕你現(xiàn)在用的場景沒有重試也要在監(jiān)聽器入口做冪等判斷。最常見的做法是維護(hù)一張消費記錄表以事件唯一 ID 作為去重鍵。這個放到重構(gòu)后再補(bǔ)會非常痛苦所以建議項目一開始就帶上。冪等不僅是為了防消息中間件重投本地事件也可能因事務(wù)重試、手動補(bǔ)償、定時任務(wù)兜底而重復(fù)觸發(fā)。我在實際項目中因為沒做冪等出現(xiàn)過用戶被發(fā)放兩次優(yōu)惠券的事故。從那以后所有涉及資金、權(quán)益、庫存的監(jiān)聽器一律先查消費記錄再執(zhí)行。7.3 監(jiān)控和日志別等出問題再補(bǔ)事件鏈路比普通方法調(diào)用難追蹤得多。我踩過多次“用戶說沒收到通知但不知道是事件沒發(fā)、還是監(jiān)聽器沒執(zhí)行、還是執(zhí)行失敗”的坑。后來我在事件基類里加了 eventId在發(fā)布和每個監(jiān)聽器執(zhí)行時打印結(jié)構(gòu)化日志再配合一個簡單的指標(biāo)統(tǒng)計事件發(fā)布數(shù)和監(jiān)聽器執(zhí)行結(jié)果問題定位時間從小時級降到了分鐘級。日志格式我用的是一行 JSON包含 eventId、eventType、listenerClass、method、costMs、result 這幾個字段。排查問題時直接按 eventId 過濾日志能看到一個事件從發(fā)布到所有監(jiān)聽器處理完的完整鏈路。這個習(xí)慣在線上排查時幫了大忙強(qiáng)烈建議從項目初期就建立。最后分享一點我個人的體會。事件監(jiān)聽這套機(jī)制真正難的不是 API 怎么調(diào)而是設(shè)計者有沒有克制力。你能很容易地把所有邏輯都塞進(jìn)事件和監(jiān)聽器讓代碼看起來解耦實際卻把復(fù)雜度轉(zhuǎn)移到了事件鏈路上。我在實際使用中最受益的一條原則是如果你說不清楚某個動作為什么是事件驅(qū)動而不是直接調(diào)用那它大概率就不應(yīng)該寫成事件。只有那些真正“發(fā)生在某個事實之后、且和主流程不強(qiáng)耦合”的動作才值得放進(jìn)監(jiān)聽器。這個判斷標(biāo)準(zhǔn)聽起來很虛但它幫我擋住了很多過度設(shè)計。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久9久久久久| 久久五十路熟女人妻| 久久免费中文字幕在线观看| 一个人免费HD91视频| 日韩久久艹| 久草精品一区| 综合久欧洲| 伦理片秋霞免费影院| 不卡视频一区蜜桃视频| 东京热不卡视频| 日本一二区免费| 午夜电影在线观看无码专区| 国产91影院| 国产精品97超碰| 伦理片秋霞免费影院| 在线看免费无码AV天堂的| 色婷婷在线视频精品导航| 色噜噜精品一区二区三| 亚洲国产成人精品久久久国产成人一区二区 | 少好三P| 青青草操逼逼视频| 人妻AV 中文字幕的| 午夜色婷婷| 久久99草| 欧美色性情| 日本二区不卡| 亚洲综合69| 啊啊啊啊啊操我视频| 99熟女| 最新国产亚洲精品精品国产亚洲综合 | 久久αⅴ| 四方色播| 日本αv| 超碰成人人人爽人人爽| 免费视频一二三区| 日韩啪啪视频| 中文色综合| 人人操人人色网| 天天日夜干| av影院十区| 在线洲亚线| 色香综合天天影视综合 | 无码人妻精品一区二区中文| av天堂天堂av日韩| 色婷婷亚洲婷婷| 国产不卡的视频| 欧美18禁91| 婷婷情色五月天| 日韩无码极品| 欧美日本成人一区二区| 国产隔壁老王影院在线| 99re国产精品视频| 亚洲 欧美 手机在线观看| 欧美激情另类一区二区| 成人三级片无码| 可以在线观看的黄色网址| 久久熟女嫩草成人片免费| 久久m| 囯产精品强| 91男人综合| 国产精品久久泡妞网站| 精品欧美老熟女一二区| 黄色视频特级毛片| 久久婷婷五月天| 亚洲 图片 综合91| 亚洲综合贴图91| 亚洲高潮影院| 美国aaaaa一级黄片| 91精品伊人久久久大香线蕉91| 亚洲国产无码精品首页久久久| 亚洲经典啪啪| 97视频7| 狠狠97| AV麻豆免费一区| 国产 亚洲 丝袜 制服| 亚洲二区精品在线观看| 日韩av影片在线观看| 无码国产精品午夜不卡(| 中文字幕一区日韩精| 超碰久久性爱| 久久精品高清无码一区| 久久色网| 国产成人+综合亚洲+天堂| 天天看综合网| 久久禁| 婷婷五月天激情四射| 亚洲乱码精品一区二区| 天天影视综合网欧美精品| 亚洲大色堂| 国产免费小视频| 日韩亚洲精品一区二区| 天美麻豆精品视频99| 91精品国产日韩欧美综合| 天天色播亚洲综合网站| 天天内射| 一级毛片电影免费看| 亚洲日韩成人性爱视频| 亚洲中文电影| 人妻 中文 日韩| 中文字幕天天天天天| 好一吊区二区| 久久久精品无码亚免费| 色天使大香蕉| 秋霞Av理论一级在线| 色婷亚洲五月在线观看| 久9综合在线| 亚洲综合另类小说色区亚洲成av人片在www | 成人在线午夜视频一区| 中文字幕在线免费观看2| 美女黄频a美女大全免费皮| 国产极品999| 欲香欲色综合天天伊人| 久操B网| www.人人摸在线视频| 大色综合网| 欧亚成人在线视频| 思思热久久成人| 亚洲激情 欧美色图| 久久老女人| 丁香六月综合激情| 在线观看亚洲成人精品| 久艹伊人精品综合在线| 黑人嘿嘿嘿超爽免费视频| 欧美 亚洲 大香| 97超碰站| 青青草五月天| 久久久亚洲Av| 午夜后入| 久久精视频美日韩在线视频| 99re6国产精品99re| ,成人免费啪啪视频| 啊啊啊啊啊啊啊国| 欧美精品一区二区少妇免费A片 | 午夜一区| 九九久久久九九| 亚洲加勒比| 国产在线76页| 情趣丝袜无码操逼视频| 亚洲熟女乱色一区二区三区久久久| 日本成人A片网站| 久久久久久久六六| 日韩另类| 大JI巴好深好爽又大又粗视频| 亚洲天堂男人在线| 富女玩鸭子一级毛片| 久久亚州高清| 男人的天堂啪啪啪啪啪蜜桃不卡| 欧美综合自拍| 日韩精品人妻中文字有码在线| 国产高清在线观看欧美| 一本色道久久综合精品婷婷| 老女人日韩美91| yw尤物av无码点击进入麻豆| 精品亚洲俞拍视频一区| 天天躁日日躁AAAXX| 久久久久熟女| SS久久| 色婷婷视频| 亚洲欧美高清| 久久中文字幕人妻熟av女蜜柚| 99热这里只有精品99| 日婷婷| 亚洲熟女少妇免费视频| 亚洲精品97在线| 久操网无码在线| 久久超碰天天| 超碰是碰在线观看| 亚洲精品骚逼| 久久99操天天日| 家庭乱伦国产精品| 国语少妇精| 人妻天天爽夜夜爽2| 97蜜桃综合| 久久久久久久亚洲Av无码| 91色狼| 日韩精品一区,二区 九九...老司机| 天天天天操| 亚洲人妻中文在线视频| 国产99999| 夜夜高潮夜夜爽国产伦精品| 国产久久久久影院老熟女| 丁香六月啪啪| 综合久久中文字幕综合日韩精品| 小视频玖玖| 久久超碰网| 成人性交午夜免费片| 精品国产国产AV| 天天插天天舔舔天天干| 日韩人妻少妇 一区二区三区| 丰满岳乱妇一区二区三区| 一区二区不卡视| 日日日日做夜夜夜夜做无码97| 中文无码一二三区| 大香蕉520| 操逼1区| 涩涩涩综合| 99999re| 啊啊嗯嗯好爽| 天天上日日上日韩精品| 国产一级高清免费观看| 色色毛片| 亚洲欧美色图| 天天综合-91入口| 2017天天插| 麻豆天美一区二区| 国产免费一区2区3区| 激情欧美97| 国产精品一区二区麻豆| 亚洲男人在线观看天堂| 国产成人五月天丁香花| 久久久精品网站| 91 丝袜在线播放| 欧美中文字幕日韩在线| 欧美少妇人妻| 97狠狠| 男人的天堂VA| 97资源站日韩| 综合久久久久久久久91| 丁香五月激情网| 91美女视频电影| 91美女视频电影| 97久久天天综合色天天综合色电影| 亚洲天堂自拍| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 日本熟妇浓毛hdsex| 久久神马| 高清无码在线播放网站| 日韩久久.一级黄色片| 久草国产在线视频| 99久久婷婷国产综合| 婷婷五月天久久久| 艾草av| 欧美 牲| 大逼色网站| 97视频免费播放| 91操熟女| 97人妻免费中文字幕| 国产浮力影院第1页| 婬女免费一二三区A片| 天天日天天色| 另类av天堂| 国产三级中文字幕粉嫩| av影片在线观看不卡| 久久久久久99AV无码免费网站| 亚洲精品成人动漫在线| 国产伦乱91| 人妻天天操天天爽视频免费| 亚洲精品国产av天美传媒| 婷婷激情五月综合| 国产精品久久久久久久AV大片| 日本精品无码三级网站| 九九热男人天堂| 欧美青青草视频| 97久久网| 亚洲成av人片色午夜乱码| 久久久久久久九九九九九九| 天天日美女的B| 亚洲精品97| 97人人操人人摸人人爱| 大香蕉手机在线视频| 色网综合网| 久久97精品久久久久久久不卡| 亚洲成人黄色在线观看| 曰韩欧美国产传媒麻豆第一区| 美腿丝袜高跟网免费视频免费视频| 狠狠爱夜夜干| 高清在线不卡一区二区 视频| 中国黄色特级精品一区二区三区片| 日韩电影天堂视频二区三区| 麻豆AV一区二区天美传媒| 亚州熟女乱伦| 婷婷丁香五月综合| 日日玩天天干| 欧美成人黄网色网站| 亚洲五区熟女| 九九九久久久| 中文字幕黑人大片| 一二三四区电影| 日韩精品一区二区日韩| 亚洲一二三精品久久网| 欧美超碰97| 五月丁香啪啪啪| 久9爱经典视频| 91精品女厕偷拍视频| 7月婷婷综合| 东京热男人天堂| 国产精品久久久鸭无码的功能| 大香网伊人久久综合网eew| 久久九色| 丁香五月天婷婷姐| 大学生美女口爆| 超碰人人妻| 日本欧美不卡| 日韩天美| 超碰欧美| 一区二区 日韩 欧美 国产 传媒| 五月天婷婷在线看| 欧美日韩免费专区在线| 亚洲另类小说卡通动漫| 久偷拍欧美日韩三区| 亚洲第一免费视频| 校园春色亚洲无码| 色婷婷色99国产综合精品| 日韩特一级久久| 无码精品蜜桃一区二区三区ww| 双插在线| 操高情无码| 91 国产丝袜在线播放-百度| 亚洲精品国产精品乱码不99| 无码二级三级| 夜夜爽33333| 91天堂网| 偷拍亚洲高清图片| 日韩欧美俄罗斯A片| 国模91| 国产精品熟女乱伦| 欧美96精品在线| 亚洲精品视频二区| 91色鬼| 亚洲AV无码乱码| 玖玖资源中文字幕制服丝袜| 美女写真| 伊人骚琪琪亚洲天堂网站| 99久久这里只有精品| 国产强奸乱伦欧美| 天天操天天谢| 99久久com免费视频′| 午夜视频黄| 欧美国产操逼| 黑丝内射一区二区三区| 奇米狠999| 久久久555| 青青伊人久久| 少妇超碰在线| 日韩欧美tv一区二区在线观看| 日本精品一区二区三| 日韩国语字幕| 午夜丁香| Av手机版天堂网| 天天操福利视频综合网站| 中文 人妻 制服| 国产亚洲一黄| 综合免费无码中文| 三上悠亚在线毛片91| 日本中文字幕一区| 免費人妻夜夜爽天天爽爽一区| 亚洲欧美自拍偷拍| 日韩性爱长视频免费| 亚洲综合校园春色| 九九热精品在线| 99性爱在线观看| 91殴美| 午夜精品人妻二区三区| 色老汉色| 少妇高潮99p| 熟妇操花| 一起草日韩| 亚洲图片激情小说| 97在线/亚洲| 欧美精品久久| 久久一区二区加油站| 精品91摸| 嗯嗯嗯好爽| 麻豆黄四叶草网站| 91免费看一区二区三区| 人妻熟女一区二区在线视频| 狠狠久久手机视频精品| 色九九综合| 中文精品一区二去| 天天做天天爽| 国产嫩草精品A88AV| 婷婷五月天补不补| 麻豆天美在线喷水AV| 色九色久| AV色五月| 香蕉av一区二区三区| 熟妇最新先锋一二三区| 天天操夜夜操| 色婷五月天| 久久亚洲av成人无码国产| 天天操夜夜嗨| 手机在线A片| 亚洲一区在线观看欧洲 | 亚洲无无码αⅴ每日更新| 亚洲男人天堂AV| 超碰97国产欧美| 欧美自拍网| 婷婷激情丁香| 综合少妇网| 色九久| 中文字幕视频在线观看| 翔田千里AV无码秘 三区| 97超碰碰| 久草免费福利在线播放| 日韩在线观看字幕精品| 久久鲁干| 九色 人妻 大香蕉| 久久綜合很很很| 97一区二区三区视频| 超碰在97| 屁股久久久久久| 999久久久免费精品国产牛牛| 免费αV在线视频| 国产一级137片内射麻豆| 久久丁香久草综合网| 嗯嗯啊好爽| 亚洲综合欧美| 激情视屏国产乱伦强奸| 思思热在线观看| 国产av白丝| 亚洲综合小视频小说在线观看| 久久久久密臀一区二区| com 首页 18岁 禁区 女优 免费 精选 同城 | 欧美97日韩| 九九九九九九九九九五码| 天天操天天7| www.91视频网| 激情网色| 中文字幕视频2区| 60秒免费小视频| 青青草在线视频美女| 国产一二三在线视频五十路| 欧美一级国产一级| 超碰亚洲欧美日韩无| 色偷偷色偷偷欧美日韩| 亚洲资源吧| 操逼逼一区视频| 2019AV天堂| 日韩不卡一二三四| 蜜臀视频网站| 中国亚洲呦女专区| 欧美性爱一区| 国产精品片| 久久6热视频免费观看| 中文字幕日韩综合| 中文字幕欧美日本乱码一线二线| 亚洲巨爆乳一区二区三区四季网| 92人人操人人| 青青草在线视频欧美| 91无码人妻精品一区二区三区蜜桃| 日韩特级毛片免费观看全集| 亚洲午夜av| 性老妇一区二区三区| 久久精品国产亚洲粉嫩| 看一级特黄a大一片| 婷婷伊人一区| 91色宗合| 天堂中文日本在线观看| 夜夜肏2021| 亚洲 无码 有码 中文字幕| 色牛aV| 青青草天天亲夜夜操网| 试看60秒| 午夜精品五区| 青青草字幕AV| 欧美中文字幕日韩在线| 91九色丨国产丨爆乳| 欧美日韩精品久久久久东北老熟妇| 国产无码久久高清| 2020中文字幕| 91少妇人妻| 国产伦精品一区二区三区在线观| 亚州欧美一区| 中文人妻av高清一区| 男人下部插入女人下部| 热99这里有精品综合久久 | 伊人久久大香蕉线AV五月天| 东京热大香蕉| www.91色综合| 激情小说亚洲| 91女在线观看| 第四色奇米影视777| 91人妻丝袜无码| 亚洲色交| 熟女人妻精品一区二区视频 | 久久欧美按摩999| 日韩欧美中文字幕搭讪巨乳美人妻视频| 国产www色在线观看| 日日日大屁股骚女人精品| 最新av中文字幕高清| 一区中文字幕二区日韩| 国产乱伦性爱区| 久久天天躁日日躁狠狠躁| 日韩成人无码| 亚洲日韩熟女人妻高清在线| 成人网站 免费观看| 蜜桃臀一区二区三区久久| 欧美日本国产日韩激情视频| av橘色网站| 大香蕉婷婷| 成人怡红院| 天天操女人| 九九视频黄色片| 中 文字幕一区二区三四 五 区日 日 骚| 91啦人妻| 激情久久日韩精品中文字幕麻豆| 亚洲另类在线观看| 天天操福利视频综合网站| 欧美黄色大片在线观看| 老熟妇一区二区三区| 六月婷婷色综合| 欧成人精品一区二区三区| 99久久com免费视频′| 边做饭边操逼逼| 91 国产丝袜在线播放-百度| 久操大香蕉手机视频在线看| 国产 亚洲 一二三四| 情色五月天网| 亚洲天堂综合AV| 日韩精品人妻一| 欧美激情 亚洲色图| 欧美少妇一区二区三区| 日本一区二区三区四区免费观看| 欧美97爱| 无码九九| 天操天操夜操夜月操月年年操| www.99中文字幕| 97色综合中文网| 中文字幕78| 久久五月综合| 精品一区二区综合熟妇| 啊啊啊啊啊在线| 91性| 91麻豆天美传媒HD| 六月丁丁香| 亚洲暴力强奸AV| 亚洲欧美天堂| 女人香蕉久久毛毛片精品| 97免费视频网| 日本天天吊| 亚洲精品日韩国产欧美| 97人人夜夜精品视频| 久操国产在线| 97在线日韩中文字幕| 色天使大香蕉| 97在线国产精品| 欧美国产日韩高清在线| 青草青草久热| www..com操老师| 日本性爱视频一级| 97天天综合| 成人区人妻精品一| 丰满欧美放荡少妇在线| 狠狠2050在线观看| 亚洲视频二区| 婷婷另类小说| 国产传媒1234区| 麻豆精品久久久久久久| 国产按摩一区二区三区| 我爱大香蕉| 国产成人bd在线观看| 手机av天堂久久久久| 激情AV| 亚洲精品无码少妇久久| 天堂中文资源在线bt| 色欲无码人妻日韩欧美精品| se01国产在线视频| 九九精品99| 51久久夜色精品国产麻豆| 色综合国产在线观看| 天天综合97| 人妻丝袜一区二区三区在线| 伦理第一页| 亚洲风情在线观看| 色噜噜狠狠色综无码久久合欧美| 精品97久久| 特色a在线上| 久久六六| a片偷拍视频| 中文字幕日韩专区精品系列 | 韩国黄色片精品久久久| 九九成人视频| 日韩人妻少妇中文字幕| 视频在线观看一二三区| 亚洲永久AV无码精品秋霞| 91嫩草欧美| 精品二999| 2020中文字幕在线| 蜜臀99久久国产| 亚洲久久久| a级免费在线观看| 性暴力欧美猛交在线直播| 国内偷自视频区视频综合| 91人妻做a观看视频| 欧美一级黄色18片免费看| 人妻-91porn| 亚洲 图片 综合91| 欧美亚洲AN| q2午夜理论片夜色av| 亚洲高清欧美总合| 亚洲男人综合| 欧美色综合影院| 国产亚洲 中文欧美久久| 五月天久久婷婷亚洲 | 东京热一区二区中文字幕| 99婷婷一区二区| 无码聚合| 九九九综合精品| 欧美最大综合网| 欧美色青| 女同性恋久久| 精品久久久久黄少妇| 国产自产22区| 国产精品福利资源在线尤物| 欧美日韩香蕉| julia在线观看久久| 久久偷偷色综合蜜桃| 欧美超碰在线| 亚洲九月丁香| 天天享受天天看| 少妇三p| 性爱乱伦视频免费| 色综合美国| 乱操9999| 欧美 日韩 亚洲 春色| 五月婷婷六月丁香| 2019亚洲男人天堂| 伊人久久综合影院精品久久久 | 夜夜嗨一区二区三区三州加勒比| 亚洲欧美一区二区网址| 9999久久久久| 精国久久一区二区三区98| 1区2区3区视频| www…国产操逼| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 嗯嗯嗯啊啊啊在线免费观看| 久久9免费视频| 高清国产成人无码| 青青草九九九九九| 欧美成人精品欧美一级乱黄一区二…| 日韩乱中文 | 日韩成年人性爱视频| 巨爆乳肉感一区二区三区竹菊影视| 啊啊好多水| 91处女在线观看| 婷婷性爱| 亚洲人妻精品一区二区| 国产高清成人传媒影视| 丰满人妻一区二区中文| 911av网站免费观看| 免費人妻夜夜爽天天爽爽一区| 精品玖九九久| 亚洲av强奸乱伦| 欧美另类天堂| 综合色99| 91无码精品| 狠狠操狠狠| 91欧美经典| 色五月激情网| 超碰美女97| 成年女人一区| 久久久久亚洲Av无码专区老牛影视| 婷婷亚洲综合| 中文久久久| 天美国产三级传媒| 96精品久久久久久久久久| 美女人妻色网站| 丁香婷婷五月| 伊人久久大香蕉线AV五月天| 欧美性爱第一区| 久久久久国产| 国产三级日产三级韩国三级| 91精品国| 亚洲午夜免费狠狠干| 欧美狠狠| 欧美性爱一区二区三区四区| 一级黄色视频网| 国产人妻精品一区二区三区秋霞 | 久久国产免费激情视频| 日韩精品系列| 久久人人爽人人爽人人片Ⅴ| 天天干18禁| 特级大荫道BBwBBwBBW| 国产av激情无码久久天堂| 97一区二压| 久久久久国产无av| 天天综合欧美| 嗯嗯,好大,好爽,好骚| 韩国午夜理伦三级好看| 欧美情色亚洲| 欧美精品 - 91爱爱| av网页一区二区三区| 91白虎| 嗯嗯啊啊用力视频免费| 亚洲导航深夜福利| 久久99九九九九6666免费观看软件| 热久久91婷婷| 国产精品自在线发布| 高清视频一区| 欧美猛交黑寡妇中文字幕| 色爱三区| 国产午夜福利专区综合| 蜜臀网址在线| 青青色综合| 久久婷婷热| 日韩免费三级黄片电影| chaopen97久久| 看黑丝美女操逼青青网站| 亚洲综合中文字幕有码| 精品视频在线观看精品| 久久熟女嫩草成人片免费| 欧亚乱色熟一区二区三四区| 操逼逼福利视频| 啪啪视频免费在线观看| 日本一卡二区在线| 在线观看A啊啊啊| 欧洲色色| 日本视频在线观看污污污| 丁香九月婷婷| 久九九九九九九九热| 久久亚洲人妻| 啪啪91| 六月婷婷综合| 啪一啪免费视频| 免费少妇一区二区| 免费在线看黄片av| 久久大香蕉97| 欧美激情精品久久久| 裸模AV女优| 午夜精品99久久久久传媒| WWW黄片COM| 色色香蕉| 国产特级毛片AAAAAA高潮流水 | 高跟丝袜AV专区国产| 无遮挡又黄又刺激的视频| 五月天精品| 无卡一区=区| 青木玲在线不卡| 丰满搜索结果 -第18页- 久久高清无码 | 日韩激情无码影院| 青娱乐国产剧情av一区| 九九九九九九九九九国产精品 | 在线观看无码三级少妇| 欧美精品久久96人妻无码| 这里只有97精品| 美女天天干| 超碰偷拍| avav青青草久久夜| 久久宗合97| 加勒比无码毛片| 毛片99-全集电影手机免费观看完整-B029AV| 国产精品高潮久久AV| 中美日韩毛片| 色哟哟-国产专区| 打av高清| 97精品视频免费| 久久只有精品一区二区三区| 蜜臀精品1区2区| 9热9热综合网| 97视频在线免费观看| 一区二区影视| 国产黄色剧情影片麻豆免费播放| 性天堂| 国产丝袜欧美在线视频| 五月丁香六月综合缴清无码 | 黄色视频60分钟| 国产日逼视频| 91成人精品在线播放| 91在线无码精品秘 软件| 激情综合久久| 欧美乱色| 一区二区三区 丝袜高跟| 加勒比海成人视频网| 天天情欲宗合网| 91n处女在线观看| 天天色图| 色综合av男人天堂| 超碰av在线| AV一二区| 97精品97久久| 综合亚洲欧美| 日日操免费视频| 岛国片在线视频网站| 五月天婷婷在线看| 久久直播国产| 99精品热| 狠狠图片青青草| 无码九九九九| 性色综合网| 国内精品久久人妻性色av| 亚洲欧美综合区自拍另类| 国产 v乱码一区二| 国产高清1234区| 蜜桃视频精品一区二区| 性色一线| 午夜福利久久久噜久噜久久综合 | 97超碰香蕉| 国产精品嫩草久久久久| 99re在线观看| av一区二区三区四区五区久草臀| 91精品国| 国产精品点击进入在线影院| 99精品在线观看| 欧美中文狠| 老鸭窝成人免费毛片视频| 亚洲,日韩,欧美,成人播放 | 超碰4A| 岛国在线免费视频| 91 刺激在线| 国产精品久久久久久久免牛肉蒲团 | 69视频入口| 国产成人精品日本亚洲语言| 精品国产91久久久久久一区黄无| 天天久久久久久| 青娱乐欧美激情一区二区| 97色在线| 人妻天天爽夜夜爽2| 国产丝袜欧美在线视频| 清柠毛片| 青青草原成人| 久久超碰亚洲人| 亚洲精品电影| A片 AV一级在线播放观看免费| 亚洲天堂第一页| 欧美天天综合网| 婷婷五月天色色| 亚欧操逼片在线观看| 成人无码电影在线观看网| 骚货人妻偷情自拍在线视频| 中日韩久久久免费看| 午夜一级免费毛片| 美腿丝袜偷拍亚洲欧美| 欧美亚洲| 中文字幕大片三级狠狠干| 欧美色97| 激情综合久久| 麻豆天美在线| 亚洲天堂热| 亚洲交换| 日韩久久激情精品| 亚洲一区制服诱惑| 综合操逼| 9999久久久久| 日本色色的视频| 日本天堂在线播放| 国产一级作爱毛片| 色偷偷超碰亚洲| 中文一区在线视频| 欧美第二页午夜| 欧美性爱视频免费一区一A| 九九九九精品一区| 91爆操视频| 国产吹潮女在线观看| 久草免费福利在线播放| 夜夜免费视频| 国产一区二区视频在线播放| 天天综合网视频91| 91九色精品熟女内射| 亚洲高清欧美总合| 97国产超湿| 午夜男女爽爽大片免费观看| 亚洲影院小综合| 秋霞网—男女啪啪亚洲免费体验区 | 国产精品久久久久中文字幕| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 国产农村一一级特黄毛片| 一二三四区电影| 五月丁香久久| 国产午夜精品理论片一二三区区| 亚洲欧美性生活| 性爱免费视频成人| 天天操天天干美女网址导航| 五月丁香六月激情| 一级性爱视频免费观看| 性性欧美| 欧美日韩性爱视屏免费看了| 熟女人妻一区二区三区| 快点操死我| 91成人久久| 超碰97综合在线| 青青草视频久久久久| 国产精品久久久久亚洲av| 深夜激情| 曰本精品久久久| 岛国艾薇凹凸视频天堂| 丰满人妻一区二区三区免费 | 乱伦系列一区二区| 日韩精品-原创伙伴| 久草精品国产蜜臀| 亚洲欧洲国产综合av| 高潮精品| 亚洲欧洲激情| 91在线免费观看处女| 一级黄色性爱A级片| 综合色欧美| 97天天操天天干| av中文在线| 高清国产成人无码| 欲色综合| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 2018天天干在线视频| 欧美青青视频| 五月天色综合| 日本免费专区| 久操视频在线观看| 成年人免费观看网站| www老逼91| 视频分类 国内精品| 成人毛片免费| 国产精品禁久久久精品| 激情综合av| 熟妇人妻精品一区二区视频色欲| 一级性爱啪啪视频| 欧美91在线| 欧美特黄视频网站| 最新av在线| 国产青一二三| 三级三级三级日本99| 日韩人妻播放| 黄人人操人人操| 亚洲图片激情小说| 亚洲色图欧美色18直播在线| 中文字幕AV片| 天天综合网在线| 欧美成人9797| 久久99精品视频| 精品中文字幕一区二区l - 百度| 国产高清视频无码在线| 欧美在线啊啊| 噜噜噜噜久久久精品免费| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 乱码熟妇人妻久久久| 69精品少妇一区二区三区蜜桃| 日本精品不卡一二三区| 欧美日韩激情无码专区| 欧美日韩性爱电影在线| 亚洲天堂久久久久久粉红视频| 国产伊人精品在线| 一本大道青青| 亚州高清AV| 深夜激情| 日韩欧美~中文字| 自拍第一页| 久久精品成人一区二区三区蜜臀| 久久九精品| 亚洲老司机123专区| 精品久久大胆人体| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 日韩成人无码| 国产精品懂色tv影视免费观看| 白嫩少妇| 天堂v无码免费视频| 日韩在线观看三级电影| 高清有码一区二区| 欧美高清无码免费视频高清版| 青娱乐休闲视频在线观看| 搡老女人老熟女91| 亚洲 小说 欧美 激情 另类| 国产精品无码成人精品| 日韩中文字幕精品一区在线| 国产日产精品久久快鸭的功能介绍| 国内偷自视频区视频综合| 性爱免费视频成人| 国产亚州高清国产拍精| 色综合久久888| 中文字幕啊啊啊在线观看视频| 天天影视网综合少妇| 夜夜操老骚逼视频网站| 欧洲精品在线播放| 老司机午夜福利视频一区二区| 国产成人啪一区二区| www.成人无码| 青草精品视频-日本久久久久网站| 久艹日日日| 亚洲av综合伊人久久| 亚洲系列第一页| 日本三级日本三级99| 中文字暮97| 久久一二三四不卡 | 91熟女少妇| 亚洲欧美伦综合| 日韩一级久久毛片| 丰满少妇乱子伦精品无| 久久综合五月天| 亚洲三级网址久久最新| 欧美黑人91| 97在线视频观看| 精品人妻av在线播放| 五月天社区| 亚洲人妻熟妇三十三区| 玖玖综合视频| 日韩无码一级黄色av片| 欧美视频一区二区在线| 大香蕉亚洲中文| 久久啊啊啊视频| 日本男人天堂| 黄色一区二区秘书性感| 天天摸,夜夜摸| 9久精品视频在线观看| 天天爱天天操| 精品中文字幕一区二区| 在线播放成人网站| 福利天堂| 91精片| 天天天天天天天天天天干美女 | 岛国黄片网站| 99操视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 麻豆福利视频导航| 九九操久久国产免费视频| 日韩黄片视频试看| 国内精品999| 久久网亚洲| 国产黄色在线播放观看| 开心激情婷婷| 久久久成人免费av电影| 翔田千里无码一区| 热久久这里只有精品| 91色色综合| 亚洲性爱成人| 91久久国产综合久久| 久久成人精品| 亚洲无码太久| 国产白领连续中出在线观看| 亚洲欧美激情小说| 视频国产精品未满十八禁止在线观看| 中文字暮97| 午夜一区| 俺去俺来也在线www| 另类av综合久久| 欧美18老人禁| 精品久久久无码| 日日骚一区二区三区| 欧美劲爆视频一区二区| 日韩人妻无码精品系列| 久久永久无码人妻视频| 五月丁香色婷婷| 久久久月天| 精品区国产区一区二区三区| 久久夜精品一区二区三区| 亚洲国产精品成人综合| 久久久久久亚洲精品中文字幕人妻| 欧美日本不卡在线| 日韩无码专区| 男人天堂最新手机版在线青青草| 黄页网站免费高清在线观看| 中文字幕78| 人人艹亚洲| 久操在97| 色伊人91| 激情婷婷丁香| A片 AV一级在线播放观看免费| 国产青青美女玩逼视频| 国产精品自拍xxxx| 男人的天堂久久狠| 亚洲日韩美女中文字幕乱| 97欧美色综合| 欧美黄片欧美黄片xxx| 久艹99| 蜜乳AV色欲AVAV无码| 麻豆一区二区AV天美| 婷婷丁香六月| 欧美色青| 一牛影视久久久一区二区三区| 中文乱码字字幕在线第5页| 欧美在线伊人色| 国产精品一区二区久久精品| 日本A级视频| 欧美精品一区二区少妇免费A片| 2000亚洲男人天堂| 囯产操逼片| 东北女人性交| 91国产精品熟女| 国产精品第一区第一页| av72网| 少妇滛荡视频| 熟女人妻精品一区二区视频| 综合干干干av久久久综合网| 国内偷自视频区视频综合| 色爽——AV| 色婷婷视频| 强被迫伦姧在线观看无码网站| 午夜欧美J进J出白浆流出久久久| 伊人精品久久网站| 91在线丝袜| 水澄无码AV| 岛国片在线视频网站| 国产中文字幕在线观看| 六六久久日韩不卡| 91伊人久| 欧美伦乱| 偷拍网站久久男女男| 国产精品无码久久久久2028| 久久亚州大香蕉| 宅男91视频在线播放| 一起草日韩| 999999精品| 91久久久老司机| 青青草中文-久久青草精品一区二区三| 国产精品人妻无码久久久互動交流| 老师充足的奶水小说| 婷婷亚洲五月***久久| 亚洲丝袜综合| 色婷婷一区二区三区久久午夜| 熟女精品一区二区三区| 欧美日韩国产三级黄色| 超碰99re| 日韩97精| 久久111| 91中文在线| 国产福利小视频高清在线观看| 78久久| 欧亚韩国999| 天天碰操中国年青熟妇| AV中文在线| 中文字幕亚洲热播人妻| 91精片| 日曰骚久久精品| 91精品国久久久久久无码| 亚洲一二三精品久久网| AV中文字幕剧情1区2区3| www.99视频| 中国一区二区亚洲人妻| 精品无码欧美三级| 600国产精品视频| 风月影院男女十八禁| 天天摸天天碰天天添青青| 可以免费观看的AV| 色青青久久影视| 69少妇一区二区| 超碰成人人人爽人人爽| 中文区中文字幕免费看| 青青伊人加勒比海| 日韩精品99久久久久久中文字幕 | 小泽玛利亚一二三| 欧美黄片视频在线观看免费| 九月激情婷婷| 精品无码一区二区三区| 亚洲久久久久| 大逼色网站| 午夜福利 成人 91| 碰人碰碰人人开房人肉| 白 大 人妻 区 在线| 91偷拍欧美亚洲| 一牛影视久久久一区二区三区| 欧美男人一区| 香蕉综合网| 九月丁香| 国产67194| 中文字幕成人| 九九久久99| 亚洲中文字幕网| 99人人干| 超碰人人色| 欧美在线视频99| 婷婷五月综合在线| 色999五月色| 六月激情网| 五月综合久久| 精品 码产区一区二-1080P高清在线www-B029AV| 伊人黄色视频免费观看| 日本国产欧美高清在线| 91干熟女| 91色久| 91oumei| 麻豆精品久久久久久久| 精品免费一区二区三区在线亚洲人成| 精品久久久久9999| 欧美图片色综合| 老司机久久|