99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

AI對(duì)話流式輸出實(shí)戰(zhàn):SSE傳輸、Markdown增量渲染與Nginx配置

AI對(duì)話流式輸出實(shí)戰(zhàn):SSE傳輸、Markdown增量渲染與Nginx配置 1. 從逐字蹦出的觀感說起打字機(jī)效果到底難在哪第一次做 AI 對(duì)話界面的人幾乎都會(huì)卡在同一個(gè)地方后端明明已經(jīng)把整段回答生成好了前端卻只能等全部?jī)?nèi)容返回后一次性渲染出來用戶盯著空白屏幕轉(zhuǎn)圈十幾秒體驗(yàn)非常糟糕。而市面上那些成熟的對(duì)話產(chǎn)品回答是一個(gè)字一個(gè)字往外蹦的像老式打字機(jī)一樣這種觀感背后其實(shí)是一整套從傳輸協(xié)議到渲染層的配合。我最早做這塊的時(shí)候也走過彎路一開始想的是前端定時(shí)器模擬把整段文本切片后按固定間隔塞進(jìn) DOM。這個(gè)方案在演示階段看著還行真上線就露餡了模型生成速度是不均勻的遇到長(zhǎng)回答時(shí)前端演的速度和真實(shí)生成速度對(duì)不上用戶刷新頁面就全丟了而且首字延遲一點(diǎn)沒改善。后來才轉(zhuǎn)向真正的流式方案也就是讓數(shù)據(jù)在生成過程中就持續(xù)推給前端。這套東西拆開來看是三層傳輸層負(fù)責(zé)把服務(wù)端生成的內(nèi)容實(shí)時(shí)送到瀏覽器主流做法是 SSE渲染層負(fù)責(zé)把不斷追加的 Markdown 文本正確顯示出來涉及增量解析和未閉合標(biāo)簽處理網(wǎng)關(guān)層負(fù)責(zé)讓流式數(shù)據(jù)穿過 Nginx 這類反向代理時(shí)不被緩沖、不被超時(shí)切斷。三層里任何一層出問題用戶看到的就是卡住不動(dòng)或者內(nèi)容粘連成一坨。這篇文章面向的是正在做或準(zhǔn)備做 AI 對(duì)話界面的開發(fā)者不管你用的是 Vue、React 還是原生 JS不管你后端是 Java、Python 還是 Node這套思路都是通用的。我會(huì)把 SSE 的協(xié)議細(xì)節(jié)、Markdown 增量渲染的坑、Nginx 的關(guān)鍵配置逐層拆開講并且給出可以直接抄的配置和代碼。讀完你應(yīng)該能獨(dú)立搭出一套穩(wěn)定的流式對(duì)話鏈路并且知道每個(gè)參數(shù)為什么這么設(shè)。2. SSE 流式傳輸為什么是它而不是 WebSocket 或輪詢2.1 三種方案的取舍邏輯做流式推送擺在面前的選擇其實(shí)就三個(gè)短輪詢、WebSocket、SSE。短輪詢是最笨但最省事的前端每隔一秒發(fā)一次請(qǐng)求問生成完了嗎服務(wù)端返回當(dāng)前進(jìn)度。它的致命問題是延遲和資源浪費(fèi)一秒的間隔意味著首字延遲至少一秒而且每次請(qǐng)求都要重新建立連接、攜帶完整上下文服務(wù)端壓力隨用戶數(shù)線性上漲。我實(shí)測(cè)過一個(gè)兩百人同時(shí)在線的場(chǎng)景輪詢方案下 QPS 直接飆到四百多純屬浪費(fèi)。WebSocket 是雙向全雙工能力最強(qiáng)但它對(duì) AI 對(duì)話來說屬于殺雞用牛刀。對(duì)話場(chǎng)景的數(shù)據(jù)流向是單向的服務(wù)端推、客戶端收。用 WebSocket 你得自己定義消息格式、自己做心跳?;睢⒆约禾幚碇剡B而且很多網(wǎng)關(guān)和負(fù)載均衡對(duì) WebSocket 的支持需要額外配置。更麻煩的是WebSocket 連接是有狀態(tài)的水平擴(kuò)展時(shí)需要考慮會(huì)話粘滯運(yùn)維復(fù)雜度上一個(gè)臺(tái)階。SSE 恰好卡在中間它基于普通 HTTP單向服務(wù)端推送瀏覽器原生支持EventSource斷線自動(dòng)重連穿過 Nginx 只需要改幾個(gè)配置。對(duì)于服務(wù)端持續(xù)推文本給前端這個(gè)需求它是成本最低、最貼合的選擇。這也是為什么主流大模型 API 的流式接口幾乎清一色用 SSE。方案首字延遲服務(wù)端壓力雙向能力網(wǎng)關(guān)友好度適用場(chǎng)景短輪詢高等于輪詢間隔高無極好兼容性兜底WebSocket低低強(qiáng)一般雙向?qū)崟r(shí)交互SSE低低單向好服務(wù)端單向推送2.2 SSE 協(xié)議格式那些必須記死的細(xì)節(jié)SSE 的報(bào)文格式看著簡(jiǎn)單但有幾個(gè)細(xì)節(jié)不搞清楚就會(huì)踩坑。它的響應(yīng)頭必須是Content-Type: text/event-stream并且要帶上Cache-Control: no-cache和Connection: keep-alive。數(shù)據(jù)體的格式是純文本每條消息由若干字段行組成字段和值之間用冒號(hào)加空格分隔消息之間用空行分隔。data: 你好 data: 世界 data: 第二段消息上面這段里第一個(gè)消息塊的兩行data會(huì)被拼接成你好\n世界然后遇到空行觸發(fā)一次message事件。注意data:后面如果只有一個(gè)空格那個(gè)空格是分隔符不算內(nèi)容如果內(nèi)容本身以空格開頭需要寫兩個(gè)空格。這個(gè)細(xì)節(jié)很多人第一次寫會(huì)搞錯(cuò)導(dǎo)致輸出莫名其妙多一個(gè)空格。除了data還有幾個(gè)字段值得知道event用來指定事件類型默認(rèn)是messageid用來標(biāo)記消息序號(hào)斷線重連時(shí)瀏覽器會(huì)通過Last-Event-ID請(qǐng)求頭帶上最后收到的 id服務(wù)端可以據(jù)此續(xù)傳retry用來指定重連間隔毫秒數(shù)。對(duì)于 AI 對(duì)話id字段其實(shí)很有用配合服務(wù)端的會(huì)話狀態(tài)可以實(shí)現(xiàn)斷點(diǎn)續(xù)傳不過大多數(shù)場(chǎng)景下前端直接重新發(fā)起一次請(qǐng)求更簡(jiǎn)單。2.3 為什么原生 EventSource 常常不夠用瀏覽器原生的EventSource用起來很省心但它有兩個(gè)硬傷。第一它只支持 GET 請(qǐng)求沒法帶請(qǐng)求體。AI 對(duì)話的 prompt 往往很長(zhǎng)塞進(jìn) URL 查詢參數(shù)既不優(yōu)雅也可能超長(zhǎng)。第二它不能自定義請(qǐng)求頭沒法帶認(rèn)證 token只能靠 Cookie 或者把 token 塞 URL 里安全性差。所以實(shí)際項(xiàng)目里更常見的是用fetch配合ReadableStream手動(dòng)解析 SSE或者用microsoft/fetch-event-source這個(gè)庫。后者封裝了重連、事件解析、AbortController 取消等邏輯用起來比手寫省心。手寫的話核心就是拿到response.body.getReader()然后循環(huán)read()把拿到的Uint8Array用TextDecoder解碼再按\n\n切分消息塊。async function streamChat(prompt, onChunk, signal) { const resp await fetch(/api/chat, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ prompt, stream: true }), signal }); const reader resp.body.getReader(); const decoder new TextDecoder(utf-8); let buffer ; while (true) { const { done, value } await reader.read(); if (done) break; buffer decoder.decode(value, { stream: true }); const parts buffer.split(\n\n); buffer parts.pop(); // 最后一段可能不完整留到下次 for (const part of parts) { const line part.trim(); if (!line.startsWith(data:)) continue; const payload line.slice(5).trim(); if (payload [DONE]) return; onChunk(payload); } } }這里有個(gè)關(guān)鍵點(diǎn)decoder.decode(value, { stream: true })的stream: true參數(shù)不能省。因?yàn)橐粋€(gè) UTF-8 中文字符占三個(gè)字節(jié)網(wǎng)絡(luò)分片很可能把一個(gè)字符切成兩半不加這個(gè)參數(shù)就會(huì)解碼出亂碼。同理buffer的保留邏輯也不能省因?yàn)橐粋€(gè) SSE 消息塊可能被網(wǎng)絡(luò)分片切斷必須等下一片到了再拼起來解析。提示判斷流結(jié)束不要只看done很多服務(wù)端會(huì)在最后發(fā)一條data: [DONE]作為結(jié)束標(biāo)記前端收到后應(yīng)主動(dòng)關(guān)閉連接避免連接懸掛。3. Markdown 增量渲染未閉合標(biāo)簽才是真正的坑3.1 為什么不能每來一段就整體重渲染最樸素的做法是每收到一個(gè) chunk就把累積的全文丟給 Markdown 解析器重新渲染一遍。這個(gè)方案在短回答下沒問題但回答一長(zhǎng)就崩了。假設(shè)回答最終有 3000 字分 300 個(gè) chunk 到達(dá)那么總解析量是 12...300 個(gè) chunk 的文本量接近 45000 個(gè) chunk 的解析開銷而且每次都要重建整個(gè) DOM瀏覽器主線程會(huì)被打滿滾動(dòng)會(huì)卡頓輸入框會(huì)掉幀。正確的做法是增量渲染已經(jīng)渲染完成的部分不再動(dòng)只處理新增的內(nèi)容。但這里有個(gè)矛盾Markdown 是上下文相關(guān)的語法一個(gè)**加粗標(biāo)記可能跨 chunk一個(gè)代碼塊可能剛開始還沒閉合你不能簡(jiǎn)單地把新 chunk 直接 append 到 DOM 里。我的處理策略是分段提交維護(hù)一個(gè)未提交緩沖區(qū)每次新內(nèi)容進(jìn)來后追加到緩沖區(qū)然后嘗試解析。解析時(shí)只把確定完整的部分提交到已渲染區(qū)剩下的留在緩沖區(qū)等下次。判斷確定完整的規(guī)則是以空行段落邊界為切分點(diǎn)最后一個(gè)空行之前的內(nèi)容視為完整段落可以提交最后一個(gè)空行之后的內(nèi)容留在緩沖區(qū)。3.2 未閉合語法的處理清單即便按段落切分仍然會(huì)遇到各種未閉合的情況。下面這張表是我在實(shí)際項(xiàng)目里總結(jié)的常見場(chǎng)景和處理方式。未閉合場(chǎng)景表現(xiàn)處理方式加粗**只出現(xiàn)一個(gè)后續(xù)文字全變粗緩沖區(qū)檢測(cè)到奇數(shù)個(gè)**則不提交該段行內(nèi)代碼未閉合后續(xù)文字變代碼樣式同上檢測(cè)反引號(hào)配對(duì)代碼塊 未閉合后續(xù)全部進(jìn)代碼塊檢測(cè) 出現(xiàn)次數(shù)奇數(shù)則整段掛起鏈接[text](未閉合顯示原始文本檢測(cè)括號(hào)配對(duì)未閉合則掛起表格分隔行未到表格渲染成普通文本檢測(cè)到 列表項(xiàng)跨 chunk列表斷裂以空行為界列表項(xiàng)通常在同一段內(nèi)代碼塊是最麻煩的因?yàn)樗膬?nèi)容可能很長(zhǎng)如果一直等閉合用戶會(huì)看到代碼區(qū)遲遲不出現(xiàn)。我的做法是檢測(cè)到 開始后即使未閉合也先渲染成一個(gè)代碼塊容器只是標(biāo)記為進(jìn)行中等閉合后再補(bǔ)上語言高亮。這樣用戶至少能看到代碼在逐行出現(xiàn)而不是一片空白。3.3 一個(gè)可用的增量渲染實(shí)現(xiàn)下面這段邏輯是我在 Vue 項(xiàng)目里用的簡(jiǎn)化版核心思路是緩沖區(qū) 完整性檢測(cè) 分段提交。class MarkdownStreamRenderer { constructor(container) { this.container container; this.committed ; // 已提交渲染的文本 this.buffer ; // 待提交緩沖區(qū) } push(chunk) { this.buffer chunk; const { safe, rest } this.splitSafe(this.buffer); if (safe) { this.committed safe; this.buffer rest; this.render(); } } // 找到最后一個(gè)可安全提交的邊界 splitSafe(text) { // 優(yōu)先以空行切分 const idx text.lastIndexOf(\n\n); if (idx -1) return { safe: , rest: text }; const candidate text.slice(0, idx 2); const rest text.slice(idx 2); // 檢查候選區(qū)是否有未閉合語法 if (this.hasUnclosed(candidate)) { return { safe: , rest: text }; } return { safe: candidate, rest }; } hasUnclosed(text) { const fences (text.match(//g) || []).length; if (fences % 2 ! 0) return true; const bolds (text.match(/\*\*/g) || []).length; if (bolds % 2 ! 0) return true; return false; } render() { // 已提交部分整體渲染緩沖區(qū)部分作為預(yù)覽追加 this.container.innerHTML marked.parse(this.committed) (this.buffer ? div classstreaming${escapeHtml(this.buffer)}/div : ); } }這個(gè)實(shí)現(xiàn)有個(gè)取舍已提交部分每次都是整體重渲染。如果回答特別長(zhǎng)比如上萬字整體重渲染仍然有開銷。進(jìn)一步優(yōu)化可以只渲染新增的 safe 部分并 append 到容器但那樣需要處理跨段落的列表、引用等結(jié)構(gòu)復(fù)雜度會(huì)上升。對(duì)于絕大多數(shù)對(duì)話場(chǎng)景回答長(zhǎng)度在幾千字以內(nèi)整體重渲染完全夠用實(shí)測(cè)下來很穩(wěn)。注意緩沖區(qū)里的內(nèi)容用escapeHtml轉(zhuǎn)義后顯示不要直接丟給 Markdown 解析器否則未閉合的語法會(huì)污染整個(gè)渲染結(jié)果。3.4 換行和空格的顯示問題Markdown 有個(gè)反直覺的規(guī)則單個(gè)換行符在渲染時(shí)會(huì)被當(dāng)成空格只有空行才產(chǎn)生新段落。但 AI 生成的文本經(jīng)常用單換行來分行比如列舉要點(diǎn)時(shí)。如果嚴(yán)格按標(biāo)準(zhǔn) Markdown 渲染用戶看到的會(huì)是一大坨擠在一起的文字。解決辦法是開啟軟換行轉(zhuǎn)硬換行也就是把單個(gè)\n渲染成br。marked有breaks: true選項(xiàng)markdown-it有breaks: true開啟后單換行就會(huì)斷行。這個(gè)選項(xiàng)對(duì) AI 對(duì)話場(chǎng)景幾乎是必開的否則排版會(huì)很難看。但要注意開了之后代碼塊內(nèi)的換行不受影響因?yàn)榇a塊是獨(dú)立解析的。另一個(gè)常見問題是連續(xù)空格被折疊。HTML 默認(rèn)會(huì)把多個(gè)空格合并成一個(gè)如果 AI 輸出里有對(duì)齊用的空格比如 ASCII 圖就會(huì)錯(cuò)位。這種情況需要用white-space: pre-wrap或者把內(nèi)容包在代碼塊里。我的經(jīng)驗(yàn)是凡是涉及對(duì)齊的內(nèi)容都建議 AI 用代碼塊輸出前端就不用操心了。4. Nginx 反向代理流式數(shù)據(jù)為什么會(huì)被粘住4.1 緩沖才是流式最大的敵人本地開發(fā)時(shí)流式效果好好的一部署到線上就變成等半天然后一次性全出來十有八九是 Nginx 的緩沖在作怪。Nginx 作為反向代理默認(rèn)會(huì)把上游響應(yīng)先緩沖到自己的緩沖區(qū)攢夠一定大小或者上游關(guān)閉連接后才轉(zhuǎn)發(fā)給客戶端。這個(gè)設(shè)計(jì)對(duì)普通請(qǐng)求是優(yōu)化對(duì) SSE 就是災(zāi)難因?yàn)?SSE 的特點(diǎn)就是小包、持續(xù)、長(zhǎng)時(shí)間不關(guān)閉正好觸發(fā)緩沖。要關(guān)掉緩沖核心是proxy_buffering off。但光這一條還不夠還有幾個(gè)相關(guān)配置需要一起改。下面是我在生產(chǎn)環(huán)境用的配置片段。location /api/chat { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 關(guān)閉緩沖讓數(shù)據(jù)實(shí)時(shí)透?jìng)?proxy_buffering off; proxy_cache off; chunked_transfer_encoding on; # 關(guān)閉分塊響應(yīng)緩沖 proxy_set_header X-Accel-Buffering no; # 超時(shí)設(shè)置SSE 連接可能持續(xù)很久 proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_connect_timeout 60s; }逐條解釋一下為什么這么設(shè)。proxy_http_version 1.1是必須的因?yàn)?HTTP/1.0 不支持分塊傳輸SSE 就沒法流式。proxy_set_header Connection 是為了清掉默認(rèn)的Connection: close保持長(zhǎng)連接。proxy_buffering off是核心關(guān)掉響應(yīng)緩沖。X-Accel-Buffering no這個(gè)響應(yīng)頭是給 Nginx 看的即使全局開了緩沖這個(gè)頭也能讓 Nginx 對(duì)當(dāng)前響應(yīng)禁用緩沖雙保險(xiǎn)。4.2 超時(shí)參數(shù)那個(gè)讓人抓狂的 idle timeout熱詞里有個(gè)報(bào)錯(cuò)很典型stream disconnected before completion: idle timeout waiting for sse。這個(gè)錯(cuò)誤的根源就是超時(shí)。SSE 連接建立后如果模型思考時(shí)間較長(zhǎng)比如推理模型要思考十幾秒這段時(shí)間內(nèi)沒有數(shù)據(jù)推送Nginx 的proxy_read_timeout一到就會(huì)切斷連接前端就報(bào)這個(gè)錯(cuò)。proxy_read_timeout默認(rèn)是 60 秒對(duì)于普通請(qǐng)求夠用對(duì)于 SSE 太短。我一般設(shè)成 300 秒甚至更長(zhǎng)具體看業(yè)務(wù)場(chǎng)景。但要注意這個(gè)值不能無限大因?yàn)槿绻蛻舳水惓嚅_而服務(wù)端沒感知連接會(huì)一直掛著占資源。合理的做法是配合心跳服務(wù)端每隔 15 到 30 秒發(fā)一個(gè)注釋行以冒號(hào)開頭的行如: keepalive既能讓 Nginx 知道連接活躍也能讓前端知道連接沒斷。# 全局或 server 塊中 proxy_read_timeout 300s; proxy_send_timeout 300s; # 如果用了 upstream還要注意 keepalive upstream backend { server 127.0.0.1:8080; keepalive 32; }心跳這個(gè)機(jī)制值得單獨(dú)說。SSE 協(xié)議里以冒號(hào)開頭的行是注釋會(huì)被瀏覽器忽略但會(huì)重置超時(shí)計(jì)時(shí)器。所以服務(wù)端在等待模型輸出的間隙定時(shí)發(fā)一個(gè):\n\n就能有效防止 idle timeout。這個(gè)技巧在推理模型場(chǎng)景下幾乎是必備的因?yàn)橥评砟P偷乃伎茧A段可能長(zhǎng)達(dá)幾十秒沒有任何輸出。4.3 負(fù)載均衡和壓縮的坑如果后端是多實(shí)例部署前面掛了負(fù)載均衡SSE 會(huì)遇到會(huì)話粘滯問題。因?yàn)橐淮螌?duì)話的流式響應(yīng)必須由同一個(gè)后端實(shí)例處理如果請(qǐng)求被輪詢到不同實(shí)例上下文就對(duì)不上了。解決辦法是在負(fù)載均衡層配置基于 Cookie 或者基于客戶端 IP 的粘滯會(huì)話。Nginx 的ip_hash是最簡(jiǎn)單的方案但在 NAT 環(huán)境下會(huì)導(dǎo)致負(fù)載不均更好的做法是用sticky模塊或者在上層用一致性哈希。另一個(gè)坑是 gzip 壓縮。Nginx 默認(rèn)可能對(duì)text/event-stream開啟 gzip壓縮會(huì)引入緩沖破壞流式效果。雖然text/event-stream通常不在默認(rèn)的 gzip 類型列表里但如果你手動(dòng)配了gzip_types包含它就要小心。我的建議是明確排除或者在 SSE 的 location 里直接gzip off。location /api/chat { gzip off; # ... 其他配置 }還有proxy_request_buffering這個(gè)是緩沖請(qǐng)求體的對(duì) SSE 響應(yīng)沒影響但如果你的 prompt 很大關(guān)掉它可以減少首字延遲。不過關(guān)掉后請(qǐng)求體會(huì)直接透?jìng)鹘o后端后端要能處理流式請(qǐng)求體一般場(chǎng)景下保持默認(rèn)即可。5. 前后端配合的完整鏈路與實(shí)測(cè)經(jīng)驗(yàn)5.1 服務(wù)端怎么把內(nèi)容推出來后端這塊不同語言的寫法差異很大但核心都是拿到模型返回的流逐塊轉(zhuǎn)發(fā)給客戶端。以 Java 為例如果用 Spring 的SseEmitter要注意它默認(rèn)會(huì)在一個(gè)線程里同步發(fā)送如果模型返回慢會(huì)阻塞。更好的做法是用WebFlux的FluxServerSentEvent天然支持背壓和異步。Python 的話FastAPI 的StreamingResponse配合生成器函數(shù)是最順手的。關(guān)鍵點(diǎn)是生成器里要yield出符合 SSE 格式的字符串并且設(shè)置正確的響應(yīng)頭。from fastapi import FastAPI from fastapi.responses import StreamingResponse app FastAPI() async def event_generator(prompt: str): async for chunk in call_llm_stream(prompt): # 注意chunk 里如果有換行要拆成多個(gè) data 行 for line in chunk.split(\n): yield fdata: {line}\n yield \n yield data: [DONE]\n\n app.post(/api/chat) async def chat(prompt: str): return StreamingResponse( event_generator(prompt), media_typetext/event-stream, headers{ Cache-Control: no-cache, X-Accel-Buffering: no, } )這里有個(gè)細(xì)節(jié)如果 chunk 內(nèi)容里包含換行符直接yield fdata: {chunk}\n\n會(huì)導(dǎo)致 SSE 解析錯(cuò)亂因?yàn)閾Q行會(huì)被當(dāng)成消息分隔。正確做法是把內(nèi)容里的換行拆開每行單獨(dú)加data:前綴。上面代碼里的for line in chunk.split(\n)就是干這個(gè)的。5.2 前端渲染的性能優(yōu)化前端這塊除了前面說的增量渲染還有幾個(gè)性能點(diǎn)值得注意。第一是滾動(dòng)跟隨新內(nèi)容進(jìn)來時(shí)如果用戶沒有手動(dòng)上滑應(yīng)該自動(dòng)滾到底部如果用戶上滑了就不要強(qiáng)制拉回否則用戶沒法回看。判斷邏輯是檢測(cè)滾動(dòng)條是否在底部附近比如距底部小于 50px。第二是節(jié)流渲染如果 chunk 到達(dá)頻率很高比如每秒幾十個(gè)每個(gè) chunk 都觸發(fā)一次渲染會(huì)導(dǎo)致頻繁重排??梢杂胷equestAnimationFrame做節(jié)流把一幀內(nèi)的多個(gè) chunk 合并成一次渲染。let pending false; function scheduleRender() { if (pending) return; pending true; requestAnimationFrame(() { renderer.render(); pending false; }); }第三是代碼高亮的延遲代碼塊在流式過程中不斷變化如果每次都重新高亮開銷很大。我的做法是流式過程中代碼塊用純文本顯示等整個(gè)回答結(jié)束后再統(tǒng)一做一次高亮。這樣用戶看到的是代碼在逐行出現(xiàn)結(jié)束后瞬間變成彩色體驗(yàn)上反而更自然。5.3 那些只有踩過才知道的坑說幾個(gè)我在實(shí)際項(xiàng)目里踩過的坑都是文檔里不會(huì)寫的。第一個(gè)是中文亂碼。前面提過TextDecoder的stream: true但還有一個(gè)隱蔽的點(diǎn)如果服務(wù)端在yield時(shí)把中文字符按字節(jié)切開了前端解碼就會(huì)出問題。Java 的OutputStream寫入時(shí)如果沒指定 UTF-8 編碼默認(rèn)用平臺(tái)編碼在 Windows 上就是 GBK前端按 UTF-8 解碼必然亂碼。所以服務(wù)端一定要顯式指定response.setCharacterEncoding(UTF-8)。第二個(gè)是代理層的自動(dòng)重試。有些云廠商的負(fù)載均衡或者 API 網(wǎng)關(guān)會(huì)對(duì)失敗的請(qǐng)求自動(dòng)重試但 SSE 是長(zhǎng)連接重試會(huì)導(dǎo)致重復(fù)請(qǐng)求用戶看到回答重復(fù)。解決辦法是在請(qǐng)求頭里加一個(gè)唯一標(biāo)識(shí)服務(wù)端做冪等處理或者在網(wǎng)關(guān)層關(guān)掉自動(dòng)重試。第三個(gè)是瀏覽器連接數(shù)限制。HTTP/1.1 下同一域名最多 6 個(gè)并發(fā)連接。如果用戶開了多個(gè)標(biāo)簽頁都在對(duì)話加上頁面其他請(qǐng)求很容易把連接數(shù)占滿導(dǎo)致新請(qǐng)求排隊(duì)。解決辦法是升級(jí)到 HTTP/2多路復(fù)用不受這個(gè)限制。Nginx 配 HTTP/2 需要 HTTPS本地開發(fā)可以用自簽名證書。第四個(gè)是移動(dòng)端后臺(tái)斷連。手機(jī)瀏覽器切到后臺(tái)后SSE 連接可能被系統(tǒng)掛起或斷開。前端要監(jiān)聽visibilitychange事件切回前臺(tái)時(shí)檢查連接狀態(tài)斷了就重新發(fā)起。但重新發(fā)起意味著要重新生成所以更好的做法是服務(wù)端支持基于Last-Event-ID的續(xù)傳把已生成的部分緩存起來。5.4 一套可復(fù)用的檢查清單最后給一份排查清單遇到流式不工作時(shí)按順序查。檢查項(xiàng)預(yù)期值常見錯(cuò)誤響應(yīng) Content-Typetext/event-stream寫成 application/jsonNginx proxy_bufferingoff默認(rèn) on 導(dǎo)致攢包Nginx proxy_read_timeout大于最長(zhǎng)思考時(shí)間默認(rèn) 60s 導(dǎo)致 idle timeout服務(wù)端編碼UTF-8平臺(tái)默認(rèn)編碼導(dǎo)致亂碼前端解碼TextDecoder stream:true漏參數(shù)導(dǎo)致中文亂碼消息分隔空行 \n\n用單換行導(dǎo)致消息粘連結(jié)束標(biāo)記data: [DONE]不發(fā)送導(dǎo)致連接懸掛心跳15-30s 一次注釋行不發(fā)導(dǎo)致代理超時(shí)斷連這套鏈路我從最早的輪詢方案一路迭代過來中間踩的坑基本都在這了。SSE 本身不復(fù)雜復(fù)雜的是它要穿過瀏覽器、網(wǎng)關(guān)、負(fù)載均衡、后端框架這一整條鏈路每一層都有自己的默認(rèn)行為而這些默認(rèn)行為往往和流式的需求相沖突。理解了每一層為什么這么設(shè)計(jì)配置起來就不會(huì)是照抄而是知道改哪個(gè)參數(shù)、為什么改。代碼高亮延遲處理那個(gè)技巧是我在一個(gè)長(zhǎng)代碼回答場(chǎng)景下被用戶投訴代碼一直在閃之后才加上的效果立竿見影。如果你也在做類似的東西建議一開始就把這個(gè)策略定下來省得后面返工。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天综合精品| www.99热国产| 色婷婷8| 综合五月天完整| 91ncm视频| 91丨九色丨大屁股| 久久看婷婷| 色日本丁香婷婷| 九九99九九精品视频| 九九九九综合| av性爱网站| 五月丁香色色网| 在线看片h站| 日本一级| 欧美综合激情丁香五月六月婷| 九九热黄色| 五月婷婷电影院| 九色视频91疯狂| 丁香婷婷久久老熟女综合网| 亚洲色婷婷色| 99久久亚洲精品视频| 91精品91久久久久77777| 欧美精品99久久久| 日韩高清成人| 亚洲五月天另类小说图片| 欧美99热| 欧美99热| 成人婷婷五月天| 情色婷婷五月天| 五月天大香蕉婷| 激情丁香五月| 99久视频| 久久HD| www.婷婷| 激情九九六月激情免费视频| 开心五月深爱五月| 色五月播五月| 欧美性色视频| 婷婷在线激情| 无码99| 久久综合天天综合| 开心综合激情综合| A A色色| 精品久久久人妻| 99热日本| 人人干AV| 欧美97p| 色色99色色| 激情性爱五月天| 色综合香蕉视频| 久热视频97AV在线观看| 欧美日韩一区二区三区四区| 99综合入口| 精品一二三区久久AAA片| 色色色色色色色色综合网| 成人丁香五月天Av| 婷婷久久网| 女人天堂久久| 久色五月丁香视频| 成人欧美日韩| 欧洲亚洲精品| 日韩精品AV一区二区三区| 婷婷天天日婷婷| 99热99在线| 99色综合| 亚洲天堂色色| 久久小说网| 天天干一干| 五月丁香色情| 成人性爱无码| 丁香五月婷婷五月| 婷婷综合五月| 精品久久穴| 粉嫩AV久久一区二区三区| 色综合天天| 久久人妻视频| 99久| 久久精品4| 婷婷激情在线| 第二色AⅤ| 六月香五月婷| 激情六月色| 五月丁香啪啪网| 五月丁香六月色| 高清不卡一区| 超碰狠狠干99| 操逼三区| 色婷婷视频| 秋霞簧片| 99热在线观看| 乱岳熟女50岁| 97色婷婷在线观看| 千人斩操逼| 五月综合六月婷婷| 99久久综合网| 久久丁香网| www.刺激色网站www.| 99热免费精品| 色播婷婷五月天| 人人视频人人干人人做| 成人视频网| 久久九九思思| 99热综合| 天天色天天爱天天爱天天爱y| 天天干天天拍| AA片在线观看视频在线播放| 9有码中文| 99er6免费视频热播| 五月丁香拍拍激情综合| 欧美五月婷婷| www,999日本色| www.九月婷婷丁香.com| 99热这里只有精品10| 激情五月婷在线精品| 婷婷五月色播| 国产毛片操B| 色婷婷先锋| 国产色色在线| 狠狠爱五月婷婷| 婷婷五月天成人网| 91九色中文| 色频玖玖五月天| 996热re视频精品视频这里| 日本九九网| WWW.桔色成人.COM| 婷婷五月丁香综合| 青草青青草| 婷婷五月天成人网| 91色吧网| 5月婷婷激情网| 五月天婷婷久久| 色久五月天| 色婷婷www| 亚洲三A| 国产性爱一级| 思思 热 99| 很很干天天干| 五月伊人网| 丁香五月开心婷婷| 六月成人网| 激情五月婷| 五月丁香五月天现场视频| 久久婷婷影院| 色天堂A| 这里只有精品视频一区| 噼里啪啦完整版中文在线观看 | 爱久综合| www.久久综合| 伊人五月天97| 永久地址 色| 狠狠狠狠狠狠狠狠| 中美日韩成人在线| 中文成人在线| 玖玖婷婷色五月| 丁香五月天激情小说| 丁香五月色情| 国产精品大香蕉| 九九婷婷五月天| 4399无码视频| 亚洲婷婷激情888精品久| 激情五月天在线视频| 97AV人人插人人操| 五月亭亭六月天| 99ER热精品视频| 日韩成人电影AV| 五月丁香免费看| 九九婷婷五月天| 天天射夜夜爽| 少妇被躁爽到高潮无码文| 丁香九月激情| 91综合在线| www久| jizzdr| 丁香五月婷婷啪啪视频| 99免费视频网| 另类丁香综合| 日韩人妻无码精品| 丁香六月婷婷综情欧美| 99久久婷婷国产综合精品草原| 成人AV在线网站| 久久人人九| 久久日韩婷婷五月| 色五月婷婷在线| 久久久久98| 亚洲va欧美va天堂v国产综合| 碰碰人人人| 久久机热这里只有精品| 亚洲成人无码片| 五月丁香天堂网| 色婷婷亚洲综合网站| 六月婷婷亚洲| 涩涩婷婷五月| 天天色宗合| 99思思在线视频| 婷婷五月天社区| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 久热这里只有| 天天色图| 国产精品一区在线观看你懂的| 人妻久久久久久久久妻久久久久久久久| 五月婷婷激情| 亭亭五月激情亚洲在线| 在线超碰91| 色无码| 玖玖爱导航| 久久这里只有精品99| 色久99| 天天综合色| 91精品婷婷国产综合久久| 综合婷婷| 99热在线这里只有精品| 97久久五月丁香婷婷| 色婷婷电影网| 五月丁香婷婷开心| 1024亚洲| 国产精品一区在线观看你懂的| 色婷婷色情| 九九艹女| AV在线大香蕉| 狠狠操在线视频| 亚洲天堂碰碰婷婷| 综合久久99| 大波美女VA网站| 婷婷色色欧美综合网| 激情5月婷婷| 亚洲性视频| 色色色成人网| 停停五月丁香| 99色综合网| 婷婷色色五月天| 日本五月视频| 热99这里只是精品| 东京热人妻一区二区三区在线| 日本三久久| 欧美丁香婷婷天天操| 韩国中文字幕91| 五月天婷婷丁香| 婷婷色啪| 岛国在线观看91| 激情五月婷婷网| 天天久久狠狠色综合| 中文字幕丰满孑伦无码专区| 伊人www22综合色| 九九综合色综合| 婷婷丁香九月| 中文字幕乱轮| 一本道综合网| 成人五月天综合网| 啪啪夜久久| 欧美韩国日本| 99色色| 午夜丁香六月婷| 亚洲超级碰| 亭亭五月丁香五月天激情| 丁香五月婷在线观看| 我爱大香蕉| 毛片蕉地一二| 热婷婷久| 91碰操| 99热精品在线观看| 五月天.com| 色偷偷五月天| 天天爽综合网| 久久婷婷一级片| 99超级碰碰| 综合色图婷婷| 99精品偷自拍| 五月激情啪啪| 久久激情网| 五月天 另类图片| 丁香五月天天哦| 色色影院黄大片| 97在线观视频免费观看| 婷婷五月激情综合| 人妻久久久久久久| 色综合久久综合中文综合网| 9九色首页| 五月婷婷丁香六月在线| 热99久久这里只有精品| 丁香六月视频| 婷婷丁香五月亚洲欧美| 丁香五月婷婷啪啪| 黄色三级日本| 婷婷五月天成人| 婷婷精品在线| 九色PORNY9l原创自拍| 五月丁香网站| 日韩欧美颜射| 久婷婷五月激情| 色狠狠五月天| 色国产五月| 人人人人人人人人人草| 激情 婷婷 丁香五月天| 狠狠撸激情综合丁香五月天俺来啦| 九九一综合精品| 天天拍夜夜爽日日| 337午夜福利| 另类激情五月| 九九婷婷五月天| 噜噜精品| 婷婷色网站| 97色婷| 色婷婷色99国产综合精品| 亚洲色图81p| 99热狠狠操| 九色 在线| www.五月婷婷.com| 伊人五月天男人的天堂在线| 日韩AAA| 丁香5月婷婷| 天天五月情| 99re8在这里只有精品| 婷婷五月综合体验看| 五月丁香色婷婷久久| 综合久久综合久久| 欧美叉叉叉BBB网站| 激情五月四色| 99干日本| 蜜乳国产网站| AV成人在线播放| 99在线观看| 天天干一干| 丁香色婷婷色手机免费在线| 五月开心久久| 色婷婷在线视频久| 狠狠操狠狠插| 色99色| 97色伦另类图片小说视频 | 超碰操网| 无码少妇高潮喷水A片免费| 美女视频图片久久91| 人人插9| 另类在线| 丁香五月亚综合图片| 激情婷婷久久| 国产成人综合电影| 人人澡玖玖一| 五月丁香做爱视频| 性综合网| 色情五月| 五月天色婷婷图片| 婷婷色九月| 无码人妻精品一区二区蜜桃色欲| 九九青草热| 丁香六月婷婷五月天| 婷婷伊人五月| 婷婷五月色播| 欧美性爱一区| 成 人 色 色| 五月开心激情| 91人人妻人人操| 99色6爱9热| 精品五月天| 婷婷丁香六月| 综合久久高清| 久热网在线视频| 色99网站| 在线观看亚洲AV| 777精品久无码人妻蜜桃| 亚洲色区17| 一起草无码视频| 成人精品亚洲性爱| 久久精品国产精品| 日本一级一级一级一级| 五月天播播中文字幕 | 婷婷五月天亚洲综合| 色婷婷成人做爰A片免费看网站| 国产99久9在线| 五月天婷婷色紫薇阁| 激情av在线| 亚洲传媒在线观看| 天天综合天天玩夜夜玩天天玩夜夜玩| 色五月婷婷亚洲| 大香蕉人人网| 无月播播激情在线观看视频| 97高清国语自产拍| 五月丁香六月婷婷亚洲天堂网站| 日韩av在线免费观看| 另类在线免费视频| 婷婷丁香五月视频| yazhou seshipin| 婷婷性福五月天| 婷婷99狠狠躁天天久久久九九九| 精品无码av丁香五月激情| 亚洲av日韩无码| 亚洲无码AV片| 亚洲a色| 色欧美色色色| 五月天婷婷爱丁香中文字幕| 婷婷五月天激情网| 成人精品一区二区三区四区五区 | av成人在线播放| 开心激情站婷婷五月天| 日日噜噜夜夜狠狠久久丁香五月| 天天色伊人| 99亚州综合精品成人网| 婷婷伊人中文字幕| 超碰99在线观看| 4399人妻无码久久久| 99久热这里只有精品| 色综啪啪网| 久久这里只有精品07| 久久综合爱| 婷婷射图五月天| 久久五月天婷婷| 色婷婷aV四虎| 日本专区久久| 中文AV网| 玖玖婷婷婷丁香五月| 欧洲亚洲精品| 色婷婷激情五月天| 婷婷久久五月天丁香| 日韩av网站在线观看| 99热在线观看精品| 99热狠狠操| 综合XX网| 激情色色| 色色99| 天天操天天操综合| aaaa久久| 五月婷婷六月情| 第四色网婷婷| 丁香五月影院| 热久久99视频| 婷婷丁香大香蕉| 婷婷六月激情综合| 色色激情五月| 超碰99热| 噜噜噜噜噜色| 色爽九九| 五月天色区| 久久99激情| 亚洲亚洲人成综合网络| 婷婷五月天成人网站| 97久久超级| 99re热在线观看| 婷婷天堂站| 色噜噜综合网| 深爱1激情网| 五月婷婷婷| 亚洲精品国产成人AV在线| 人人爽人人射-美女久久久久久久久久-成人AV | 99热这里| 青草视频在线播放| 丁香婷婷基地| 色5在线| 七月婷婷色香综合网| 色永久| 日韩在线99| 久热这里只有精品6| 婷婷五六日| 偷拍99在线视频观看| 思思热在线观看| 人妻操逼视频。| 亚洲黄色网址| 日韩人妻无码精品| 婷婷激情欧美| 五月婷婷五月天| 极品人妻VIDEOSSS人妻| 噜噜噜久久| 色欲Av五月天| 中文字幕网站在线观看| 少妇被下春药玩弄A片| 色五月激情五月天| 色五月丁香五月五月婷婷| 97成人在线视频| 91碰视频| 亚洲视频伍月婷婷| 丁香色情五月天| 亚洲精品另类| 99热久| 亚洲免费婷婷| 五月的丁香六月的婷婷| AV在线观看网站| 国产精产国品一二三在观看| 色婷婷导航| 五月天激情婷婷小说| 色爱综合网| 97日本在线播放| 亚洲综合成人网| 狠狠五月天激情| www色色色com| 99内射视频| 丰满少妇猛烈A片免费看观看| 五月天婷婷影院| 色狠狠综合网| 亭亭五月丁香综合欧美| 亚洲成人在线综合| 婷婷综合天堂| 久久AAAA片一区二区| 熟女激情网| 五月天成人小说网| 九六五月天婷婷| 国产成人网址| av在线中文| 五月丁香婷婷激情图片| 人妻体体内射精一区二区| 丁香五月日韩| 久久久久人妻精品| 五月丁香婷婷潮喷中文字幕| 五月天婷婷色播在线网| 新久久五月天激情| 色欲久久综合| 91久久精品无码一区二区三区| 日韩色色视频www| 婷婷色在线| 青青草原伊人网| 9 7总站超级碰免费视频| 婷婷五月丁香五月| 丁香六月欧美| 九九这里都是精品| 九九久久精品| 婷婷五月丁香综合| PORNY九色9l自拍视频成人| 直接看的AV| av在线色五月丁香婷区久| 中文人妻主播久久| 草美女在线观看视频在线播放| 日本在线视频www色| 婷婷丁香五月91| 一区二区三区四区牛| 97成人丁香| 丁香婷婷五月份| 国产美女无遮挡裸体毛片A片 | 99欧州偷拍视频| 97爱综合| 99re热在线视频观看| 色婷婷亚洲综合av| 免费成人中文字幕| 久久丁香婷婷五月| 色香久久| 五月丁香六月婷婷啪啪| 亚洲免费看片| 黄网在线播放| 婷婷色五月丁香六月欧美啪| 天天天天天天操| 亚洲情欲| 激情五月婷| 天天操夜夜操| 综合久久狠狠| 韩日AV片| 六月久久婷婷| 性爱网久久| 激情宗合哪里能看| 婷婷丁香五月六月激情| 婷婷五月视频| 久久色五月天| 婷婷大香蕉| 亚洲另类电影| 丁香六月天婷婷色| 91久久九色| 97色天堂| 开心五月激情| 五月激情网络| 超碰在线综合| 九九这里有精品| 欧美韩国日本| 蒲京久久无码视频| 另类 在线| 色综合久| 亚洲综合婷婷| 五月天开心网| 五月天激情小说婷婷| 五月丁香六月欧美综合| 婷婷激情社区| 五月天综合婷婷| 成人视频网| 色欲五月丁香| 一本久道综合99| 欧美群妇大交乱婬网| 夜夜夜夜做天天天做无码视频| 婷婷五月综合啪| 日本成人噜噜噜| 人妻AV在线| 亚洲国产精品二二三三区| 日韩中出视频| 久久婷五月天| 色五月婷婷内射| 97婷婷狠狠| 99热在线观看| 大伊香蕉玖玖爱| 操操操av| 久久机热/这里只有精品| 久久久久久综合88| 99热人人艹| 大香蕉久久草| 另类视频丁香五月| 五月丁香激情综合网| 国产一级视频a| 色蜜婷婷| 甈吧vv| 第四色大香蕉| 韩国中文字幕91| 干一干xxxx| 另类图片五月天婷婷| 五月色婷婷综合| 婷婷久热| 9精品视频在线观看| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 99久在线精品99re5热视频| 婷婷色激情网| 色情五月综合婷婷| 国产一级片色色| 色欲av伊人久久大香线蕉影院| 涩涩涩婷婷| 99干日本| 日本97在线看片| 色婷婷中文字母五月丁香| 狠狠草狠狠草| 在线18av | 粉嫩av蜜桃av蜜臀av| 亚洲激情免费视频| 色综合婷婷| 久婷婷色| 丁香六月亭亭久久综合| 香蕉久久国产AV一区二区| 99久久精品色老| 99热6色| 色婷婷成人做爰A片免费看网站| 人妻久热| 久久人妻视频| 婷婷五月激情综合网| 人人色性网| 色五月网址| 丁香六月婷婷综合啪啪| 日本久久爱| 电影91久久久| 日本天天综合| 亚洲人妻AV| 九九99免费视频| 播播网色播播| 国产色视频网站2| 五月婷婷欲色| 五月天婷婷综合色| 五月四色色| 亚洲婷婷五月天| 久久精品婷婷| 色停停香蕉视频| 五月丁香久久综合色| 久狠日av| 欧美色色色色色色色| 亚洲妇女熟BBW| 9九热视频| 激情综合啪啪| 99日韩| 久操无码| 婷婷中文在线| 久久久网站| 91九色精品女同系列| www.射伊蕉婷婷| 六月丁香婷婷色狠狠久久| 久久伊人五月天| 亚洲av电影在线| 夜夜骑福利资源| 97久久综合网| 婷婷五月天黄色小说| 草榴成人影片| 天天操比比| 色色色色区| 五月婷婷综合在线| 99riAv1国产在线观看| 26UUU欧美激情一区二区| 开心五月婷婷婷美女| 久久大香蕉同僚| 九九AV在线| 欧美激情综合| 99热这里只有精品21| 日产精品一线二线三线芒果| 午夜爱爱爱成人| 激婷网| 伊人五月丁香| av在线免费网站 | 欧美婷婷五月天综合| 激情色五月天| 色色综合五月| 亚韩在线视频| 色波激情五月天| 亚洲精品一区中文字幕乱码| 天天摸人人摸| 久久久jd| 婷婷久久综合久| 九九九成人在线视频| 色99久草在线| 丁香婷婷色色| 五月天婷亚洲天综合网综合| 婷婷操无码| 成人在线99| 色情综合| 九月丁香久久网| 成人精品亚洲性爱| 久久综合九九| 亚洲视频在线网站| 婷色五月天| 五月天激情国产综合婷婷婷就去爱| 色婷婷成人做爰A片免费看网站| 久久九九在线视频| 综合激情在线视频| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 五月婷婷六月丁香综合在线| 激情四射五月天| 免费看欧美成人A片无码| 五月天婷婷影院影院观看| 丁香婷婷黄网站| 日曰躁夜夜躁2026| 影音先锋四区| 超碰renrenai| 色综合久久综合中文综合网| 婷婷丁香久久五月综合| 玖玖99精品视频| 亚洲综合九九| 久久九九色| 美妞av| 日韩视频女神99| 97天堂| 色五月激情五月| 成人羞羞啪啪 全 视频| 综合九九中文字幕| 亚洲国产精品VA在线看黑人| 色色狼人综合| 99热99这里免费的精品| 丁香五月色情| 亚洲AV另类| 精国产品一区二区三区A片 | 五月丁香婷婷99| 五月天精品| 五月丁香亭亭| 色五月视频,小说| 国产伦理精品高清在线观看网站一区二区| 国产超碰av| www99热| 香蕉操亚洲| 久久aaaa片一区二区| www.激情.com.| 色99免费视频中文| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 色伦专区97中文字幕| 99久久99久久| www.深爱激情| 五月花成人网| 色五月天.con| 久久久jd| 91刘玥视频在线观看| 国外亚洲成AV人片在线观看| 色综合99| 婷婷色五月开心五月| 久久机热这里只有精品| 六月婷五月丁香| 激情av| 久久9久久| 丁香五月色色婷| 一区二区三区四日本| 色婷婷电影网| 亚洲99热| 超碰人人操在线| 色婷婷综合网| 99亚州综合精品成人网| 色五月综合网| 欧美成人网婷婷综合在线| 人人爽人人射-美女久久久久久久久久-成人AV | 免费啪啪亚州视频| 九九热精品视频| 五月开心深深爱激情综合| 丁香六月色情| 蜜乳.comcom| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | AV变态另类一区二区| 逼特逼在线免费播放| 在线观看国产高清视频免费网站| 久久这里只有精品99| 久久98| 9久久精品| 婷婷五月情| 丁香婷婷六月天| 久久色天堂| 丁香五月伊人| 成人短视频在线观看| 五月香婷婷| 91人人操人人| www.五月婷婷久久.com| 五月丁香综合激情网| 五月天婷综合| 五月激情婷婷综合| 色色五月丁香婷婷| 色婷婷丁香五月天| 国产激情久久| 99热在线爱| 区区久久妻| 人人干天天舔| 色婷婷婷综合五月天| 五月色 亚洲| 婷婷色五月色妇| 亚洲 五月 婷婷 成人| 天天天天爽爽天干| 狠狠色狠狠操| 人妻激情综合| 这里只有精品视频免费在线观看| 91色婷婷综合久久中文字幕二区| 婷婷五月色| 日韩av变天就操逼不卡区| 99久久超级| WWW.久久久久久久久久久久久| 啪啪操操| 99自拍视频| 色A网| 久噜久噜| 激情五月综合网| 五月婷婷性爱| 成人国产欧美大片一区| 91av成人| 99日精品视频| 综合亚洲色色| 色五月激情基地| 噜噜视频| 可以直接看的av| 91精品激情9| 98色丁香五月婷婷综合网| 五月丁香无码| 激情5月婷婷狠狠干| 亚洲人成人五月天| 成人五月天丁香| 五月丁香影视| 月丁香久久久| 超碰av在线| 国产高清RV综合aVa| 无码色色色| 五月天伊人网| 91人人爱| 亚洲网视屏| 亚洲欧洲中文日韩久久AV乱码| 波多婷婷久久| 丁香大香蕉| 亚洲天堂AAA| 日91高清无玛| 中文字幕丰满孑伦无码专区| 九月av在线| 丁香六月婷婷激情综合| 色婷婷久久综合丁香五月| 亚洲成人网站在线播放| 性一交一乱一交A片久| 人人干人人操外国| 丁香亭亭久久| 开心深爱激情网| 丁香在线视频| 69精品人妻不卡视频| 精品在线| 婷婷婷婷婷婷婷婷| 疯狂做受XXXX高潮A片| 日本黄色精品| 五月天亚洲最大成人| 五月婷婷五月天| 中国女人做爰A片| 色色色五月婷| 婷婷五月天免费| 丁香六月啪| 激情婷婷五月社区| 丁香五月婷婷婷婷欧美综合| 色婷婷电影网| 青草视频在线播放| 久婷婷| 五月丁香六月婷婷综合网站| 久99热| 久大香蕉| 五月天精品综合| 99热国产| 色一情一乱一乱一区91| 99这里只有精品99| 99网| 狠狠色综合网| 久久久精品99| 丁香五月天BBw| 99热8| 丁香五月天狠狠操| 青青草原精品久久| 日本一级一级一级一级| 情色五月天网站| 色色性爱视频| 97超级碰| 日在线V视频在线播放| 婷婷爱五月天| 婷婷午夜丁香| 亚洲第一综合| 99精品丰满| 五月天四色房丁香| 国产成人片| 综合狠狠伊人| www.色五月| 97婷婷丁香| 六月丁丁香| 久热在线观看视频9| 婷婷五月天免费| 日本熟妇乱妇熟色A片蜜桃| 九玖视频这里只有精品| 激情综合色| www99久久| 99国产精品久久久久久久久久久| 人人操操97| 五月婷婷六月丁香在线视频| 99综合色色色| 激情婷婷五月天在线观看| 国产成人精品一区二三区熟女在线 | 大香蕉久热| 亚洲视频无| 色五月六月| 九九99九九精品视频| 亚洲丁香网| 狠狠插.com| 婷婷五月天免费| 天天射色五月天| 先锋影音av色五月天资源站| 色欲日日躁| 艳妇野外情欲放荡HD| 亚洲瑟瑟精品在线| 懂色av粉嫩av蜜臀av| 99re思思精品在线观看| 狠狠插.com| 极品五月天| 玖玖@三月天天丁香婷婷| 99热色在线精品| 欧美日韩国产一二区| 久久视频这里99| 9色免费网| 激情五月天综合网| 色婷婷88| 思思热在线播放| 人妻射精AV| 免费视频WWW在线观看网站| 天天色综合色| 色婷青青| 五月亚洲| 欧美视频五区| 丁香五月婷久久| 五五月丁香花激情综合网| 粉嫩AV久久一区二区三区| 丁香婷婷五色月| 色综合播放| 五月婷婷导航| 99热9| 成 人片 黄 色 大 片| 婷婷娱乐丁香综合网| 狠狠综合久久综合| yellow视频在线观看91| 天天人人综合| 婷婷欠久少妇| 天天色天天操天天射| 五月丁香成人| 五月丁香六月激情| 天天干com| 色欲五月婷婷| 色色五月婷婷| 色婷五月天综合网| 色吧婷婷| 欧洲色| 狠狠色噜噜| 九九色综合网| 女人高潮内射99精品| 九九视频这里有精品| 日本色天堂| 国产毛片欧美毛片久久久| 九九99一区| 97啪啪| 国产真实乱对白精彩| 久久久免费精彩视频| 天天插天天插天天操| 97日本在线播放| 色你久久| www.日韩艹| 亚洲99在线| 人人综合五月人人婷婷| 九九超日本| 五月丁香六月婷| WWW,婷婷,COM| 丁香五月亚洲AV| 91大操| 五月丁香| 99热亚洲精品| 天天做综合| 99伊人婷婷在线| 激情久久久| 俺去也婷婷| 婷婷综合成人五月天| 色吧婷婷| 91色性感五月婷婷丁香| 色停停香蕉视频| 99热99这里免费的精品| 国产成人网站在线观看| 91丨九色丨老熟女激情| 亚洲精品婷婷| 久久怕怕视频| 五月天婷婷在看| 婷婷丁香激情综合色情| 西西4r午夜剧场| 色色性爱视频| 日本五月天网站| 亚洲人妻一区二区 | 色色无码| 狠狠狠狠操| 九九色中文| 大香蕉人人网| 岛国在线观看91| 久热超碰| 激情网婷婷五月天| 婷婷丁香五月噜噜噜| 91久久久久久| 色一情一乱一乱91Av| 丁香婷婷AV| 婷婷五月天成人| 超碰男人色| 99热这里只有免费精品| 五月天婷婷爱丁香中文字幕| 婷婷久久五月| 97碰碰在线观看视频| 91干网站| 97高清国语自产拍| 天天插综合| 中文在线成人| 五月婷婷六月丁香在线视频| www。五月天。com| 这里只有精品视频在线| 天堂久久婷婷| 第五色婷婷| 婷婷五亚洲| 5月婷婷性视频| 开心丁五月| 免费AAAAA网| 97视频久久| 婷婷久久精品| 婷婷玖玖丁香| 99精品综合在线| 操操操B| 亚洲国产精品SUV| 狠狠干狠狠干| 色中色综合| 色色色色综合网| www.久久爱.com| 五月综合激情网| 亚洲美女网Va| 在线观看中文字幕| 91精品综合久久久久久五月丁香| 日逼免费视频| 天天干天天操天天上| 婷丁香五月天| 思思99精品视频在线观看| 激情四射五月天偷偷看婷婷| 五月丁香啪啪啪| 99色色热热| WWW.天天日| 色婷婷五月天中文字幕| 91久久婷婷| 婷婷性爱| site:901-07.com| 婷婷色色狠狠| 亚色网站小视频| 深爱网深爱综合网| 色播五月丁香综合| 99热精品一区| 欧美久久婷婷| 欧州色色| 五月天婷婷成人网| 丁香五月综合激情啪啪| 91在线日| 涩涩涩五月天| www.五月天| 日韩少妇内射免费播放| 狠狠操狠狠色| 狼人伊人干| 婷婷久久五月天中文字幕在线观看| 亚洲有码在线视频| 欧美日韩成人在线观看| 7777激情基地| www。狠狠干。com| 五月婷婷在线网站| 色5月婷婷| 色五月丁香五月| 欧美日本黄色| 色偷偷综合| 亚洲中文字幕在线观看| 猫咪伊人AV| 香蕉伊人综合| 99热国产| 91九九九色在| 丁香六月欧美| 天天色丁香| 狠狠色丁香综合| WWW.开心五月天.COM| 婷婷基地爱| 97精品欧美91久久久久久久| 99热最新| www.第四色99| 久久九九国产| 天天 青草 制服丝袜 在线| 五月天色导航| 亭亭玉月丁香| 色播五月网| 丁香六月丁香婷婷激情| 九九九九九九毛片| 久久这里精彩免费在线观看| 99成人精品| 日日撸夜夜操| 99热亚洲| 久9热插入| 青青草tp| 婷婷激情区| 五月天婷婷激情| 五月婷久久| 9精品国产在热久久| 91avse| 偷拍视频五月天| 婷婷五月综合啪| 中文字幕按摩做爰| 婷婷色一二三区波多野结衣| 99久热| www,av好吊操| 九九99免费视频| 琪琪色五月婷婷老师| 免费国产视频| 婷婷狠狠五月综合| WWW.17C亚洲精品| 高清一区二区三区日本久| 激情淫乱男女| 五月天色播网| 婷婷爱五月天| 另类少妇人与禽zOZZ0性伦| 九九激情视频| 中文人妻主播久久| 天天拍天天操| 亚洲精品白浆高清久久久久久| av操一操| 亚洲精| 91九色首页| 综合久久综合五月天婷婷| 久热这里只有国产| 开心五月网 | 五月 成人 婷婷| www.五月丁香av| 九色91视频| 五月天丁香久久综合| 二色av| 五月婷婷六月丁香在线| 免费无码毛片一区二区A片| 久热超碰91| 激情色情五月天| 色五月婷婷网| 五月丁香激| 2025年最新亚洲在线欧美| 久久人人看| 天天射天天干天插色综合| 激情五月www| 9+1视频网址| 亚洲AV综合网| 黄色激情五月天| 中文字幕精品无码一区二区| 婷婷在线精品| 天天日天天操心| 91国产精品视频播放| 婷婷色五月天第7色| 99ri国产在线| 熟美女麻豆| 伊人网色婷婷五月天| 人妻少妇色综合| 婷婷色导航| 91婷婷色| 色九综合| 日日操天天| 日韩AV在线影片| www.91.com处女在线直播| 久久色五月| 欧美日韩五月婷婷| 久久A V无码视频| 字幕网AV中文字幕| 99热精品在线播放观看| 六月丁香啪啪| 色欲天天综合| 婷婷综合五月| 丁香六月婷婷社区| 99热99热不卡| 婷婷综合中文| 丁香婷婷久久激情| 婷婷伊人| 丁香五月网络网络| 99欧美| 亚洲九区| 99在线精品观看99| 天堂资源欧日浪女在线播放| 成人免费高清在线播放| 98热精品| 五月天婷婷爱| 亚洲图色五月天| 色五月第四色| 一区二区你懂的| 丁香五月婷婷色偷偷| 婷婷五月丁香综合瑟瑟| 五月丁香激情深爱婷婷| 中文字幕婷婷9月天| 99在线看片| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 丁香亭亭激情四射| 无月播播激情在线观看视频| 伊人九九68| 天天天天天久久久久久| 狠狠爱丁香婷| 婷婷五月无码| 久久大香免费| 操逼三区| 激情综合无码| 一级片sese片.COM| 二色av| 五月丁香少妇网| 成人免费黄色短视频| 丁香五月天啪啪激情综合网| 色色999三级片| 99热在线这里| 日本在线视频看se99| 五月99久久| 综激情网| 久久九九色| 激情五月综合色婷婷| 大操人妻| 亚州色色色| 色情五月婷| 天天干天天操天天拍| 五月婷婷丁香五月亚洲色| 99ree6| 亚洲日日日| 伊人狠狠丁香婷婷综合尤物| 五月婷色| 天天婷婷天天| 国产特黄色精品一区二区三区精品无广告| 色婷婷丁香| 97干网站| 91狠狠综合久久久| 色五月婷婷天天操夜夜操| 五月天堂婷婷| 色五月综合在线| 五月婷婷,六月激情| 国产av网| 4438激情网| 天天操夜夜啊| www.99riav99| 激情爱爱网站超大免费| 五月丁香六月激情综合网| 亚洲欧洲中文日韩久久AV乱码| 激情五月婷婷老师| 9999三级片| 熟妇无码乱子成人精品| 五月婷婷开心综合| 丁香婷婷九月| 欧美性猛交AAAA片黑人 | se99视频| 九九碰九九爱97超碰| 深夜婷婷 丁香| 任你操精品免费| 99热欧| 久久码久久无清| 欧美色频| 五月激情久久| 久久黄A片| 67194线路二在线观看| 香蕉狠狠爱视频| 日韩av大全| 97色色婷婷五月天| 少妇AB又爽又紧无码网站| 99色热视频在线| 五月婷婷丁香| 五月综合无码| 狠狠色婷婷7| 久久中国毛毛片爱久久|