色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

Flowing消息循環(huán):調(diào)度策略、排障實(shí)戰(zhàn)與進(jìn)階改造全解析

Flowing消息循環(huán):調(diào)度策略、排障實(shí)戰(zhàn)與進(jìn)階改造全解析 你有沒(méi)有遇到過(guò)這種狀況服務(wù)進(jìn)程明明活著CPU占用正常日志卻半天沒(méi)有新東西進(jìn)來(lái)那邊業(yè)務(wù)方已經(jīng)急得拍桌子而你連問(wèn)題出在哪都摸不著頭緒。我前一陣排查一個(gè)訂單延遲推送異常時(shí)就被這么折磨過(guò)最后定位到根因之后才徹底想明白——問(wèn)題出在消息循環(huán)上一批高優(yōu)先級(jí)任務(wù)插隊(duì)搶占了處理權(quán)普通消息在隊(duì)列里被活活餓死整個(gè)業(yè)務(wù)表現(xiàn)就像主動(dòng)脈堵住了一樣。從那以后我對(duì)消息如何流淌這件事特別敏感也借著這個(gè)契機(jī)把 Flowing 框架里的消息循環(huán)從底層拆了個(gè)遍。這篇文章我不是來(lái)給你念文檔的。我會(huì)從一次真實(shí)排障經(jīng)歷出發(fā)把 Flowing 框架中消息循環(huán)的完整結(jié)構(gòu)、調(diào)度策略、代碼實(shí)現(xiàn)、常見(jiàn)坑和進(jìn)階改造方案挨個(gè)講清楚。不管你是剛接觸事件驅(qū)動(dòng)開(kāi)發(fā)還是已經(jīng)在服務(wù)端寫(xiě)了幾年消息處理邏輯我都盡量保證你能從中找到可直接落地的經(jīng)驗(yàn)。1. 為什么消息循環(huán)是 Flowing 這類框架的心臟1.1 事件驅(qū)動(dòng)程序的底層共性先跳開(kāi) Flowing 這個(gè)名字想一個(gè)更基礎(chǔ)的問(wèn)題任何事件驅(qū)動(dòng)的程序本質(zhì)上都在做同一件事——等待外部輸入然后做出響應(yīng)。GUI 程序在等鼠標(biāo)鍵盤事件網(wǎng)絡(luò)服務(wù)在等請(qǐng)求到達(dá)消息中間件的消費(fèi)者在等新消息投遞。你寫(xiě)的業(yè)務(wù)代碼再多最后都會(huì)收斂到一個(gè)固定的動(dòng)作上取一條消息處理它再取下一條。這個(gè)取一條、處理一條、再取下一條的重復(fù)動(dòng)作就是消息循環(huán)。Flowing 框架把它做成了獨(dú)立的一層而不是散落在業(yè)務(wù)代碼里。好處非常直接所有消息的排隊(duì)、分發(fā)、調(diào)度、異常兜底都被收攏到一個(gè)統(tǒng)一機(jī)制里業(yè)務(wù)方只需要注冊(cè)我關(guān)心什么消息、收到之后干什么剩下的交給循環(huán)。我以前接手過(guò)一個(gè)項(xiàng)目早期沒(méi)引入框架時(shí)每個(gè)人在代碼里各自寫(xiě) while 輪詢、各自建隊(duì)列結(jié)果五個(gè)模塊有五種消息處理方式。有的用阻塞隊(duì)列有的用自旋有一個(gè)干脆每 100 毫秒定時(shí)掃一次數(shù)據(jù)庫(kù)把數(shù)據(jù)庫(kù)當(dāng)成消息隊(duì)列用。改動(dòng)一個(gè)模塊的響應(yīng)邏輯常常會(huì)牽連另一個(gè)模塊的時(shí)序。后來(lái)統(tǒng)一遷到 Flowing 的消息循環(huán)模型上所有模塊才真正有了同一個(gè)心跳。1.2 沒(méi)有良好循環(huán)時(shí)系統(tǒng)會(huì)以什么方式崩潰這里說(shuō)的崩潰不一定是進(jìn)程宕掉更多時(shí)候是邏輯崩了。我歸納下來(lái)最常見(jiàn)的三種癥狀是消息處理亂序并發(fā)消費(fèi)者各自搶消息A 消息先到卻在 B 消息之后才被執(zhí)行業(yè)務(wù)上表現(xiàn)為主從數(shù)據(jù)不一致、狀態(tài)被覆蓋。消息無(wú)限堆積生產(chǎn)者持續(xù)投遞消費(fèi)者處理不過(guò)來(lái)內(nèi)存暴漲或者消息被丟棄。循環(huán)假死某個(gè)消費(fèi)者回調(diào)里做了阻塞操作比如同步調(diào)遠(yuǎn)程接口一直等響應(yīng)整個(gè)循環(huán)卡住后面的消息全部排隊(duì)無(wú)人問(wèn)津。這三種癥狀里假死最坑人。因?yàn)榉?wù)進(jìn)程沒(méi)掛健康檢查可能還通過(guò)但業(yè)務(wù)實(shí)際上已經(jīng)停擺。我那次排查訂單推送問(wèn)題就是典型的假死一個(gè)消息處理器里混入了同步的 HTTP 調(diào)用對(duì)方服務(wù)慢得像蝸牛每次處理要卡 20 秒隊(duì)列從幾十條一路漲到幾萬(wàn)條后面的推送消息全被堵死。所以理解消息循環(huán)不只是為了寫(xiě)出能跑的 Demo更是為了在遇到活著但不動(dòng)這類詭異故障時(shí)能有一個(gè)清晰的排查坐標(biāo)。下面我把 Flowing 的消息循環(huán)按角色拆開(kāi)講。2. Flowing 消息循環(huán)里的四個(gè)角色誰(shuí)投遞、誰(shuí)排隊(duì)、誰(shuí)分發(fā)、誰(shuí)消費(fèi)2.1 生產(chǎn)者消息的源頭遠(yuǎn)比你想的復(fù)雜在很多人的直覺(jué)里生產(chǎn)者就是業(yè)務(wù)代碼調(diào)用一個(gè) post 方法把消息丟進(jìn)來(lái)。對(duì)了一半。Flowing 里消息來(lái)源至少有四種本地調(diào)用投遞、網(wǎng)絡(luò)請(qǐng)求接入、定時(shí)器觸發(fā)、其他消息處理過(guò)程中產(chǎn)生的新消息。最后一種值得專門說(shuō)。一個(gè)消息處理完可能產(chǎn)生后續(xù)動(dòng)作比如訂單支付成功后要發(fā)送物流通知、更新庫(kù)存、觸發(fā)積分變化。如果這些動(dòng)作直接在處理器里同步執(zhí)行處理時(shí)間會(huì)被拉得很長(zhǎng)正確做法是讓處理器把后續(xù)動(dòng)作作為新消息投遞回循環(huán)由循環(huán)統(tǒng)一調(diào)度。這樣單個(gè)消息處理可以快速結(jié)束處理器不需要關(guān)心后續(xù)邏輯到底花了多長(zhǎng)時(shí)間。但這也帶來(lái)一個(gè)問(wèn)題如果處理消息時(shí)不斷地產(chǎn)生新消息生產(chǎn)者的投遞速率可能被消費(fèi)者自己的行為放大。典型例子是消息處理器內(nèi)部出錯(cuò)后重投如果每次都重投同樣一條消息相當(dāng)于一個(gè)生產(chǎn)者瘋狂生產(chǎn)垃圾消息循環(huán)會(huì)立刻被淹沒(méi)。這種自產(chǎn)自銷的消息風(fēng)暴我在業(yè)務(wù)里見(jiàn)過(guò)不止一次。2.2 隊(duì)列有界與無(wú)界的取舍是一條安全線消息循環(huán)中隊(duì)列的地位就像血管它決定了消息能流多快、能存多少。Flowing 里隊(duì)列的第一個(gè)關(guān)鍵是設(shè)置有界還是無(wú)界。無(wú)界隊(duì)列看起來(lái)誘人因?yàn)橛肋h(yuǎn)不用拒絕消息生產(chǎn)者的 post 永遠(yuǎn)不會(huì)失敗。但代價(jià)是一旦消費(fèi)速度跟不上隊(duì)列會(huì)無(wú)限制增長(zhǎng)最終內(nèi)存溢出把進(jìn)程拖死。更尷尬的是這種問(wèn)題在流量低的時(shí)候根本不會(huì)暴露一到大促流量翻十倍就會(huì)瞬間爆掉。所以我自己的原則很明確線上環(huán)境一律使用有界隊(duì)列寧可拒絕一部分消息也不能讓內(nèi)存先爆。有界隊(duì)列后隨之而來(lái)的問(wèn)題是隊(duì)列滿了之后怎么辦。Flowing 的可選策略大致有四種直接丟棄消息、丟棄最舊的消息、阻塞生產(chǎn)者等待隊(duì)列有空位、拋出異常讓上層決定處理方式。這些策略沒(méi)有絕對(duì)優(yōu)劣取決于業(yè)務(wù)容忍度。比如訂單支付結(jié)果通知你可以阻塞生產(chǎn)者因?yàn)橄⒔^對(duì)不能丟而實(shí)時(shí)日志采集丟棄一兩行日志影響不大阻塞生產(chǎn)者反而會(huì)拖垮業(yè)務(wù)線程。2.3 分發(fā)器消息類型到處理函數(shù)的映射規(guī)則隊(duì)列里存的只是一條條原始消息真正要執(zhí)行什么邏輯由分發(fā)器決定。Flowing 的分發(fā)器維護(hù)著一張消息類型注冊(cè)表每種消息類型對(duì)應(yīng)一個(gè)或者一組處理函數(shù)handler。分發(fā)器的設(shè)計(jì)有一個(gè)容易被忽略的點(diǎn)它不能只做簡(jiǎn)單的一對(duì)一映射。同一個(gè)類型的消息可能需要經(jīng)過(guò)不同的處理鏈路比如訂單消息在支付前和支付后要走的邏輯完全不同。Flowing 的做法是允許按照消息內(nèi)容中的路由鍵做二次匹配分發(fā)器先根據(jù)消息類型找到處理鏈再根據(jù)路由條件選擇具體的處理函數(shù)。在設(shè)計(jì)處理鏈時(shí)我強(qiáng)烈建議你保持一段處理只做一件事的原則。處理鏈上每個(gè)節(jié)點(diǎn)只做過(guò)濾、轉(zhuǎn)換、業(yè)務(wù)處理或者記錄中的一個(gè)職責(zé)這樣后續(xù)排查和使用鏈路追蹤都會(huì)輕松很多。我見(jiàn)過(guò)有同事把七八個(gè)判斷邏輯塞進(jìn)一個(gè)函數(shù)結(jié)果線上一條消息走到哪個(gè)分支都看不清出了問(wèn)題只能靠加日志猜。2.4 消費(fèi)者真正干活的執(zhí)行環(huán)境消費(fèi)者是最終執(zhí)行處理邏輯的代碼塊它運(yùn)行在哪個(gè)線程、能否并發(fā)、會(huì)不會(huì)阻塞直接決定消息循環(huán)的吞吐上限。Flowing 默認(rèn)的做法是在一個(gè)線程里順序消費(fèi)隊(duì)列消息這樣能天然保證消息不并發(fā)、不亂序。但單線程消費(fèi)意味著一條消息處理慢會(huì)阻塞后面所有消息。Flowing 引入了多消費(fèi)者模式允許同一份消息分發(fā)到多個(gè) worker 線程并行處理。這時(shí)候順序性就不能保證了必須通過(guò)分區(qū)策略來(lái)解決——把同一業(yè)務(wù)鍵的消息固定發(fā)送到同一個(gè) worker 上保證這個(gè)業(yè)務(wù)鍵內(nèi)的消息有序。這里我提醒一句并行消費(fèi)者數(shù)量不是越大越好。線程多了上下文切換和鎖競(jìng)爭(zhēng)會(huì)吃掉收益而且消息處理中訪問(wèn)共享資源時(shí)并發(fā)沖突會(huì)增加。我通常先按 CPU 核數(shù)的一半起步壓測(cè)后再調(diào)整。從我觀察到的項(xiàng)目情況看消息體小、處理邏輯輕的場(chǎng)景下 4 到 8 個(gè) worker 已經(jīng)能覆蓋絕大多數(shù)需求。3. 調(diào)度策略FIFO 只是起點(diǎn)優(yōu)先級(jí)、時(shí)間輪和背壓才是重頭3.1 先來(lái)先服務(wù)的適用邊界最簡(jiǎn)單的調(diào)度策略就是先來(lái)先服務(wù)誰(shuí)先入隊(duì)誰(shuí)先被消費(fèi)。Flowing 單線程循環(huán)默認(rèn)采用這個(gè)策略它最大的優(yōu)點(diǎn)是公平性。在系統(tǒng)負(fù)載遠(yuǎn)低于處理能力時(shí)FIFO 完全夠用而且天然保證順序?qū)崿F(xiàn)起來(lái)幾乎沒(méi)有額外成本。問(wèn)題出在負(fù)載升高之后。如果隊(duì)列里混著給用戶發(fā)一條通知這種低優(yōu)任務(wù)和處理退款這種不能拖的高優(yōu)任務(wù)FIFO 一視同仁的結(jié)果就是高優(yōu)任務(wù)被大量普通任務(wù)頂在后面。用戶感知就是退款遲遲不到賬體驗(yàn)非常差。所以一旦你能預(yù)判消息的重要程度有差異就該放棄純粹 FIFO。3.2 優(yōu)先級(jí)隊(duì)列與饑餓問(wèn)題Flowing 支持給消息設(shè)置優(yōu)先級(jí)隊(duì)列內(nèi)部按優(yōu)先級(jí)排序高優(yōu)消息會(huì)被優(yōu)先取出。這看起來(lái)很簡(jiǎn)單但引入優(yōu)先級(jí)之后麻煩立刻跟著來(lái)了如果高優(yōu)消息源源不斷低優(yōu)消息可能永遠(yuǎn)輪不到處理這就是饑餓。處理饑餓問(wèn)題我常用的手段有兩種。第一種是給低優(yōu)隊(duì)列設(shè)置最低處理配額比如循環(huán)每消費(fèi) 100 條消息必須保證有至少 20% 來(lái)自低優(yōu)隊(duì)列防止低優(yōu)完全餓死。第二種是老化機(jī)制低優(yōu)消息在隊(duì)列里等待超過(guò)某個(gè)閾值后自動(dòng)升級(jí)優(yōu)先級(jí)確保它最終能被處理掉。這里要特別提醒的是優(yōu)先級(jí)隊(duì)列的入隊(duì)操作不再是 O(1) 的尾部追加而是需要按優(yōu)先級(jí)插入。如果你用的是二叉堆實(shí)現(xiàn)入隊(duì)和出隊(duì)都是 O(log n)在高頻消息場(chǎng)景下成本需要測(cè)試評(píng)估。我在一個(gè)模擬項(xiàng)目 X 中對(duì)比過(guò)千萬(wàn)級(jí)日消息量下優(yōu)先級(jí)隊(duì)列的額外開(kāi)銷可以忽略不計(jì)但到了億級(jí)堆操作的競(jìng)爭(zhēng)和內(nèi)存分配就開(kāi)始成為瓶頸。3.3 時(shí)間輪與延遲消息很多業(yè)務(wù)場(chǎng)景需要延遲一段時(shí)間再處理比如訂單超時(shí)關(guān)閉、驗(yàn)證碼過(guò)期、延遲推送。如果用普通隊(duì)列實(shí)現(xiàn)你得在消費(fèi)者里不停比對(duì)當(dāng)前時(shí)間和消息的到期時(shí)間效率很低。Flowing 使用時(shí)間輪來(lái)處理延遲消息。時(shí)間輪的思想可以類比一個(gè)環(huán)形鐘表把時(shí)間劃分為很多槽位每個(gè)槽位對(duì)應(yīng)一個(gè)時(shí)刻到期的消息放進(jìn)對(duì)應(yīng)的槽位。指針每走一小格就把當(dāng)前槽位里的消息取出來(lái)投遞到就緒隊(duì)列。這種設(shè)計(jì)讓檢查一個(gè)消息是否到期從每次都遍歷所有消息變成了只需看當(dāng)前指針指向的槽位性能高得多。我在做某個(gè)跨平臺(tái)系統(tǒng)的延遲關(guān)閉功能時(shí)用過(guò) Flowing 的時(shí)間輪把一千個(gè)訂單的延遲關(guān)閉任務(wù)丟進(jìn)時(shí)間輪內(nèi)存占用和 CPU 開(kāi)銷都很低。但注意時(shí)間輪的精度由槽位間隔決定比如 1 秒一個(gè)槽那就無(wú)法保證 100 毫秒級(jí)別的到期精度。如果需要高精度就得換用小頂堆或者更細(xì)粒度的時(shí)間輪相應(yīng)的內(nèi)存開(kāi)銷也會(huì)變大。3.4 背壓讓生產(chǎn)者知道消費(fèi)者扛不住了背壓這個(gè)概念可以理解為消費(fèi)者撐不住時(shí)向生產(chǎn)者傳遞的阻力信號(hào)。Flowing 處理背壓的手段體現(xiàn)在有界隊(duì)列和拒絕策略上當(dāng)隊(duì)列長(zhǎng)度超過(guò)閾值時(shí)新來(lái)的消息要么被阻塞、要么被拒絕、要么被降級(jí)。最有用的一個(gè)實(shí)踐是分級(jí)背壓。不要把隊(duì)列設(shè)計(jì)成一個(gè)到了上限直接拒絕的開(kāi)關(guān)而是設(shè)置幾個(gè)水位線。隊(duì)列長(zhǎng)度超過(guò) 60% 時(shí)開(kāi)始告警超過(guò) 80% 時(shí)對(duì)低優(yōu)消息直接拒絕超過(guò) 95% 時(shí)所有消息都拒絕且觸發(fā)熔斷保護(hù)下游不被打崩。這樣生產(chǎn)者在壓力變大時(shí)能逐漸感知風(fēng)險(xiǎn)而不是在最后一刻眼睜睜看著消息被嘩啦啦丟光。4. 動(dòng)手實(shí)現(xiàn)一個(gè)最小 Flowing 消息循環(huán)4.1 核心數(shù)據(jù)結(jié)構(gòu)理論講了這么多不如直接上代碼。我自己在學(xué)習(xí)消息循環(huán)時(shí)習(xí)慣先實(shí)現(xiàn)一個(gè)最小版本跑通之后再逐步加功能。下面我用 Python 寫(xiě)一個(gè)只保留核心骨架的 Flowing 風(fēng)格消息循環(huán)去掉一切和業(yè)務(wù)無(wú)關(guān)的包裝。先定義消息體和消息循環(huán)的主體import time import threading from collections import deque class FlowingMessage: def __init__(self, msg_type, payload, priority0): self.msg_type msg_type # 消息類型用于分發(fā) self.payload payload # 業(yè)務(wù)數(shù)據(jù) self.priority priority # 優(yōu)先級(jí)先不管先留個(gè)字段 self.created_at time.time() class FlowingLoop: def __init__(self, max_queue_size1024): self.queue deque() self.max_queue_size max_queue_size self.handlers {} self.running False def register(self, msg_type, handler): # handler 是接收一個(gè) msg 參數(shù)的函數(shù) self.handlers[msg_type] handler def post(self, msg): if len(self.queue) self.max_queue_size: raise OverflowError(message queue is full) self.queue.append(msg) def run_once(self): if not self.queue: return False msg self.queue.popleft() handler self.handlers.get(msg.msg_type) if handler is not None: handler(msg) return True def run(self): self.running True while self.running: if not self.run_once(): time.sleep(0.001)這段代碼展示了消息循環(huán)最核心的三個(gè)部分消息對(duì)象、注冊(cè)表、單次消費(fèi)邏輯。run_once 每次從隊(duì)列左邊取一條消息按類型找到 handler 執(zhí)行。run 就是不斷調(diào)用 run_once隊(duì)列空了就睡 1 毫秒避免 CPU 空轉(zhuǎn)。4.2 注冊(cè) handler 與投遞消息光有循環(huán)不行得有業(yè)務(wù)側(cè)接入。下面注冊(cè)兩個(gè) handler一個(gè)處理訂單消息一個(gè)處理用戶消息loop FlowingLoop(max_queue_size100) def handle_order(msg): print(f[order] {msg.payload}) def handle_user(msg): print(f[user] {msg.payload}) loop.register(order, handle_order) loop.register(user, handle_user) loop.post(FlowingMessage(order, {id: 1001})) loop.post(FlowingMessage(user, {uid: 99}))這個(gè) Demo 跑起來(lái)之后能明確看到兩條消息按投遞順序被打印。為什么我要強(qiáng)調(diào)按投遞順序因?yàn)閱尉€程加 FIFO 隊(duì)列保證了消費(fèi)順序這是消息循環(huán)最基本也是最珍貴的能力。在真實(shí)業(yè)務(wù)里很多狀態(tài)一致性問(wèn)題的根源就是順序被破壞所以能從設(shè)計(jì)上保住順序就值得保住。4.3 讓循環(huán)在后臺(tái)線程運(yùn)行實(shí)際使用時(shí)通常不會(huì)在主線程里直接 run那樣主線程會(huì)被阻塞沒(méi)法干別的。Flowing 的典型用法是把循環(huán)放進(jìn)獨(dú)立線程主線程只負(fù)責(zé) post 消息import threading def start_loop(loop): t threading.Thread(targetloop.run, daemonTrue) t.start() return t start_loop(loop) for i in range(5): loop.post(FlowingMessage(order, {id: i})) time.sleep(0.2) time.sleep(1)這里有個(gè)細(xì)節(jié)為什么循環(huán)線程要設(shè)成 daemon因?yàn)槭刈o(hù)線程不阻塞進(jìn)程退出當(dāng)主線程執(zhí)行完進(jìn)程可以直接結(jié)束不會(huì)因?yàn)檠h(huán)線程還活著而無(wú)法退出。在輕量級(jí)工具腳本里很好用但在正式服務(wù)里你得保證循環(huán)有優(yōu)雅退出機(jī)制不能直接靠進(jìn)程退出兜底。4.4 加入優(yōu)先級(jí)后的最小改造上面代碼里 priority 字段沒(méi)用到現(xiàn)在把它用起來(lái)。最小改造方式是post 時(shí)把消息插入到合適的位置高優(yōu)先級(jí)靠前。這其實(shí)就是一種簡(jiǎn)單的優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)但刪除和查找中間元素性能差只適合消息量小的場(chǎng)景正式場(chǎng)景建議用 heapq 維護(hù)堆結(jié)構(gòu)。import heapq class FlowingLoopWithPriority: def __init__(self, max_queue_size1024): self.heap [] self.counter 0 self.max_queue_size max_queue_size self.handlers {} def post(self, msg, priority0): if len(self.heap) self.max_queue_size: raise OverflowError(message queue is full) self.counter 1 # 注意 heapq 是小頂堆優(yōu)先級(jí)數(shù)值越小越靠前 heapq.heappush(self.heap, (priority, self.counter, msg)) def run_once(self): if not self.heap: return False _, _, msg heapq.heappop(self.heap) handler self.handlers.get(msg.msg_type) if handler is not None: handler(msg) return Truecounter 的用途是當(dāng)優(yōu)先級(jí)相同時(shí)保證先入隊(duì)的消息先被彈出避免相等優(yōu)先級(jí)的消息之間亂序。這種細(xì)節(jié)你在實(shí)現(xiàn)消息循環(huán)時(shí)一定要留意否則你會(huì)得到一個(gè)看起來(lái)有序、實(shí)際隨緣的隊(duì)列。5. 實(shí)戰(zhàn)排障消息積壓、假死和重復(fù)消費(fèi)我是怎么一步步排查的5.1 消息積壓的三種典型根因先看積壓。某次測(cè)試環(huán)境里出現(xiàn)消息積壓第一反應(yīng)通常是消費(fèi)者處理太慢但深入排查會(huì)發(fā)現(xiàn)問(wèn)題沒(méi)那么簡(jiǎn)單。我歸納出三種根因處理函數(shù)耗時(shí)嚴(yán)重比如消息處理器里做了數(shù)據(jù)庫(kù)全表掃描、同步調(diào)用了慢接口。這種情況單純加消費(fèi)者線程沒(méi)用必須優(yōu)化處理器本身。消費(fèi)者線程數(shù)配置不足隊(duì)列堆積明顯但每個(gè)消息處理時(shí)間其實(shí)很短。此時(shí)線程數(shù)不夠需要擴(kuò)大并發(fā)度。消息被反復(fù)重試卡在隊(duì)頭某條消息處理失敗進(jìn)入重試如果實(shí)現(xiàn)方式是放回隊(duì)頭它就會(huì)反復(fù)阻塞后面的消息造成所有新消息積壓。第三種最隱蔽也是我踩坑最多的。之前做某圖像處理 Demo 時(shí)一個(gè)圖片消息解碼失敗后不斷回到隊(duì)頭重試后面的圖片消息全部排隊(duì)。表面看是積壓實(shí)際是死循環(huán)重試。5.2 循環(huán)里不能有阻塞調(diào)用——假死的根因下面這段壞代碼我故意還原出來(lái)你可以看看自己項(xiàng)目里有沒(méi)有類似影子def handle_order(msg): # 同步調(diào)用遠(yuǎn)程服務(wù)假設(shè)這里會(huì)卡 30 秒 resp requests.post(https://slow-service.example/api/process, jsonmsg.payload) save_to_db(resp)在循環(huán)里直接同步調(diào)用遠(yuǎn)程接口是最容易導(dǎo)致假死的寫(xiě)法。因?yàn)橄⒀h(huán)只有一個(gè)線程時(shí)這個(gè)消息沒(méi)處理完后面所有消息都等著。哪怕你有多個(gè) worker如果所有 worker 同時(shí)都在做阻塞調(diào)用一樣會(huì)全部卡住。正確做法是把阻塞調(diào)用放到獨(dú)立線程池中執(zhí)行利用 Future 或回調(diào)機(jī)制把結(jié)果投遞回循環(huán)。Flowing 對(duì)這類場(chǎng)景的處理方式是handler 可以返回一個(gè)協(xié)程或者 Future循環(huán)不等待執(zhí)行完成而是注冊(cè)一個(gè)完成回調(diào)回調(diào)里再往循環(huán)投遞后續(xù)處理消息。這樣當(dāng)前線程立刻被釋放可以繼續(xù)消費(fèi)下一條消息。這里我要強(qiáng)調(diào)一個(gè)很多人忽略的點(diǎn)即使你有 8 個(gè) worker如果每個(gè) worker 的 handler 里都有等遠(yuǎn)程響應(yīng)的同步代碼那么系統(tǒng)的實(shí)際并發(fā)處理能力依然是 8而不是可以處理 8 條消息的同時(shí)還有余力做別的。當(dāng)每個(gè)請(qǐng)求平均需要等待 1 秒時(shí)8 個(gè) worker 最多一秒處理 8 條消息其余請(qǐng)求只能排隊(duì)。真正的吞吐提升要靠在 handler 內(nèi)部使用異步 IO而不是無(wú)限加線程。5.3 重復(fù)消費(fèi)與冪等設(shè)計(jì)消息循環(huán)的另一個(gè)常見(jiàn)坑是重復(fù)消費(fèi)。原因不一定是你代碼邏輯錯(cuò)了而是消息可能被重新投遞。比如消費(fèi)者處理完消息、但還沒(méi)來(lái)得及提交確認(rèn)時(shí)進(jìn)程重啟消息隊(duì)列會(huì)重新投遞這條消息。所以處理消息盡量做成冪等。最簡(jiǎn)單也最有效的方法是在業(yè)務(wù)表里建唯一鍵處理前先判重或者用消息 ID 做去重表。我見(jiàn)過(guò)不少團(tuán)隊(duì)在消息接收方?jīng)]有去重邏輯需求一改同一條消息被處理兩次用戶就收到了兩條一模一樣的短信。我的建議是在消息循環(huán)的消費(fèi)者側(cè)加一個(gè)輕量級(jí)去重模塊。處理消息前先查去重緩存比如 Redis如果處理過(guò)就直接跳過(guò)如果沒(méi)處理過(guò)先寫(xiě)入一個(gè)處理中標(biāo)記再執(zhí)行真正的邏輯執(zhí)行完成后把標(biāo)記置為已完成。注意這個(gè)標(biāo)記不要只存成功狀態(tài)還要存失敗狀態(tài)否則失敗消息每次都要重新跑一遍整個(gè)處理器也是浪費(fèi)。5.4 一次完整排查鏈路從推送延遲到隊(duì)列中的一條壞消息我想分享一次完整的排查過(guò)程給你一個(gè)可復(fù)用的思路?,F(xiàn)象是某電商訂單推送服務(wù)消息延遲從 200 毫秒惡化到 5 分鐘訂單狀態(tài)更新明顯變慢。我接到問(wèn)題的第一反應(yīng)是看監(jiān)控大盤。隊(duì)列長(zhǎng)度曲線一直往上爬消費(fèi)者處理耗時(shí) P99 也很高說(shuō)明問(wèn)題可能在處理器本身。繼續(xù)看日志發(fā)現(xiàn)每一條訂單消息處理前都會(huì)打印一行processing order日志但某些訂單 ID 處理耗時(shí)差異巨大正常訂單 50 毫秒異常訂單要 40 秒。順著異常訂單 ID 找它對(duì)應(yīng)的 payload發(fā)現(xiàn)里面帶了一個(gè)特別大的 JSON 字段而這個(gè)字段會(huì)觸發(fā)下游服務(wù)的一把全表掃描。定位過(guò)程其實(shí)不是靠代碼 review 找到的而是靠鏈路追蹤把消息 ID 到處理階段的完整鏈路串起來(lái)之后才發(fā)現(xiàn)的。這也提醒我消息循環(huán)的監(jiān)控不只要看隊(duì)列長(zhǎng)度和處理耗時(shí)還要有消息級(jí)別的追蹤能力。沒(méi)有消息 ID 貫穿整個(gè)處理過(guò)程排查這類問(wèn)題基本靠猜。6. 讓 Flowing 消息循環(huán)更抗造的進(jìn)階改造6.1 看門狗與超時(shí)熔斷基礎(chǔ)消息循環(huán)能跑通業(yè)務(wù)但要說(shuō)抗造還差得很遠(yuǎn)。第一個(gè)要加的是看門狗機(jī)制。消息循環(huán)中某條消息處理超時(shí)如果沒(méi)有外部干預(yù)它會(huì)一直占用 worker 資源其他消息只能等待。Flowing 可以給每條消息設(shè)置超時(shí)時(shí)間超時(shí)后循環(huán)不再繼續(xù)等待該消息處理完成而是標(biāo)記處理異常并把任務(wù)從當(dāng)前 worker 上摘除。實(shí)現(xiàn)上用超時(shí)調(diào)度器比如時(shí)間輪定期掃描執(zhí)行中的任務(wù)超過(guò)閾值就把該消息認(rèn)定為超時(shí)記錄日志并觸發(fā)補(bǔ)償邏輯。這里要小心一點(diǎn)摘除任務(wù)不等于終止任務(wù)。如果處理器內(nèi)部已經(jīng)在做數(shù)據(jù)庫(kù)更新你強(qiáng)行跳過(guò)去這條消息的后續(xù)副作用可能還在繼續(xù)執(zhí)行會(huì)造成狀態(tài)不一致。所以超時(shí)后要結(jié)合消息 ID 做補(bǔ)償要么允許繼續(xù)執(zhí)行但記錄警告要么確保后續(xù)補(bǔ)償邏輯也能正確處理重復(fù)。千萬(wàn)不要以為超時(shí)摘除就萬(wàn)事大吉。6.2 多線程消費(fèi)者與動(dòng)態(tài)擴(kuò)縮多線程消費(fèi)者的改造不算難難的是讓并發(fā)度能動(dòng)態(tài)調(diào)整。我結(jié)合 Flowing 的實(shí)際使用經(jīng)驗(yàn)推薦一個(gè)簡(jiǎn)單有效的方案維護(hù)一個(gè)可調(diào)大小的 worker 池定時(shí)檢查隊(duì)列長(zhǎng)度和消息平均處理耗時(shí)利用簡(jiǎn)單的控制邏輯動(dòng)態(tài)增加或減少 worker 數(shù)量。判斷該不該擴(kuò)容我的經(jīng)驗(yàn)公式是看隊(duì)列積壓速度。記錄一段時(shí)間內(nèi)的隊(duì)列長(zhǎng)度變化量如果持續(xù)正向增長(zhǎng)說(shuō)明消費(fèi)速度跟不上生產(chǎn)速度先加 worker如果隊(duì)列長(zhǎng)度穩(wěn)定且 worker 的 CPU 占用高說(shuō)明加線程已經(jīng)無(wú)法提升吞吐該優(yōu)化的是單個(gè)消息的處理開(kāi)銷。動(dòng)態(tài)擴(kuò)縮要格外注意資源競(jìng)爭(zhēng)問(wèn)題。worker 增加時(shí)共享資源的鎖競(jìng)爭(zhēng)會(huì)加劇可能反而導(dǎo)致吞吐下降。我在某跨平臺(tái)系統(tǒng)里做過(guò)對(duì)比測(cè)試在無(wú)鎖情況下從 4 worker 加到 8 worker 吞吐提升明顯但在一把大鎖保護(hù)共享狀態(tài)的情況下8 worker 反而比 4 worker 吞吐低了 15%。所以擴(kuò)容不是拍腦袋決定必須實(shí)測(cè)。6.3 可觀測(cè)性隊(duì)列水位、循環(huán)時(shí)延和消息生命周期最后一個(gè)進(jìn)階建議是可觀測(cè)性。我接觸過(guò)的很多系統(tǒng)消息循環(huán)跑得通但出問(wèn)題時(shí)兩眼一抹黑就是因?yàn)槿鄙僦笜?biāo)。哪怕是最簡(jiǎn)單的三個(gè)指標(biāo)也能幫你省下大量排查時(shí)間。第一個(gè)指標(biāo)是隊(duì)列水位即當(dāng)前隊(duì)列長(zhǎng)度與最大長(zhǎng)度的比值。它能直接告訴你系統(tǒng)離爆隊(duì)列還有多遠(yuǎn)。第二個(gè)指標(biāo)是循環(huán)時(shí)延指消息從進(jìn)入隊(duì)列到被取出的等待時(shí)間這個(gè)指標(biāo)比平均處理耗時(shí)更能反映用戶體驗(yàn)。第三個(gè)指標(biāo)是消息生命周期從投遞到處理完成的完整時(shí)間如果它持續(xù)上漲說(shuō)明系統(tǒng)的處理能力正在惡化??捎^測(cè)性的落地手段可以用結(jié)構(gòu)化日志每條消息處理完成后輸出一條包含消息 ID、耗時(shí)、等待時(shí)間、處理結(jié)果的日志。線上查問(wèn)題時(shí)只要搜消息 ID 就能還原它在消息循環(huán)里走過(guò)的完整路徑。我個(gè)人的經(jīng)驗(yàn)是這比任何復(fù)雜的監(jiān)控大盤都管用因?yàn)樗前聪⒁暯墙M織的和業(yè)務(wù)認(rèn)知天然一致。最后的一點(diǎn)體會(huì)寫(xiě)到這里關(guān)于 Flowing 消息循環(huán)的骨架已經(jīng)完整了?;乜次易约旱呐耪辖?jīng)歷最大的感受是理解消息循環(huán)不能只停留在隊(duì)列加分發(fā)這種表面你還需要看到它背后的調(diào)度策略、超時(shí)機(jī)制、背壓邏輯和可觀測(cè)性設(shè)計(jì)。消息如何流淌決定了系統(tǒng)的穩(wěn)定性天花板也決定了你半夜被叫起來(lái)排查故障時(shí)是十分鐘定位還是通宵抓瞎。如果你最近也要在自己的項(xiàng)目里引入或者改造消息循環(huán)我建議你按這個(gè)順序動(dòng)手先用最簡(jiǎn)單的方式跑通最小循環(huán)確認(rèn)順序和基礎(chǔ)分發(fā)沒(méi)問(wèn)題然后加上隊(duì)列飽和和超時(shí)機(jī)制保證它不會(huì)因?yàn)橐粋€(gè)慢處理器而全線崩潰最后再補(bǔ)監(jiān)控和追蹤。不要一開(kāi)始就上分布式、上動(dòng)態(tài)線程池因?yàn)榛A(chǔ)不穩(wěn)時(shí)越復(fù)雜的機(jī)制越容易掩蓋真正的問(wèn)題。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
HEYZO高无码国产精品227| 欧美日不卡| 99亚洲国产精品色一区二区三区| 俺去啦俺来也久久综合| 大香蕉123| 啊啊啊啊啊在线视频| 狠操91,com| 成 人 A V免费视频在线观看| 欧美色性爱| 欧亚乱色熟一区二区三四区| 青青草色AV| 人人操人人干xxx| av网站在线观看了| 九九热视频在线观看| 亚洲成av人片色午夜乱码| 91女优在线观看 | 日本一区不卡| 岛国片在线观看视频亚洲| 人妻精品一区二区全免费| 精品人妻一区二区三区日产| 26uuu国产免费观看| 97精品97久久| 色综合婷婷| 加勒比99999| 欧美v亚洲v日韩v最新在线二区 | 久色99999| 91在线视频国产网站| 婷婷视频在线免费观看| 91欧美巨乳| 久久精彩免费视频| 欧美淫乱视频| 欧美性天天影视| 91制服丝袜中文字幕| 亚洲色欲天天人妻无码系列专区| 国产AV天美传媒一区二区三区 | 久久日韩肥臀| 日韩中文字幕二区| 日本一久是| 欧美强奸乱| 色婷婷一区二区三区久久午夜成人不| 亚洲欧洲国产综合av| 啊啊啊啊嗯嗯在线久久久| 天天天天操| 九九九九免费视频| 国产懂色精品国产av| 青青操视频在线| 欧美亚洲素人制服精品| 精品无码一区二区人妻久久蜜桃| 六月婷激情福利天堂69| 人人操人人插人人摸人人干| 精久久久| 性爱AV天堂| 亚洲aV性爱| 东京热91| 好爽要喷了| 99色色网| 日韩性爱小视频在线观看| 岛国小电影| 天天色综亚洲91污| 亚洲无码太久| 超碰97人妻自拍| 日本 免费 一区二区三区 久久香蕉| 成 人片 黄色大片| 午夜啪| 青青青艹在线视频| 1240青青草一区二区三区视频天爱| Blackedraw视频一区二区| 91久久| 破苞ⅩXXX性无码动漫无码| 欧亚无码视频| 高清有码一区二区| 蜜桃丰满熟妇av无码区不卡| 97公开久久| 色婷婷丁香五月| 一级久久久久久久久久久| 最新9久久久9免费视频| 精品人妻一区春色| 久草婷婷| 少妇500双飞99| 日日夜夜骚| 99热精品在线播放| 激情九月婷婷| 精品熟妇视频一区二区| 欧美久久婷婷| 中文字幕在线播放2中文字幕在线观看2| 把腿张开老子CAO烂你| 在线观看色视频| 国产精品久久天天干| 97chaopengongkai| 欧美性夜| 黄色香蕉视频网站一区| 国内亚洲高清无码| 国产美女裸体秘 永久无遮挡| 网友自拍第1页| 99久久精品国产系列| 国产强奸乱伦欧美| 久久亚洲中文字幕视频| 亚洲AV成人无码一二三久久| 无码78| 亚洲 日本 不卡| 欧美综合中文| 美女诱惑在线一区| 91劲爆| 亚洲激情色片| 97免费视频在线| 精品人妻一区二区三区不卡断| 操国产高清| 亚洲第一精品在线视频 | 99视频精品| 精品一区二区三区蜜桃臀赵总 | 伊人久久亚洲色欲综合网站 | 日韩欧亚太美不卡| 91艹逼精品| 91亚洲欧美综合高清在线| 精品美女久久一二三| 国产精品97超碰| 亚洲成人ab| 国产成人亚洲精品无码最新在线| 乱论91| www..com操老师| 天天添天天干电影| 免费精品AB| 亚洲高清视频在线免费观看| 国产精品久久久久久久久久久久久久| 综合操逼| 日日日大屁股骚女人精品| 亚洲精品国产精品乱码不99| 香蕉色网| 久久怡红院| 亚洲AV噜噜狠狠网址蜜桃动漫| 麻豆精品.欧美精品.日韩精品.| 人妻丝袜无 码视频专区| 亚洲综合精品国产一区| 精品视频专区| 欧美性爱精品七区| 激情综合亚洲| 久久九九97| 自拍偷拍 日韩欧美| 日本 欧美 国产一区| 狠综合网| 日本熟女不卡视频| 久偷拍| 精品高清av中文字幕| 日韩伦理久 久久 清纯| 不卡av在线中文字幕| 激情文学网伊人| 一本一道久久综合久久| 翔田千里AⅤHD无码| 人妻出轨一区二区三区| 美女黄网| 精品免费1| 成人国产二区三区在线,男女精品。| 久久大香蕉手机高清| 青青草原狼av| 精品久久久久久中文字幕视频免费| 日韩AV电影网站| 日韩成人私密一级精品av| 人妻在线大香蕉| 国产18精品亚洲精品| 精品亚洲天堂| 超碰97首页| 日韩人妻免费精品| 清纯唯美综合亚洲| 欧美 亚洲 大香| 国产高清MV操逼视频| 97中文字幕一区| 嗯嗯嗯不要不要免费视频| 一类无码操逼视频| 亚洲人成在线放东京热| 日日A∨| 在线不卡视频| 久久只有精品| 97高清啪啪| 717影院理论午夜伦八戒| 好涩综合| 97se综合网| 免费看日本操逼视频| 我要色综合网| 青女偷拍网| 久久色激情一区二区三区| 韩国三级理论在线| 亚洲一区二区久久久久| 精品一区二区国产日韩| 麻豆av一区二区| 久久久内射良家| 春色校园综合网| 日本一级一级一级一级| 岛国片在线观看视频亚洲| av在线观看不卡网站| 97在线播放| 大香蕉欧美国产日韩高潮| 日韩偷拍色图| www99热| 国产伦乱91| 男男H黄动漫啪啪无遮挡网站| 少妇久久久| 亚洲开心网| 久久华人网| 久久久久国产精品人妻aⅴ天堂| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲第一综合| 7777奇米影视久久| 一区二区三区成人高清视频| 精品无码不卡视频| 92人人操人人| 五月婷婷综合网| 免费夜夜爱黄色视频毛片| 第四色色综合91| 免费看一级a性色生活片久久无| 免费av大片| 国产精品自拍欧美在线| 高清国产av无码| 精品中文字幕第一页| 久久国产免费激情视频| AV和黑人在线播放| 久久精品国产亚洲AV片多多 | 成人日韩欧美| 97午夜剧场日韩| 人妻精品综合中文字幕在线| 亚洲精品久久久久毛片A片拉屎 | 色五月婷婷五月天| 久久综合超碰| 亚洲最大成人a毛毛片| 欧美韩日精品资源| 欧美日韩性爱操大逼| 五月婷婷六月丁香| 国产欧洲精品亚洲午夜拍精品| 免费在线黄片视频| 日韩 人妻 精品| 国产2.3.4区| wwwss在线观看| 精品人妻一二三| 亚洲国产一级中文综合久久天堂在线免费观看| 另类图片欧美激情综合| 91情色| 一级AV性爱| 日韩无码第3页| 性站| 免费毛片在线播放| 亚洲综合另类欧美久久久| 日韩综合色网| 九久久精| 色噜噜狠狠色综合日日| 97超碰中文字幕| 亚洲本色精品一区二区久久| 亚洲综合91| 国产在线激情视频| 97超级久久强资源| 久久草大香蕉| 日本啊啊啊啊啊视频| 日本超碰97日韩精品人妻| 国产精品不卡少妇白| 91在线精品| 久久久久久亚洲精品不卡人乳| 99热aaa| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 日韩乱码Av| 97中文字幕一区| 欧美日本国产日韩激情视频| 亚洲无码99| 天天日天天干天天摸天天操| 亚洲图片日本AⅤ欧美在线| 日韩三级久久久| 亚洲加勒比| 91N欧美| 大象AV在线| 99热99在线播放激情| 蜜桃久久久久久久久久久久| 亚洲精品尤物yw在线影院| 大香蕉伊在线久草麻豆天堂故事| 日韩三A大片在线观看 | 怡红院网站在线视频| 上海一级黄片| 色色97爱| 日本一二三高清| 日韩黄片视频试看| 亚洲日本大香蕉1| 看日韩美女二区三区免费操逼视频| 亚洲的天堂网| 日本免费人成视频播放120秒| 加勒比AV网| 亚洲欧美在线观看免费| 久久久久白虎| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 人妻精品一区二区| 欧美亚洲性爱一区二区| 国产专区路线| 九九九九精品九九九九| 97硬碰| 一区二区三区激情在线观看| 天天影视之亚洲综合网| 红杏大香蕉| 国产三级片在线观看| 久热伊人99re| 久久久免费的精品| 九九色综合| av网站国产主播在线| 伊人国产视频| 人妻天天操天天爽视频免费| 国产色呦呦| 九九九九热只有精品| 美女啊啊啊啊啊啊啊| 18禁的网站在线| 日韩成人高清一区二区| 夜夜夜夜久久久久| 91麻豆一二三区| 亚洲操逼视频网站| 成人线上超碰| 职场同事知名国产国产精品久久欧美日韩 | 男男H黄动漫啪啪无遮挡网站| 亚洲色人阁| 午夜啊啊啊| 亚洲制服欧美另类内射| 日韩欧美成人性爱在线| 懂色中文一区二区三区| 激情小说亚洲| 国产熟码AV| 亚洲淫色网中文| 天天看天天日| 国产精品3| 中文字幕第23区| 久久久久ab| 懂色综合久久久| 久久一级无码精品毛片6| 日韩免费三级黄片电影| 欧美少妇色图| 久久专区| 九九九九国产| 中文字幕精品免费一区二区| 亚洲自拍偷拍视频在线| 91网站18禁| 亚洲麻豆18发?| 四虎AV无码| 日本操逼视频在线| 色99在线| 成人亚欧免费视频| 一区二区三区精品黑丝白丝酒店对鸡 | 欧美白嫩女HD| 午夜男人天堂| 国产亚洲日本| 欧美制服网站美腿丝袜| 91网站在线播放| 小视频国产| 国产黄色动态精品| 无码精品啪啪啪一区二区三区三州| 国产sv美女内射| 成人自拍三级在线观看| 打av高清| 射久久| 九九九九久久久| 国产精品乱码久久久、久久| 91小视频| 色网亚洲人| 日韩啪啪网| 色综合天天爱去电影网| 日韩亚洲美女一区久久| 精品国产Av无码久久久伦古装| 亚洲最大91网| 91亚洲网| 婷婷精品国产一区二区三区日韩| 91久久免费视频互動交流 | 超碰99热中文字幕| 99久在线精品99re8蜜桃| 干干干天天| 人妻天天爽夜夜爽2| www.色操逼| 蜜臀久久久99久久久久 | 夂久色| 天天日天天干天天操| 天堂资源欧美| 性色av大全| 超碰欧美97资源| 操久久久久久| ji熟女.com| 青青青草原| 97久精品| 日本一区二区做爱的视频| 中国女人内射6XXXXX| 亚洲自拍偷拍视频在线| 婷婷五月天久久久| 精品无码久久久久久久杏吧| 亚洲91网| 色婷婷五月天| 欧美伦乱| 99无码视频| 综合网亚洲1| 美女爽爽爽刺痛洞洞| 秋霞色色影院| 天天综合精品| 极品后入免费视频| 国产精品久久久久无码Av网曝门| 亚洲图片欧美在线视频| 有码人妻系列| 一区二区三区一亚洲中文字幕、综合区灬 | 久久97| AV一起草在线| 操人妻少妇中文| 欧美午夜精品久久久久久超碰| 东北熟女91| 青娱乐国产盛宴视频| 久久五月份| 91bbb| 97AV爱| 91人妻精华帖| 91中文字幕在线观看| 欧美日韩丝袜| AV一区观看| 偷窥自拍亚洲色图| 高清无码一区二区三区| 国产精品久久久久久9999| 蜜臀少妇一区二区| 国产精品麻豆视频网站| 欧美日韩在线小说 | 色婷婷小说| 不卡一区二区日本视频| 夜夜躁狠狠躁日日躁av| 人妻少妇久久中文| 欧美96精品在线| 天天综合~91| 精品人妻一二三四区视频| 激情小说激情视频| 欧美18老人禁| 日本三级韩三级99久久| 欧美影音在线| 69国产对白刺激| 国产精品久久久久av| 99国产在线绯色一区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 天天影视综合色| 翔田千里AⅤHD无码| 99这里有精品视频| 性欧美第一页| 岛国视频免费在线观看| 欧美熟妇操操视频| 电家庭影院午夜69久久夜色精品国产69乱| 影音先锋中文字幕日本好一区二区| 91亚洲黄色网| 99青青草国产视频| 国产精品96| 偷看洗澡一二三区美女| 夜夜综合| 高清国产成人无码| 夜夜一区二区| 欧美性爱一区二区三区| 日本色色色视频| 校园春色欧美色图| 性欧美| 麻豆成人AV| 97视频在线看| 亚洲美女AV无码| 日本一区二区成人在线| www.婷婷| 色综合尤物| 好舒服视频| 欧美探花网| www.99热在线只有精品| 亚洲综合影院| 韩日精品四区| 欧美姓爱综合网| 成人性爱AV在线免费观看| 一区二区首页| 自拍六区| 亚洲激情在线| 欧美少妇内射| 久久伊人最新网址视频| 亚洲精品中文字幕一区在线视频| 久久国产对白激情浪潮| 久久亚洲中文字幕视频| 日韩av三四区| 精品国产91av一区二区三区| 人妻人妻天天碰| 亚欧无码线免费观看视频| 涩涩五月天| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 嗯嗯嗯不要不要免费视频| 亚洲精品丝袜-不卡成人免费……| 九九九九九九综合| 欧美日韩丝袜| 午夜小电影在线插入淫高潮| 2025亚洲男人天堂| 看大黄色大片原件| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 欧美熟妇精品黑人巨大一二三区| 日韩av性爱在线播放| 大香蕉色网| 亚洲欧洲综合av在线| 欧美国产操逼| 99久久99九九99九九九| 日本一二区不卡| 有码免费观看| 中文字幕精品探花视频| 国产AV人人 夜夜人人澡| 国产一区在线观看无码AV| 亚洲日韩久久精品一区| 日本中文字幕在线电影| 2017天天操天天日| 嗯啊啊啊轻点视频| 久久久亚洲高清不打码| 亚州,欧美在线| 中出91| 亚州Av天美传媒| 色综合天天| 狠狠干91| 久草精品一区| 天美AV片| 在线观看亚洲专区| 后入国产| 天天流夜夜操| 国产AAAAAABBBBB| 欧美图片偷拍| 无码久久亚洲高清,| 狠插 制服 自拍| 日韩av在线播放不卡| 桑老女人九区| 西西美女视频网| 久草五月| 嗯嗯啊啊操我| 国产综合操逼高清| 亚洲AV无码黄色强奸| 久久丝袜| 十八禁视频一区二区| 97国产天堂岛| 五月丁香久久| 欧美色一二三| 综合久久97| 免费看污网站| 欧美日综合| 久久受www免费人成| 一卡二卡三卡| 2019午夜福利视频| 78综合网| 97色婷| 国产在线综合网| 神马久久网| 淫妻综合网| 久久精品国产亚洲AV片多多| 永久电影三级在线观看| 国产精选视频| 日韩图区| 五十路熟女工口| 亚洲综合色男人网| 亚洲综合九九| 日韩丝袜二区| 久久精品欧美一区二区三区不卡| 中文字幕第二页| 精品国产99| 99精品无码| 日本五十路熟女一区二区| 国产在线综合网| 花花AV导航| m欧洲一级午老| 91蜜臀在线久久久久| 91丨九色丨熟女高潮| 免费av高清无码| 天天干人人看综合| 综合久久97| 亚洲激情在线| 欧美成人贴图| 青青久日| 国产中文字幕在线| 伊人在线大香蕉二。| 丰满精品人妻少妇久久字幕| 人妻献身系列第54部| 伊人91| 98超碰欧美| 精品无人区麻豆乱码1区2区图片| 91无摭挡| 人人摸人人舔一区二区| 九九九九九九九九九九精品视频| 亚殴在线| 久久 亚洲 日韩 人妻| 色好看av| 久久欧美激情| 正在播放国产精品一区| 一区二区激情国产熟女| 91老熟女逼| 91美腿丝袜在线观看| 91neishe| 超碰午夜在线| 蜜桃视频精品一区二区三区| 99re这里只有精品3| av在线浏览| 日本午夜福利视频| 久久国产视频专区一二三| 精品久久99| 诱惑人妻欧美一区在线播放| 台湾大香蕉99热| 白丝少妇一区二区| 九七人妻在线| 亚洲91网站| 欧美在线综合| 四虎免费看黄| 精品久久在线区一区| 亚洲天堂电影精品一区| 亚洲天堂热| 1024人妻熟女一区二区三区| 国产丸一视频| 国产乱不卡| 亚洲欧洲日韩中文字幕一区| 91老司机视频| 国语对白露脸XXXXXX| 日本精品网站在线中文| AV无码久久久精品| 天天干,夜夜爽| 欧美亚洲丝袜美女电影| 亚洲成人色情五月天丁香花| 久久9999| 97在线视频免费观看| 韩三级a视频在线观看| 国产欧美岛国精品一区| 久久五月综合| 欧洲中文字幕| 麻豆区久久久久亚| 国内一区二区三区| 狼天天狼天天大香蕉| 岛国视频一二三区| 在线97在线| 国产女人视频三四五区| 91九色网| 国产免费一区| 嗯啊不要在线观看嗯啊| 8x福利精品第一福利视频导航| 成人八戒网站| 国内91熟女人妻丝袜天天精品视频在线| 成人五月香网在线| 男人把坤坤插入女人的下体| 啊啊啊啊免费视频| 国产日韩精品人妻久久久久色欲网站| 久久东京国产精品视频| 蜜桃久久久久久久| 人人操超碰在线| 国产一区二区三区高清视频| 日本在线视频导航| 久久视网78| 啊啊啊慢点| 亚洲综合有码| 少妇人妻太紧太深av| 日本精品一区三区| 97视频在线观看网站| 极品粉嫩一区二区| 日本免费一区二区不卡| 亚洲一区在线观看欧洲 | 午夜精品探花| 日本A级视频| 人人妻人人澡人人爽人人精品浪潮| 青青草久草| 亚洲αv一区二区三区| 黑丝91视频| 久久男人| 51一区二区三区| 麻豆黄四叶草网站| 五十路三区在线| 久久久久久AⅤ无码免费肉站 | 欧美另类自拍| 亚洲高清自拍| 亚卅熟女乱色| 天天天天操| 欧美日韩小说| 九99久久| 色综合网1| 人妻少妇精品久久久久久久| 男人天堂2017| 国产精品久久久久久夜夜夜| 伊人久久亚洲色欲综合网站 | 日本熟妇一区二区三区| 国产 v乱码一区二| 亚洲无码国产探花在线观看| 九月伊人中文字幕| 久夜操| 亚洲色图久久成人| 日韩簧片免费看| 99re在线视频| 91女优在线观看 | 亚洲熟女人妻中文字幕一区二区| 色婷婷99| 日韩黄片影院| 性一级黄色录像片网站导航| 亚洲。天堂。日本在线观看| 久久AV无码1区2区3区| 国产精品探花在线| 综合国产97| 91n处女在线观看| 久久9精品网站| 91激情国产| 9久综合网| 97超色| blacked精品一区国产| 狠综合网| 午夜毛片亚洲精品片国产久久久| 中文字幕在线观看永久| 一区二区三区亚洲| 国产精品剧情| 久久国产成人精品国产成人亚洲| 亚洲十八禁止| 日本一卡二区在线| 久久九操在线观看| 免费观看成人www精品视频| 欧美第一页性| 欧美日韩97在线| 久久久久久久久久久久久久久性生活视频 | 精品欧美不卡在线播放| 天天躁日日躁xxxxx| 免费a级毛片av无码久久精品中文字幕| 蜜臀99久久精品久久久久久| 久热99999| 久热99999| 国产精品老熟女一区二区| 99在线免费观看| 色色激情五月天| 欧美操人| 一区二区三区精品久久| 少妇熟女1区2区3区| a片 xxxx受爽视频| 日本孕妇一区二区视频操逼免费看 | 人妻中文字幕精品无码 | 美国精品国产精品| 无遮挡一级毛片视频免费的| 亚洲免费成人在线高清无码视频 | 美女的肌被草喷水视频| 天天肏美女| 亚洲中文字幕乱码无码一区二区 | 色色激情| 五月激情小说| 色色色网站| 国产精品白虎| 嗯嗯嗯啊啊啊操的我好爽| 国产精品欧美激在线| 亚洲男人天堂2016| 中文精品少妇天堂| 五月天久久人妻| 9丨久久九九九| 伊人一级免费黄片| 日韩无码a片| 操逼网站地址| 丁香五月婷婷五月| 丁香五月激情综合| 精品国产污一区二区三区| 国产精品午夜成人福利| 97精品在线| 国产精品乱码久久久久久| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 激情综合网亚洲| 中文字幕一区二区三区字幕| 国产一区二区精品久久99| 岛国在线一区二区三区| 爱媛媛久久国产福利| 美女尤物福利视频| 天天看高清麻豆| 97欧美色| 熟女人妻精品一区二区视频| 欧美自拍偷拍综合图片| 国产隔壁老王影院在线| 伊人久久婷婷| 啊啊啊久久| 熟女少妇一区二区三区| 91色交| 99热| 性饥渴少妇av无码毛片| 成人性爱视频在线看| 国产麻豆一级精品视频| 99欧美| 丰满人妻一区二区三区在线| 四季AV一区二区凹凸精品小说| 熟妇高潮精品一区二区三区下载| 久久手机好看网站| 五月综合久久| 天天做天天爽| 超碰在线人妻不卡| 日韩无码黄色片| 中文AV制服乱伦| www国产天美久久久| 96精品在线| yy少妇精品久久| 91天天综合网| 青青伊人这里只有精品| 97亚洲国产影视| 精品人妻伦一区二区三区久久| 欧美综合第一页| 国产特级毛片AAAAAA高潮流水 | 97色97好| 亚洲有薄码区久久在线一区| 亚洲人妻在线精品| 深夜激情无码| 亚洲精品一区二区三区新线路| 久久噜| 78精品| 国产精品亚洲天堂网址| 99热久| 综合网97| 伊人操你| 校园春色综合网| 色婷网| 国产免费内射视频| 欧美精品久久久久久久久88| 刺激性视频黄页| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 天天伊人| 天天操天天射天天日| 精品超碰中文在线| 亚州,欧美在线| 欧美日日操| 久久综合乱子伦国产免费| 国产综合久| 国产成人亚洲精品无码古代早漏男| 久久久一热在线播放| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 日本操逼视频在线| 五月丁香| 玖玖资源视频一区二区三区| 欧美亚洲自拍另类人妻| 亚洲激情网一二三四区| 欧洲站一级二级三级h| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 成人性爱高清视频免费看| 午夜欧美J进J出白浆流出久久久| 96一区二区| av资源在线播放天堂| 高清不卡 中文 人妻| 久久亚洲欧美中文字幕国语| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 78精品| 立川理惠无码一区二区| 国产情色第一第二页在线观看| 国产久久久久久| 色色99| 欧美色图片色哟哟| 黄色av一区二区在线| 97伦乱| 亚欧Av| 日本黄色天堂| 日韩中文字幕人妻视频| 人妻丝袜肏逼| 精品中文字幕一区二区| 欧美久久久15P| 亚洲另类欧美精品| 第四色色综合91| 亚洲av噜噜噜噜噜噜| 久7色| 欧美高清第一页| 色婷婷在线视频| 999精品久久久久久久| 久操大香蕉手机视频在线看 | 无码国产精品午夜不卡(| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 日韩激情电影中文字幕| av操操不卡| av一区二区三区不卡| 精品人妻一区二区免费蜜桃| 亚洲欧洲av影音| 91欧美长吊| AV和黑人在线播放| 久久夜精品一区二区三区| 91成人久久| 精品欧美日韩在线观看| av天堂精品久久| 欧洲大香蕉| 国产一级αv免费看片| 四虎在线视频| 久久一二三四五六七八九区区区 | 欧美日韩亚洲少妇寂寞影院正在播放| 国产小u女在线观看| 黑人性欧美| 韩国久久97| 男啪女色黄无遮挡免费观看| 东北女人| 奇米狠999| 蜜桃精品一区二区三区久在线| 粉嫩av在线一区二区| 91激情国产| 97色在线| 91天天综合| 在线视频五十市| 久久精品国产亚洲AV嘿嘿| 亚洲AV永久无码精品成人调教| 综合色久| 日本爽爽爽爽爽爽免费视频| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 人人妻人人爽一区二区三区| 伊人久久婷婷| 日本成熟少妇A∨网站| 久久熟妇五十路一区| 精品国产人成在线| 嗯嗯不要 视频| 97国产精品国| 久草国产在线视频| 亚洲人码13| 69精品人人人人| 精品国模无码| 蜜臀在线看片| 蜜桃久久综合视频| 中文字幕久热视频在线| 91模特在线观看| 婷婷色一区| av网站在线观看了| 国产AV人人夜夜澡人人爽麻豆| 久久小视频| av在线播放国产一区| 本道在线| 青青青操| 日本亚洲熟女视频| 五十路熟女人妻一区二区在线观看 | 99re6久热只有精品6在线直播 | 日本欧美不卡| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 国产v片在线免费观看| 丝袜色综合| 欧美精品另类人妖xxxx| 2019久久久久久久久福利| 黄页av| 中文字幕女同在线| 天天影视网综合少妇| 草草影院最新网址| 成人性交午夜免费片| 精品人人| 国产强奸超碰AV| 成人免费性爱视视| 日韩BBN| 99www.bibizy香蕉资源国产一区二区三区高清| 一区三区啪啪| 草草电影院| 视频在线97| 亚洲性综合9| 欧美一级黄片免费播放| 国产日本一区二区三区蜜臀在线观看| 最新av在线| 91大胆欧美| 91香蕉视频在线观看免费| 青青青青青手机视频| 成人网欧美风情| 五月色网| 亚洲伊人a线观看视频| 羞涩视频| 久热精品在线| 国产第二页| 1区2区3区在线视频| 欧日a| 伊人网青青| 欧美丰满少妇交换91欧美精品| 日本日日色视频| 六月丁香啪啪啪| 精品人妻美妇91job| 天天干天天燥| 日韩无码视频黄色| 婷婷五月天激情四射| 国内成人圈中文字幕无码视频| 亚洲综合在线高清| 97在线精品观看视频| 好吊色综合| 综合亚洲网| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 五月丁香影院| 国产熟女乱论| wwwxxx日本爽| 少妇激情一区二区三区视频| 1024午夜激情男人的天堂| 国产精品经典一卡久久久| 免费一级欧美片片线观看| 天天综合网日韩7799| 99re热有精品视频国产| 久久精品国产亚洲5555| 欧美性夜| 欧美伊人电影| 九九九成人| 亚洲国产中文字幕| 青青草伊人久久| 久久国产精品,久久国产| 亚洲色吧网| 乱精品一区字幕二区| 91Chinese在线| 人妻99p| 黄色网址在线免费观看| 精品国产丝袜一区二区三区乱码| 天天视频网站黄| 激情五月综合开心五月| 日本一区二区亚洲综合| 加勒比久久av| 欧美 日韩第一性色| 欧美骚少妇| 日韩久久艹| 精品乱子一区二区三区99| 蜜臀精品1区2区| 亚洲美乱| 超碰97爽| 国产久久一区二区三区野外在线| 久操B网| 五月丁香久久| 麻豆天美久久91| 欧美图片偷拍| 91色艳| 老女人爆菊| 91新在线欧美| 超碰97资源中文字幕| 激情文学欧美| 精品乱码久久久久| 裸体1区| 欧美在线视频播放| 日本五区不卡| 亚洲中字慕不卡| 78操B| 91亚洲综合| 国产91丝袜 在线播放| 怡春院久久| 色哟哟av| 熟女熟妇一区二区三四区| 日本高清一本二本免费不卡| 亚洲好色人妻| 大逼色网站| 激情文学88| 日韩熟女操逼| 家庭乱伦网站国产| 超碰成人国产| 日韩pv中文| 精久久久91| 后入式五六区| 黄页| 国产偷人伦激情在线观看| 91丨九色丨国产丨人妻在线| av一区二区三区四区| 精品成人动漫一区二区| 狼狼色丁香久久婷婷综合五月| 99久久久无码国产精品性男| 亚洲最大AV网| 亚洲欧美校园另类春色| 欧美一区二区三区大综合| 青青草久草AV| 成人青青草原伊人| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 黑人中出21连凳花野真衣| 亚洲资源网| 欧美自拍网| 日本国产亚洲一区在线观看| 国产91乱伦| 亚洲AV成人无码一区二区三区在线观看| 久久人妻精品| 第45页一区二区| 亚洲有薄码区久久在线一区| 91亚洲影视| 久久精品人人做人人看| 强奸乱伦Av网| 91女在线观看| www.男人天堂| 97在线视频免费看| 国产成人超碰在线| 丁香五月天堂| 欧美黄色图片| 少妇色欲综合网2| AVE乱伦| 色综合色欲色综合色综合色综合| 天天综合日韩网| 国产久久日| 另类欧美色| 亚洲欧美一区二区网址| 乱伦av.com| 精品熟女一区=区三区| 精品人妻一二三四区视频| 国产传媒日韩| 国产亚洲日韩欧| 自偷自拍的亚洲视频| 宅男91视频在线播放| 亚洲欧洲第二视频在线观看色图| 亚洲少妇综合| 26uuu国产亚洲综合| 日本三级韩三级99久久| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 影音先锋日本一区二区| 很黄很色的视频在线观看| julia高潮后不停追击中出| 亚洲国产一级中文综合久久天堂在线免费观看 | 美女自卫慰黄网站免费| 久久超碰免费的| 亚洲天在线| 正在播放国产精品一区| 欧州色图区| 成人一级二级| 在线观看无码三级少妇| 夂久色| 综合一区二区影视| 午夜国产成人精品视频| 色爱综合网| 成人精品视频| 在线中文字幕| 玖色AV| 蜜臀在线看片| 免费啪啪av| 天天干天天日天天射黄色| 日韩欧美偷拍美女视频| 欧美春色| 操逼逼无码| 中美日韩毛片| 一区二区三区高清 | 人人操天天爽| 丁香五月色情| A一级色女| 欧美性爱日韩高清| 大香樵伊人网| 91美女国产在线| 亚洲精品国产无码高清| 中文字幕二区日韩天堂 | 亚洲色图欧美激情| 精品国产91内射久久| 91大神电影天堂| 5252色欧美在线男人的天堂| 在线强奷到舒服的无码视频| 日日夜夜青青草母狗| 狠狠色噜噜狠狠狠狠2018| 操少妇很爽av| 一起草视频在线| 无码国产精品午夜不卡(| 97视频在线观看网站| 中文精品一区二去| 熟女日韩| 亚洲91在线| 极品色社| 天堂成人网| 国产成人免费观看在线视频| 青女在线| 欧美成人四级在线播放| 久久久av爱| 国产无码精品无码| 欧美制服网站美腿丝袜| 亚洲欧美天堂| 一区二区三区四区色图| 精品美女少妇一区二区| 在线v中文字幕一区二区三区| 国产欧美日产一区二区三区 - 国产欧美日| 亚洲密乳AV| 日韩传媒在线| 色哟哟 日韩精品| 91久久午夜无码鲁丝片久久人妻| 日本成a人v网站在线观看| 96AV精品| 一区二区三| 嗯嗯啊啊操死我| yiqicaoav| 蜜桃臀 后入 一区 二区 三区 在线| 美女诱惑一区| 怡红院怡春院| 99精品国产户外露出| 97内射偷拍| 黄色大片免费在线| 亚洲男人的天堂网| 大香蕉强奸乱伦| 蜜桃精品一区二区三区久在线| 岛国在线一区二区三区| 欧美特黄视频网站| JULIA一区二区三区在线播放| 9 1超碰九色| 婷婷久月| 欧美中文字幕精品人妻| 五月天色图影视| 久久久久九九九九| 黄色污污污污污污网站| 欧美gv在线观看| 9热9热综合网| 亚洲图片日本AⅤ欧美在线| 99热精品国产| 欧美日韩 强奸乱伦| 欧美综色欧| 久久精品欧美一区蜜桃| 久久精品人人做人人看|