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

ARTICLE DETAIL

資訊詳情

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

Spring Boot集成EMQX的MQTT重連機(jī)制深度解析

Spring Boot集成EMQX的MQTT重連機(jī)制深度解析 1. 項(xiàng)目概述當(dāng) Spring Boot 遇上 EMQX重連不是“自動(dòng)續(xù)費(fèi)”而是系統(tǒng)性工程MQTT 客戶端反復(fù)重連——這六個(gè)字在物聯(lián)網(wǎng)、工業(yè)監(jiān)控、智能硬件后臺(tái)開(kāi)發(fā)中幾乎等同于“深夜告警電話響起”的前奏。我第一次在某能源監(jiān)測(cè)平臺(tái)上線后第三天凌晨?jī)牲c(diǎn)被叫醒就因?yàn)?Spring Boot 應(yīng)用連接 EMQX 后每 47 秒斷開(kāi)、3 秒內(nèi)重連、再斷開(kāi)……循環(huán)往復(fù)日志里堆滿Connection lost和Attempting reconnect而設(shè)備上報(bào)數(shù)據(jù)卻像被掐住喉嚨吞吐量跌到正常值的 12%。這不是配置沒(méi)點(diǎn)“重連開(kāi)關(guān)”那么簡(jiǎn)單也不是加個(gè)Scheduled手動(dòng) ping 就能糊弄過(guò)去的事。它背后是 TCP 連接生命周期、MQTT 協(xié)議會(huì)話狀態(tài)Clean Session / Session Expiry Interval、Spring Integration 的消息通道緩沖機(jī)制、EMQX 集群節(jié)點(diǎn)間會(huì)話同步延遲、以及 JVM 線程調(diào)度與 Netty EventLoop 綁定策略的多重交疊。你看到的是“反復(fù)重連”實(shí)際在跑的是一個(gè)跨協(xié)議棧、跨進(jìn)程、跨網(wǎng)絡(luò)層的隱式狀態(tài)機(jī)。這個(gè)項(xiàng)目標(biāo)題里的“踩坑實(shí)錄”不是修幾個(gè) bug 的記錄而是把 Spring Boot EMQX 這套組合在生產(chǎn)環(huán)境里“按在地上摩擦”后重新拼出完整因果鏈的過(guò)程。適合正在用 Spring Boot 接入 MQTT 消息中間件的后端開(kāi)發(fā)者、IoT 平臺(tái)架構(gòu)師以及那些剛在本地測(cè)試一切完美、一上預(yù)發(fā)就瘋狂重連、翻遍文檔卻找不到答案的中級(jí)工程師。核心關(guān)鍵詞就三個(gè)MQTT 客戶端重連機(jī)制、Spring Boot 集成 EMQX、EMQX 會(huì)話管理策略——它們不是并列關(guān)系而是層層嵌套的依賴重連行為由客戶端驅(qū)動(dòng)但能否成功重建會(huì)話取決于 EMQX 是否還保留著你的 Session而 Spring Boot 的封裝層又悄悄屏蔽了底層 Netty ChannelInactive 事件與 MQTT CONNECT 報(bào)文重發(fā)之間的時(shí)序細(xì)節(jié)。接下來(lái)所有內(nèi)容都圍繞這三者的咬合縫隙展開(kāi)。2. 整體設(shè)計(jì)思路拆解為什么“開(kāi)重連”反而讓系統(tǒng)更脆弱2.1 不是所有重連都叫“可靠重連”很多開(kāi)發(fā)者拿到需求第一反應(yīng)是“MQTT 客戶端自帶重連配個(gè)reconnectAttempts10不就完了”——這是最典型的認(rèn)知偏差。EMQX 官方文檔里明確寫著“客戶端重連Reconnect僅保證 TCP 層連接恢復(fù)不保證 MQTT 會(huì)話Session延續(xù)。” 這句話的潛臺(tái)詞是如果你的客戶端設(shè)置了cleanSession trueSpring Boot 默認(rèn)就是 true那么每次重連EMQX 都會(huì)當(dāng)作一個(gè)全新客戶端處理丟棄所有未確認(rèn)的 QoS1/2 消息、清空訂閱列表、重置遺囑消息Will Message。結(jié)果就是你花了 2 秒連上卻發(fā)現(xiàn)之前設(shè)備發(fā)來(lái)的 5 條報(bào)警消息全丟了還得手動(dòng)去數(shù)據(jù)庫(kù)查歷史記錄補(bǔ)漏。我們當(dāng)時(shí)線上問(wèn)題的根因之一就是誤以為“連上了消息通了”實(shí)際是“連上了從零開(kāi)始”。提示Spring Boot Starter for MQTT如spring-integration-mqtt默認(rèn)創(chuàng)建的MqttPahoClientFactory實(shí)例其cleanSession屬性為true且無(wú)顯式配置入口。你必須通過(guò)自定義MqttConnectOptionsBean 手動(dòng)覆蓋。2.2 EMQX 的“會(huì)話保鮮”機(jī)制才是關(guān)鍵勝負(fù)手EMQX 不是被動(dòng)等待客戶端重連的“接線員”它有一套主動(dòng)的會(huì)話保鮮Session Keep-alive策略。關(guān)鍵參數(shù)有兩個(gè)session_expiry_interval會(huì)話過(guò)期時(shí)間和max_clientid_len客戶端 ID 長(zhǎng)度限制。前者決定了 EMQX 在客戶端斷開(kāi)后最多保留該會(huì)話多長(zhǎng)時(shí)間后者則直接影響你能否使用帶時(shí)間戳或隨機(jī)后綴的動(dòng)態(tài) Client ID比如client-20240520-abc123。我們踩的第一個(gè)深坑就是用了 UUID 生成的 Client ID36 字符而 EMQX 集群配置的max_clientid_len 23。結(jié)果是客戶端首次連接成功但重連時(shí) EMQX 認(rèn)為 Client ID 非法直接拒絕連接觸發(fā)客戶端無(wú)限退避重試exponential backoff日志里卻只顯示Connection refused根本看不到 Client ID 被截?cái)嗟奶崾尽:髞?lái)查 EMQX 的emqx.log才發(fā)現(xiàn)一行invalid clientid length: 36 23。這說(shuō)明重連失敗的表象90% 源于服務(wù)端策略與客戶端配置的隱式不匹配而非網(wǎng)絡(luò)抖動(dòng)。2.3 Spring Boot 的“自動(dòng)裝配”埋下了時(shí)序陷阱Spring Boot 的便利性在這里成了雙刃劍。當(dāng)你引入spring-boot-starter-integration并配置spring.mqtt.*屬性時(shí)框架會(huì)自動(dòng)創(chuàng)建MqttMessageDrivenChannelAdapter和MqttPahoClientFactory。但問(wèn)題在于這個(gè) Adapter 的啟動(dòng)時(shí)機(jī)是在 Spring Context 刷新完成之后而 EMQX 集群的節(jié)點(diǎn)發(fā)現(xiàn)、會(huì)話同步可能需要 200~500ms。我們?cè)龅揭环N情況應(yīng)用啟動(dòng)瞬間Adapter 就向 EMQX 發(fā)送 CONNECT此時(shí) EMQX 主節(jié)點(diǎn)還沒(méi)完成集群狀態(tài)同步返回CONACK時(shí)攜帶的session present false導(dǎo)致客戶端誤判“會(huì)話不存在”進(jìn)而清空本地緩存的訂閱主題。后續(xù)即使網(wǎng)絡(luò)穩(wěn)定也得靠定時(shí)任務(wù)重新 subscribe——而這個(gè)定時(shí)任務(wù)的間隔我們最初設(shè)為 30 秒意味著最長(zhǎng) 30 秒內(nèi)新主題消息完全丟失。解決方案不是調(diào)小間隔而是讓 Adapter 的啟動(dòng)等待 EMQX 集群 Ready 信號(hào)。我們最終在ApplicationRunner中加入對(duì) EMQX/statusHTTP API 的健康檢查直到返回status: running才觸發(fā)channelAdapter.start()。2.4 真正的“高可用”設(shè)計(jì)客戶端 服務(wù)端 網(wǎng)絡(luò)層的三層協(xié)同把重連問(wèn)題當(dāng)成客戶端單點(diǎn)問(wèn)題來(lái)解決注定失敗。我們最終落地的方案是三層防御客戶端層禁用cleanSession啟用sessionExpiryInterval8640024 小時(shí)Client ID 固定如springboot-app-prod-v1重連策略改為固定間隔非指數(shù)退避避免雪崩式重連沖擊 EMQX服務(wù)端層EMQX 配置zone.external.max_clientid_len 64zone.external.session_expiry_interval 86400并開(kāi)啟mqtt.allow_anonymous false強(qiáng)制認(rèn)證杜絕非法 Client ID 沖突網(wǎng)絡(luò)層在 Kubernetes Ingress 層配置proxy_read_timeout: 3005 分鐘防止 Nginx 等反向代理因空閑超時(shí)主動(dòng)斷開(kāi)長(zhǎng)連接同時(shí)要求運(yùn)維團(tuán)隊(duì)關(guān)閉交換機(jī)端口的TCP keepalive探測(cè)默認(rèn) 2 小時(shí)改用 EMQX 自身的keepalive機(jī)制默認(rèn) 60 秒避免中間設(shè)備靜默斷連。這三層不是獨(dú)立配置而是環(huán)環(huán)相扣客戶端的keepalive60必須小于 EMQX 的zone.external.keepalive_max 120否則 EMQX 會(huì)強(qiáng)制斷開(kāi)而 EMQX 的session_expiry_interval又必須大于客戶端重連最大間隔我們?cè)O(shè)為 120 秒否則重連時(shí)會(huì)話已過(guò)期。這種參數(shù)間的數(shù)學(xué)約束才是“反復(fù)重連”問(wèn)題的本質(zhì)。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)從日志里挖出真相的 7 個(gè)關(guān)鍵線索3.1 日志是唯一真相源必須開(kāi)啟的 4 類日志級(jí)別別信控制臺(tái)打印的Connected to broker那只是 Spring Boot 的樂(lè)觀假設(shè)。真正的連接狀態(tài)藏在四類日志里EMQX 服務(wù)端日志log/emqx.log搜索client_connected、client_disconnected、session_dropped。我們?cè)l(fā)現(xiàn)一條session_dropped, reason: session_expired直接定位到session_expiry_interval配置過(guò)短客戶端 Netty 日志添加-Dio.netty.logger.levelDEBUG關(guān)注ChannelActive、ChannelInactive、exceptionCaught。當(dāng)出現(xiàn)java.io.IOException: Connection reset by peer說(shuō)明是 TCP 層被中間設(shè)備防火墻/負(fù)載均衡強(qiáng)制中斷Paho 客戶端日志設(shè)置MqttConnectOptions.setLogEnabled(true)輸出MQTT CONNECT、CONNACK報(bào)文詳情特別是CONNACK中的returnCode0成功1~5各種拒絕原因和sessionPresent字段值Spring Integration 日志logging.level.org.springframework.integrationDEBUG追蹤MqttMessageDrivenChannelAdapter的start()、stop()、onConnectionLost()調(diào)用鏈確認(rèn)是否因異常被反復(fù) stop/start。注意生產(chǎn)環(huán)境切勿長(zhǎng)期開(kāi)啟 DEBUG 級(jí)別日志但排查重連問(wèn)題時(shí)必須臨時(shí)開(kāi)啟并定向輸出到獨(dú)立文件如mqtt-debug.log否則海量 INFO 日志會(huì)淹沒(méi)關(guān)鍵線索。3.2 Client ID 設(shè)計(jì)固定、唯一、可追溯的黃金三角Client ID 不是隨便起個(gè)名字就行。我們吃過(guò)虧的三種錯(cuò)誤模式UUID 模式client-uuid4()每次啟動(dòng) ID 不同cleanSessionfalse下EMQX 會(huì)為每個(gè) ID 創(chuàng)建獨(dú)立會(huì)話內(nèi)存暴漲集群同步延遲加劇主機(jī)名進(jìn)程號(hào)模式host123-45678K8s 環(huán)境下 Pod 重啟后 IP 和進(jìn)程號(hào)全變ID 失效時(shí)間戳模式app-202405201430同一秒內(nèi)多個(gè)實(shí)例啟動(dòng)ID 沖突。最終采用“環(huán)境服務(wù)名版本哈?!彼亩问絧rod-springboot-mqtt-v1.2.3-7a8b9c。其中哈希取自 Git Commit SHA 前 6 位確保構(gòu)建產(chǎn)物唯一環(huán)境和服務(wù)名硬編碼版本號(hào)來(lái)自MANIFEST.MF。這樣既保證全局唯一又具備可追溯性——看到 Client ID 就知道是哪個(gè)環(huán)境、哪個(gè)版本、哪次構(gòu)建。更重要的是EMQX 的session存儲(chǔ)以 Client ID 為 Key固定 ID 讓會(huì)話復(fù)用率從 30% 提升至 99.7%。3.3 Clean Session 與 Session Expiry Interval 的數(shù)學(xué)關(guān)系這是最容易被忽略的公式sessionExpiryInterval ≥ (最大重連間隔 × 重連嘗試次數(shù)) 網(wǎng)絡(luò)抖動(dòng)余量我們最初設(shè)sessionExpiryInterval3005 分鐘重連策略為initialDelay1000ms, maxDelay10000ms, multiplier1.5即第 1 次等 1 秒第 2 次等 1.5 秒第 3 次等 2.25 秒……第 10 次等 10 秒。算下來(lái)第 10 次重連發(fā)生在首次斷連后約 112 秒遠(yuǎn)小于 300 秒看似安全。但忽略了網(wǎng)絡(luò)抖動(dòng)某次重連請(qǐng)求發(fā)出后因 DNS 解析失敗延遲 800msEMQX 處理耗時(shí) 200msCONNACK返回又卡在防火墻隊(duì)列 300ms……總延遲達(dá) 1.3 秒。此時(shí)第 10 次重連尚未發(fā)起但 EMQX 已判定會(huì)話過(guò)期。最終我們將sessionExpiryInterval設(shè)為8640024 小時(shí)重連策略改為fixedDelay2000ms, maxAttempts5固定 2 秒重試最多 5 次總耗時(shí) ≤10 秒并確保86400 10徹底消除會(huì)話過(guò)期風(fēng)險(xiǎn)。3.4 EMQX 集群會(huì)話同步延遲的實(shí)測(cè)方法EMQX 集群不是強(qiáng)一致系統(tǒng)會(huì)話數(shù)據(jù)在節(jié)點(diǎn)間同步有延遲。我們用一個(gè)簡(jiǎn)單腳本驗(yàn)證# 在節(jié)點(diǎn) A 上連接 client-A訂閱 topic/test # 立即在節(jié)點(diǎn) B 上執(zhí)行 curl -s http://emqx-node-b:8081/api/v4/clients?clientidclient-A | jq .data[0].subscriptions # 若返回空數(shù)組說(shuō)明同步延遲 0實(shí)測(cè)發(fā)現(xiàn)小集群3 節(jié)點(diǎn)平均同步延遲 80~120ms大集群12 節(jié)點(diǎn)達(dá) 300~500ms。這意味著如果客戶端重連時(shí)恰好路由到尚未同步會(huì)話的節(jié)點(diǎn)CONNACK中sessionPresentfalse客戶端就會(huì)清空本地訂閱。解決方案是在客戶端重連成功后強(qiáng)制執(zhí)行一次resubscribe而不是依賴sessionPresent標(biāo)志。我們?cè)贛qttCallback.connectionLost()中觸發(fā)一個(gè)帶 500ms 延遲的resubscribe任務(wù)避開(kāi)同步窗口。3.5 Spring Boot 配置的“隱形陷阱”yml vs Java ConfigSpring Boot 的application.yml看似簡(jiǎn)潔但對(duì) MQTT 配置有致命缺陷spring: mqtt: url: tcp://emqx-cluster:1883 username: app-user password: app-pass # ? 這里無(wú)法配置 cleanSession、sessionExpiryIntervalspring.mqtt.*屬性只映射到MqttPahoClientFactory的基礎(chǔ)字段URL、用戶名、密碼高級(jí) MQTT 選項(xiàng)如cleanSession必須通過(guò) Java Config 顯式聲明Bean public MqttConnectOptions mqttConnectOptions() { MqttConnectOptions options new MqttConnectOptions(); options.setServerURIs(new String[]{tcp://emqx-node1:1883, tcp://emqx-node2:1883}); options.setUserName(app-user); options.setPassword(app-pass.getBytes()); options.setCleanSession(false); // 關(guān)鍵必須顯式設(shè)為 false options.setConnectionTimeout(30); options.setKeepAliveInterval(60); // EMQX 5.0 支持 MQTT 5.0可設(shè)會(huì)話過(guò)期時(shí)間 if (options instanceof Mqtt5ConnectOptions) { ((Mqtt5ConnectOptions) options).setSessionExpiryInterval(86400L); } return options; }3.6 遺囑消息Will Message的雙重保險(xiǎn)設(shè)備離線通知依賴 Will Message但它的可靠性受cleanSession影響極大。當(dāng)cleanSessiontrue時(shí)客戶端斷開(kāi)即發(fā)送 Will當(dāng)cleanSessionfalse時(shí)只有“首次連接時(shí)建立的會(huì)話被銷毀”才發(fā)送 Will。而 EMQX 銷毀會(huì)話的條件是客戶端以cleanSessiontrue重連或會(huì)話過(guò)期。我們最初的 Will 消息設(shè)置為qos1, retainedfalse結(jié)果在cleanSessionfalse下設(shè)備意外斷電后Will 消息從未發(fā)出。解決方案是Will Message 必須配置retainedtrue并確保topic是設(shè)備唯一標(biāo)識(shí)如device/status/ABC123這樣即使會(huì)話未銷毀新訂閱者也能立即獲取最后狀態(tài)。同時(shí)在客戶端connectionLost()回調(diào)中主動(dòng)向device/status/ABC123發(fā)布一條offline消息QoS1形成雙重保險(xiǎn)。3.7 TLS 加密下的重連特殊處理如果 EMQX 啟用 TLSssl://重連失敗率會(huì)顯著升高。根本原因是TLS 握手比 TCP 連接耗時(shí)更長(zhǎng)且證書驗(yàn)證、CRL 檢查等步驟易受網(wǎng)絡(luò)抖動(dòng)影響。我們觀察到TLS 模式下 70% 的重連失敗發(fā)生在SSLHandshakeException: Remote host closed connection during handshake。解決方法有三客戶端禁用 CRL 檢查options.setSocketFactory(sslContext.getSocketFactory())時(shí)自定義SSLSocketFactory跳過(guò) CRLEMQX 端關(guān)閉 OCSP Stapling配置listener.ssl.external.ocsp_stapling off增加 TLS 握手超時(shí)options.setConnectionTimeout(60)默認(rèn) 30并設(shè)置options.setKeepAliveInterval(120)TLS 連接保活需更長(zhǎng)間隔。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)從零搭建抗重連的 Spring Boot MQTT 客戶端4.1 環(huán)境準(zhǔn)備與依賴聲明我們使用 Spring Boot 2.7.18兼容 JDK8 EMQX 5.0.22 Paho MQTT 1.2.5。關(guān)鍵依賴如下dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-integration/artifactId /dependency dependency groupIdorg.springframework.integration/groupId artifactIdspring-integration-mqtt/artifactId !-- 排除舊版 paho -- exclusions exclusion groupIdorg.eclipse.paho/groupId artifactIdorg.eclipse.paho.client.mqttv3/artifactId /exclusion /exclusions /dependency dependency groupIdorg.eclipse.paho/groupId artifactIdorg.eclipse.paho.client.mqttv3/artifactId version1.2.5/version /dependency !-- EMQX 5.0 支持 MQTT 5.0需額外引入 -- dependency groupIdorg.eclipse.paho/groupId artifactIdorg.eclipse.paho.mqttv5.client/artifactId version1.2.5/version /dependency注意spring-integration-mqtt3.0.x 默認(rèn)依賴 Paho 1.2.2存在MqttAsyncClient在重連時(shí)內(nèi)存泄漏的 BugGitHub Issue #782必須升級(jí)到 1.2.5 并排除舊版。4.2 自定義 MQTT 連接工廠注入所有關(guān)鍵參數(shù)Configuration public class MqttConfig { Value(${mqtt.broker.urls}) private String[] brokerUrls; // 如 [ssl://emqx1:8883, ssl://emqx2:8883] Value(${mqtt.client.id}) private String clientId; Value(${mqtt.username}) private String username; Value(${mqtt.password}) private String password; Bean public MqttConnectOptions mqttConnectOptions() { MqttConnectOptions options new MqttConnectOptions(); options.setServerURIs(brokerUrls); options.setUserName(username); options.setPassword(password.getBytes()); options.setCleanSession(false); // 關(guān)鍵禁用 clean session options.setConnectionTimeout(60); // TLS 下延長(zhǎng)超時(shí) options.setKeepAliveInterval(120); // TLS 保活間隔加長(zhǎng) options.setMaxInflight(1000); // 提高并發(fā)處理能力 options.setAutomaticReconnect(false); // ? 禁用 Paho 自動(dòng)重連由 Spring 控制 // MQTT 5.0 會(huì)話過(guò)期時(shí)間秒 if (options instanceof Mqtt5ConnectOptions) { ((Mqtt5ConnectOptions) options).setSessionExpiryInterval(86400L); } // 設(shè)置 TLS 上下文若啟用 SSL if (brokerUrls[0].startsWith(ssl://)) { try { SSLContext sslContext SSLContext.getInstance(TLSv1.2); sslContext.init(null, new TrustManager[]{new X509TrustManager() { Override public void checkClientTrusted(X509Certificate[] chain, String authType) {} Override public void checkServerTrusted(X509Certificate[] chain, String authType) {} Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}, new SecureRandom()); options.setSocketFactory(sslContext.getSocketFactory()); } catch (Exception e) { throw new RuntimeException(Failed to init SSL context, e); } } return options; } Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory new DefaultMqttPahoClientFactory(); factory.setConnectionOptions(mqttConnectOptions()); return factory; } }4.3 構(gòu)建高韌性消息通道適配器Component public class MqttMessageHandler implements MqttCallbackExtended { private final Logger logger LoggerFactory.getLogger(MqttMessageHandler.class); Autowired private MqttPahoClientFactory clientFactory; Value(${mqtt.input.topic}) private String inputTopic; // 如 sensor//temperature Value(${mqtt.output.topic}) private String outputTopic; // 如 command//execute private MqttMessageDrivenChannelAdapter channelAdapter; private MqttAsyncClient mqttClient; PostConstruct public void init() throws Exception { // 創(chuàng)建客戶端實(shí)例非自動(dòng)連接 this.mqttClient new MqttAsyncClient( brokerUrls[0], // 主 Broker URL clientId, new MemoryPersistence(), clientFactory.getConnectionOptions() ); this.mqttClient.setCallback(this); // 構(gòu)建適配器 this.channelAdapter new MqttMessageDrivenChannelAdapter( mqttClient, clientFactory ); this.channelAdapter.setCompletionTimeout(10000); this.channelAdapter.setConverter(new DefaultMQTTMessageConverter()); this.channelAdapter.setOutputChannel(mqttInputChannel()); // 接收消息的 Spring Channel // 設(shè)置重連監(jiān)聽(tīng)器關(guān)鍵 this.mqttClient.setBufferedMessageControl(new BufferedMessageControl() { Override public void onBufferedMessagePublished(String topic, MqttMessage message) {} Override public void onBufferedMessageDiscarded(String topic, MqttMessage message) { logger.warn(Buffered message discarded: topic{}, msgId{}, topic, message.getId()); } }); } Bean public MessageChannel mqttInputChannel() { return MessageChannels.publishSubscribe().get(); } Bean ServiceActivator(inputChannel mqttInputChannel) public MessageHandler mqttMessageHandler() { return message - { String payload new String((byte[]) message.getPayload()); String topic (String) message.getHeaders().get(mqtt_receivedTopic); logger.info(Received from {}: {}, topic, payload); // 業(yè)務(wù)邏輯處理... }; } // 啟動(dòng)適配器在 EMQX 就緒后調(diào)用 public void startAfterEmqxReady() { try { // 先連接 IMqttToken token mqttClient.connect(clientFactory.getConnectionOptions()); token.waitForCompletion(10000); logger.info(MQTT client connected successfully); // 再訂閱避免連接未穩(wěn)就訂閱 token mqttClient.subscribe(inputTopic, 1); // QoS1 token.waitForCompletion(5000); logger.info(Subscribed to topic: {}, inputTopic); // 啟動(dòng)適配器 channelAdapter.start(); logger.info(MqttMessageDrivenChannelAdapter started); } catch (Exception e) { logger.error(Failed to start MQTT adapter, e); // 觸發(fā)降級(jí)邏輯如切換到本地消息隊(duì)列 } } // 重連邏輯由 Spring 管理非 Paho 自動(dòng) Override public void connectionLost(Throwable cause) { logger.error(MQTT connection lost, cause); // 清理資源 try { if (channelAdapter ! null channelAdapter.isRunning()) { channelAdapter.stop(); } } catch (Exception e) { logger.warn(Error stopping channel adapter, e); } // 延遲重連避免雪崩 Executors.newSingleThreadScheduledExecutor().schedule(() - { try { logger.info(Starting reconnection attempt...); // 重連前先清理舊連接 if (mqttClient.isConnected()) { mqttClient.disconnectForcibly(1000, 1000); } // 重新連接 IMqttToken token mqttClient.connect(clientFactory.getConnectionOptions()); token.waitForCompletion(10000); logger.info(Reconnected successfully); // 強(qiáng)制重訂閱繞過(guò) sessionPresent 判斷 token mqttClient.subscribe(inputTopic, 1); token.waitForCompletion(5000); logger.info(Resubscribed to topic: {}, inputTopic); // 重啟適配器 channelAdapter.start(); } catch (Exception e) { logger.error(Reconnection failed, will retry in 2 seconds, e); // 遞歸重試最多 5 次 if (reconnectCount.get() 5) { reconnectCount.incrementAndGet(); connectionLost(e); // 遞歸調(diào)用自身 } } }, 2000, TimeUnit.MILLISECONDS); } // 其他回調(diào)方法messageArrived, deliveryComplete, connectComplete保持空實(shí)現(xiàn)或日志 Override public void messageArrived(String topic, MqttMessage message) throws Exception {} Override public void deliveryComplete(IMqttDeliveryToken token) {} Override public void connectComplete(boolean reconnect, String serverURI) {} }4.4 EMQX 服務(wù)端關(guān)鍵配置項(xiàng)詳解在emqx.conf中必須調(diào)整以下參數(shù)以zone.external為例參數(shù)原始值推薦值說(shuō)明zone.external.max_clientid_len2364防止 Client ID 被截?cái)嘀С指L(zhǎng)、更語(yǔ)義化的 IDzone.external.session_expiry_interval0永不過(guò)期86400顯式設(shè)為 24 小時(shí)避免集群同步延遲導(dǎo)致會(huì)話丟失zone.external.keepalive_max120020 分鐘120必須 ≥ 客戶端keepAliveInterval否則 EMQX 強(qiáng)制斷開(kāi)zone.external.max_inflight201000提高 QoS1/2 消息并發(fā)處理能力減少堆積zone.external.max_mqueue_len100010000增大消息隊(duì)列長(zhǎng)度應(yīng)對(duì)突發(fā)流量authentication.1.backendsbuilt_in_databasejwt或http禁用匿名登錄強(qiáng)制認(rèn)證避免非法 Client ID 沖突注意修改后必須執(zhí)行emqx_ctl cluster join emqxnode1使配置在集群內(nèi)同步并重啟節(jié)點(diǎn)。4.5 生產(chǎn)環(huán)境監(jiān)控與告警指標(biāo)光靠日志不夠必須建立量化監(jiān)控。我們?cè)?Prometheus Grafana 中接入以下指標(biāo)客戶端側(cè)mqtt_client_connection_status{client_idprod-springboot-mqtt-v1.2.3-7a8b9c}1已連接0斷開(kāi)mqtt_client_reconnect_total{client_id...}累計(jì)重連次數(shù)1 小時(shí)內(nèi) 5 次告警mqtt_client_message_delay_seconds{topicsensor//temperature}消息端到端延遲 P95 2s 告警EMQX 側(cè)通過(guò)/metricsAPIemqx_client_connected_count當(dāng)前連接數(shù)突降 30% 告警emqx_session_created_total會(huì)話創(chuàng)建總數(shù)1 小時(shí)內(nèi)激增 500% 告警可能 Client ID 沖突emqx_client_disconnected_total{reasonkicked}被踢出連接數(shù)0 即告警可能認(rèn)證失敗我們?cè)O(shè)置了一條黃金規(guī)則當(dāng)mqtt_client_reconnect_total的增量速率rate在 5 分鐘內(nèi)超過(guò) 0.1 次/秒且emqx_client_connected_count同步下降則 100% 是服務(wù)端配置問(wèn)題立即檢查 EMQX 日志。4.6 壓測(cè)驗(yàn)證用真實(shí)流量檢驗(yàn)重連韌性我們用mosquitto_pub模擬 1000 個(gè)設(shè)備每秒向sensor/123/temperature發(fā)送 QoS1 消息持續(xù) 30 分鐘。同時(shí)人為制造故障網(wǎng)絡(luò)層故障在 EMQX 節(jié)點(diǎn)上執(zhí)行iptables -A OUTPUT -p tcp --dport 1883 -j DROP模擬斷網(wǎng) 10 秒服務(wù)端故障systemctl stop emqx停止主節(jié)點(diǎn) 30 秒認(rèn)證故障臨時(shí)修改 EMQX 用戶密碼觸發(fā)認(rèn)證失敗。壓測(cè)結(jié)果顯示網(wǎng)絡(luò)斷開(kāi) 10 秒客戶端在 2.3 秒內(nèi)完成重連消息丟失率 0.02%QoS1 保證主節(jié)點(diǎn)宕機(jī) 30 秒客戶端自動(dòng)路由到備用節(jié)點(diǎn)重連耗時(shí) 4.7 秒會(huì)話無(wú)縫遷移sessionPresenttrue認(rèn)證失敗客戶端在 3 次重試后停止拋出MqttSecurityException觸發(fā)告警人工介入修復(fù)。實(shí)測(cè)心得壓測(cè)必須包含“故障注入”純功能測(cè)試永遠(yuǎn)發(fā)現(xiàn)不了重連問(wèn)題。我們最初只測(cè)了連接成功結(jié)果上線后遇到網(wǎng)絡(luò)抖動(dòng)就全線崩潰。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄那些寫在日志邊緣的真相5.1 問(wèn)題速查表根據(jù)現(xiàn)象快速定位根因現(xiàn)象最可能根因驗(yàn)證方法解決方案重連后消息全部丟失cleanSessiontrue或sessionExpiryInterval過(guò)短查 Paho 日志CONNACK中sessionPresent字段顯式設(shè)cleanSessionfalsesessionExpiryInterval86400重連日志顯示Connection refusedClient ID 長(zhǎng)度超限或格式非法查 EMQXemqx.log中invalid clientid關(guān)鍵詞縮短 Client ID 至max_clientid_len以內(nèi)或調(diào)大該值重連成功但訂閱失效EMQX 集群會(huì)話同步延遲在不同節(jié)點(diǎn)查/api/v4/clients?clientidxxx的訂閱列表重連后強(qiáng)制resubscribe延遲 500ms 執(zhí)行TLS 模式下重連頻繁失敗SSL 握手超時(shí)或 CRL 檢查失敗Netty 日志中SSLHandshakeException延長(zhǎng)connectionTimeout至 60禁用 CRL 檢查重連后 CPU 占用飆升Paho 客戶端內(nèi)存泄漏1.2.2 版本 Bugjstack查看MqttAsyncClient線程堆棧升級(jí) Paho 至 1.2.5排除舊版依賴日志無(wú)報(bào)錯(cuò)但消息不消費(fèi)Spring Integration 通道阻塞或線程池耗盡jstack查看task-scheduler線程狀態(tài)增大taskScheduler.pool.size檢查MessageChannel是否背壓5.2 那些“看起來(lái)像 Bug”的設(shè)計(jì)事實(shí)“為什么重連后 QoS1 消息重復(fù)”這不是 Bug是 MQTT 協(xié)議的“至少一次”語(yǔ)義保證。當(dāng)客戶端發(fā)送PUBACK后網(wǎng)絡(luò)中斷EMQX 未收到確認(rèn)會(huì)重發(fā)PUBLISH。解決方案是業(yè)務(wù)層做冪等如消息 ID 去重而非試圖禁用重發(fā)?!盀槭裁?EMQX 不支持sessionExpiryInterval0永不過(guò)期”EMQX 5.0 已支持但需在emqx.conf中顯式配置zone.external.session_expiry_interval 0。注意0表示永不過(guò)期但會(huì)占用內(nèi)存不推薦生產(chǎn)環(huán)境使用。“為什么MqttMessageDrivenChannelAdapter不提供resubscribe方法”因?yàn)?Spring Integration 認(rèn)為訂閱是連接建立時(shí)的原子操作。我們必須繞過(guò)它直接調(diào)用MqttAsyncClient.subscribe()并在connectionLost()中手動(dòng)管理。5.3 我踩過(guò)的 3 個(gè)最深的坑坑一K8s Service 的sessionAffinity: ClientIP陷阱我們給 EMQX 集群配置了 K8s Service并開(kāi)啟sessionAffinity: ClientIP期望客戶端始終路由到同一節(jié)點(diǎn)。結(jié)果發(fā)現(xiàn)當(dāng)客戶端重連時(shí)K8s 的ClientIP親和性在連接斷開(kāi)后失效新連接被隨機(jī)分發(fā)到其他節(jié)點(diǎn)而該節(jié)點(diǎn)沒(méi)有會(huì)話數(shù)據(jù)導(dǎo)致sessionPresentfalse。解決方案**關(guān)閉sessionAffinity改用 EMQX 自身的
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
狠狠色 综合色区| 香蕉影院色| www.超碰在线| 国产亚洲99久久精品熟女| 91凹凸在线| 熟女激情网| 超碰永久在线| 大香蕉在线99热| 丁香久月| 久久婷婷五月免费视频| 天天做天天干天天综合网| 青青草原爱爱网| 99综合视频| 久色网五月| 婷婷永久在线| 久久9精品| 91干婷婷| 狠狠爱青青草| 被男人添B超爽视频| 这里只有精品无码| 天天日综合| 色婷婷婷av| 五月深情久久| 97操女视频| 婷婷五月天综合网| 天天操综合网| 99re6在线视频精品免费| 可以看的av| 丁香成人综合| 婷婷激情欧美| 色婷婷五月天综合网| 久青青久| 婷婷色播六月无码| 久久这里只有精品视频26| 九九AV| 日本全黄一级999| 日本乱子人伦在线视频| 成AV人片一区二区三区久久| 97久久人人人干| 久久综合丁香激情五月| 99热这里有精品| 99色在线观看视频| 亚洲色网址| 超碰a女人的天堂| 五月丁香狠狠| xx久久| 日本色狠狠| 99er久久| 超碰不卡在线| 婷婷五月天基地| 超碰免费人妻| 色婷婷av在线观看| 级人人91| 欧美视频五区| 影音先锋女人av鲁色资源网小说免费 | 精品9l九九九九九77777| 亚洲视频一区| 色九九一二| 久久久91精品| 99精品一二三四视频| 色噜久| 丁香五月天天| 玖玖在线视频福利| 开心五月色婷婷综合开心网| 天天干天天干天天| 久久9视频| 婷婷五月丁香六月| 91女人18毛片水多国产| www.maotanji.com| 性爱在线播放av| 九九家庭影院| 色五月综合| 免费啪啪亚州视频| 人妻丰满精品一区二区A片| 中文字幕乱码亚洲精品一区| 天天综合91入口| 91色九| 亚洲另类电影| 欧美va在线| 婷婷五月天美女21p| 色热久| 婷婷婷婷色| 99热这里只有精品在线| 91操在线| 99热在线免费观看精品| 这里只有精品视频免费在线观看| 色婷婷99| 在线观看免费狠狠色丁香香综合| 日日天天操| 天天摸色吧天天摸色吧| 色一情一乱一伦一区二区三区| 99燥99日| 丁香五月AV综合| 丁香五月婷婷色播艳门照| 六月综合婷婷开心伊人| 被强行糟蹋的女人A片| 九九九九热99超碰| 五月婷婷五月天激情视频| 怡红院院久久| 日韩aaaaa| A片天天| 99男人的天堂| 九九色综合九九色| 五月丁香婷婷伊人| 五月天色狠狠| 五月丁香大香蕉| 久久婷婷五月天丁香| 97超级操操| 五月丁色AV| 色五月女| 中文字幕操比影片| 亚洲99在线| 日本久久婷| 天天草女人| 97超碰在线免费观看| 色婷婷欧美在线| 亚洲六月婷婷| 久久99精品久| 性生活久久人妻| 日本三级韩三级99久久| 五月婷婷深深爱| 五月丁香色婷婷熟女| 91爱啪啪| 成人婷婷| 色区久久| 99爱视频在线观看| 久久久婷丁香五月| 97婷婷丁香五月| 丁香五月成人| 天天色天天爽| 丁香五月天社区| 99九精品| 九月婷婷激情| 久久HD| 成人va在线播放| CHINESE熟女老女人HD视频| a九九热www| 丁香色婷婷五月天| 欧美网站视频4399| 操九色| 超碰自拍天堂| 色久综合| 操操国产| 五月色综合| AV在线大香蕉| 99热免费| 第六色在线| 天天做天天爱| w婷婷五月婷婷w| 色区久久| 丁香色五月婷婷91桃色| www.激情五月天.con| 性99网站| 影音先锋偷偷色男人站| 97干欧美| 色青青五月| 99精品热| 五月天激情电影| 久在热99| 激情爱爱网站| 亚洲精品乱码久久久久99| 天天天天天天操| 久久婷婷五月天| 97人人操人人干| 九热...av| 亚洲色五月| 97碰在线| 精品一二三区久久AAA片| 在线A色| 超碰人人插| 热久视频| 国产成人网| 天天操比比| 亚洲网站在线鸭子av| 天天插天天干| 最近中文字幕大全免费版在线| 激情五月丁香五月| 激情婷婷五月天在线观看| 超级久久久| 狠狠插狠狠操| 九九激情网| 538在线精品| 六月婷婷影院| 9久久久久久久久久久| www,天天干| 欧美婷婷五月无砖| 91久久五月天| 久久AV无码精品人妻系列试探| 97韩国久久电影院| 丁香五月天激情| 丁香五月大香蕉| 五月婷婷激清网| 丁香婷婷午夜| 无码日本精品XXXXXXXXX| 久久人妻超碰一区| 久久九区| 丁香五月综合在线观看| 蜜乳9188| 婷婷五月色综合| 99综合网| 五月婷婷激情综合| 日日爱激情| 殴美日比视频| 人操91在线| 日日噜狠狠| 五月丁香成人版| 狠狠色综合网站久久久久| 久久久久er热| 色婷婷超碰| 久久婷婷五月草视频在线播放| 9久操| 欧美在线视频99| 国产婷婷五月天| 99re热在线视频| 91无码色色| 26uuu精品一区二区| 五月天欧美 另类小说| 国产激情在线| 激情淫乱男女| 丁香五月婷婷影视先锋| 熟惀91九色在线| 久久免费操| 69激情小说| 九九这里是免费的视频5| 欧美日韩二区在线| 国产99久久久国产精品免费看| 婷婷爱五月| 五月婷婷六月激情网| 99九九热在线观看| 五月婷婷丁香大陆免费| 99视频91| 婷婷色在线播放| 中国女人做爰A片| 99综合| 免费啪啪亚州视频| 色九九九九| 五月天成人小说网| 丁香五月天在线| 丁香五月天婷婷久久| 久久HD| 九色色| 狠狠色激情在线| 国产67194| 激情综合色婷婷啪啪六月天| 在线观看亚洲AV| 31色区视频免费看| 一起操 91N.com| 色婷婷激情Av久久久| 99久视频| 色色婷婷丁香| 丁香婷婷综合激情五月色| 日日夜夜天天综合| 九九色逼| 九九一区| 丁香五夜激情四射夜夜夜| 人操综合| 密臀av无码人妻精品| ai97re99一本| 九九精品少妇| 六月婷婷久久| 婷婷综合欧美| er99免费视频在线| 婷婷五亚洲| 六月丁香激情综合| av狠狠操| 日本99视频| 国产成人综合网| 91天天操天天干天天射| 欧美丰满熟妇BBB久久久| 亚洲乱码日产精品BD| 久久久国产精品黄毛片| 五月丁香花激情啪啪网| 免费播放片大片| 亚洲午夜一区二区| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 无码激情AAAAA片-区区| av操B网站| 国内9l视频自拍老熟女九色| 久久9视频欧美| 99亚洲精品视频在线观看| 久久网站免费亚洲| 5月婷婷激情网| 骚货艹网站视频| 亚洲色频| 成人做爰高潮A片免费视频| 国产SUV精品一区二区6| 丁香综合久久| 第2色五月婷| 26uuu国产精品| 伊人狠狠干| 无码色色色| 97碰| 久草婷婷在线| 五月丁香啪啪啪综合网| 99色爱| 精品久久这里热66| 丰满少妇猛烈A片免费看观看| 亚洲超碰青涩| 婷婷在线视频| 久久丁香五月天| 中文字幕在线日亚洲9| 精品无码久久久久久久久| 91免费啪视频| 激情五月天在线观看婷婷| 色色 9| 综合啪啪| 性爱五月婷婷| 丁香五月在线视频黑人| 狠狠插狠狠插| 青996青| 色VA| 婷婷色播婷婷| 六月丁香激情| 婷婷五月天成人综合网| 久久久久人妻| 天搞天天天天天| www.色色色色| 婷婷色色综合| 综合激情网| 久青操| 欧美成人在线观看| 六月色伊人婷婷| 狠狠草在线观看| 99在线精品视频| 99久精品视频| 思思热99热| 天天日天天插| 五月综合亚洲色| 五月丁香婷婷五月| 韩日AV片| 这里只有精彩亚洲视频推荐| 粉嫩AV久久一区二区三区| 五月丁香久| 婷婷久久综合久色| 在线五月婷| 色五月婷婷激情综合网| 婷婷成人视频| 丝袜大香蕉| 色五月五月婷婷| 久久久久久五月天| 亚洲综合婷婷六月丁香五月| 精品久久久91久久影视网| 九九九九国产| 丁香六月啪| 日韩视频女神99| 夜夜爽天天日| 日逼影音先锋AV男人资源站| 深情五月天| 香蕉网婷婷| 天天模,夜夜模夜夜爽| 久久色区| 亭亭丁香aV| 久久草大香蕉| 激情五月天在线观看婷婷| 丁香五月婷婷超碰在线| 色九九综合| 亚洲综合草草| 亚洲五月天,激情视频| 91操片| 4399在线观看免费高清黄色视频| 99热亚洲精品| 99re热在线视频| 天天操无码| 丁香五月人妻| 日本丁香五月| 综合激情综合啪啪| 综合另类激情| 色五月激情网| 亚州精品色情无码A片| 欧美色宗和激情| 丁香六月婷婷色播| 香蕉综合网| 色播综合| 丁香五月五月婷婷欧美大香蕉| 玖玖色资源站| av网站免费在线| 丁香婷婷五月基地| 一本久道综合99| 欧美日韩91| 久久久久婷婷五月热综合| 丝袜大香蕉| 丁香五月婷婷呀| 色吧婷婷五月亚洲| 99热在线看片| 欧洲亚洲免费视频9| 99色在线视频| 五月婷婷综合精品| 秋霞免费三级片| 99热免费| 播五月开心婷婷欧美综合| 久久婷五月婷| 免费在线观看AV网站| 9久热这里只有精品| www.精品久9| 九九综合| 五月激情五月婷婷五月天在线| 亚洲欧美国产A片免费观看| 婷婷狠狠97| 色婷婷五月天av在线| 性生生活大片又黄又| 色色色色色色色色综合网| 精品99在线观看| 激情丁香五月天| 丁香婷婷久久综合在线| 激情九月婷婷| 色9999综合久久| 午夜色婷婷| 婷婷五月天色网久| 久久久精品AV| 国产免费一区二区三州老师F1……| 久久婷婷综合国产| 狠狠色综合网站| www.99精品视频| 人妻丰满精品一区二区A片| 99久久6| 色综合久久五月| 97操碰免费视频| 五月天婷婷久久视频| 九九热视频免费| 99,色| YW无码| 五月婷婷综合网| 丁香五月天激情综合| 激情五月天啪啪| 色五月婷婷操逼| 色亭亭九月| 九九Av| 久久激情天堂| 丁香六月情| 天天综合天天做天天综合| 久久婷视频| 色婷婷网大全在线| 99ER热精品视频| 91性高潮久久久久久久久| 亚洲经典小视频| 五月天婷a在线| www.婷婷,com| 婷婷久久影院| 九月婷婷在线观看| 国产亚洲99久久精品熟| 亚洲亚洲人成综合网络| 丁香成人五月天| 丁香婷婷九月| 欧美影院| 99精品在线| 久久小片| 夜夜操,天天撸| 天天做天天干天天综合网| jiujiu热在线视频| 全亚洲最大的婷婷五月天网站COM| 六月丁香成人| 888久久久| 色婷婷在线视频观看| 国产69久久久欧美黑人A片| 婷婷激情九月| 色综合色色| 五月丁香啪啪啪| 婷婷五月丁香综合激情| 色婷婷电影网| 午夜婷婷久久| 爱久综合| 日日杆天天| 婷婷五月天av| 久久亚洲婷婷| 精品少妇人妻AV无码专区偷人| 婷婷另类小说| 五月婷婷激情综合| 操碰色一区就去操| 激情婷婷在线| 9热在线视频精品| 99在线小视频| www.日韩国产| 99视频内射三四| 婷婷五月天成人导航| 九九综合精品| WWW丁香五月| 六月婷婷狠狠| 五月丁香激情深爱婷婷| 丁香五月六月综合欧美| 婷婷五月天激情小说| 成人五月丁香社区| 激情综合五月婷婷| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 五月天婷婷丁香| 激情五月婷婷综合| 精品视频二级九九| 六月婷婷七月丁香| 日日噜噜久久婷婷五月天| 激情五月综合免费| 久热网在线视频| 丁香五月天婷婷中文字幕| 另类激情五月| 国产成人精品一区二三区熟女在线| 成人.在线日韩| 丁香五月桃花在线激情综合| 最新色色五月天| 五月色丁香综合| 玖玖九九99| 桃色激情网| 五月丁香婷婷基地| 日本黄色三级片内射| 97超碰色| 婷婷丁香69精华| 丁香五月激情澎湃一区| 九九色大香蕉| 五月丁香花成人社区| 9久久久| 久久免费精品小视频| 春色激情第四色| 六月丁香激情网| 99热官网精品在线| 人人操人| 亚州激情在线视频| 色九九九九| 日日夜夜狠狠| 丁香六月婷婷久久高清| 99热这里有精品24| 色999五月色| 玖玖爱伊人网| 好好干Av| 婷婷激情人妻| 大香蕉丁香婷婷| 激情文学久久| 激情六月天婷婷| 婷婷综合五月| 欧美三日本三级少妇三99| 操国产人妻| 亚洲九九视频| 在线成人va| 久久 婷婷 五月天| 久久机热/这里只有精品| 99精品免费| 色播五月综合网| 综合视频五月| 九九热视频在线观看| 五月丁香色婷婷色| 色综合色综合色综合| 五月天另类激情在线| 五月天激情图片网| 99色最新在线视频网站| 成人午夜天| 五月天激情小说| 五月婷婷五月色| 日本三级99人妇网站| 丁香五月综合久久八| 国产婷婷综合| 91 原创 在线 九色| 26uuu91| 成人日韩欧美| 五月花综合网| 深爱激情综合| 99热最新精品| 天天舔天天爽| 久久9视频欧美| 99热爆在线| 欧洲亚洲免费视频区| 91九色在线| 99啪啪网| 色情久久久| 日韩黄色电影| WWW,五月| 婷香五月| 九色婷婷| 79精品在线视频| 99精品性爱| 91超级碰| 亚洲人妻av伦理| 99在线观看精彩视频| 色噜噜狠狠一区二区三区| 影音先锋一区| 丁香五月大香蕉| 五月激情综合网| 亚洲中文字幕AV| AV在线中文| 在线中文av| 色色色99| 狠狠操狠狠插| 五月婷婷深爱六月| 日本在线观看aaa 99| 色色色色色色色色色色色色色色,网站| 五月丁小婷婷激情四射| 激情丁香图片| 亚洲视频操| 亚洲色啪| 亚洲狠狠狠色婷婷综合激情久久久| 国产特级毛片AAAAAAA高清| 婷婷久久大香蕉| 黄桃AV无码免费一区二区三区| 99在线观看精品| 国产精品成人AV在线| www.99在线| 婷婷六月色| 激情综合婷婷| 超热久碰.com| 日韩九九| 五月丁香六月婷婷手机无线| 色婷婷AV五月天| 91人无码久久久久久| 毛片新网地| 日本ww亚洲| 国产三级片91| 97操资源婷婷| 丁香六月婷婷综合色| 国产综合网在线| 99热91| 热热99爱爱| 国内婷婷丁香社区在线播放| 日韩成人AV在线播放| www久久久久久久久久久| 丁香婷婷九月| 五月天综合在线观看| 日本三级韩三级99久久| 好色婷婷| 色狠久| 性做久久久久久久免费看| 玖玖99免费视频| 这里只有精彩亚洲视频推荐| 婷婷丁香六月天| 色五月天丁香婷婷| 伊人五月综合网| 成人无码精品1区2区3区免费看| 91九色无码日韩| 九九伦子片| 久久国产精品乱子伦_靑青草…| 99热在线播放| 91熟妇大香蕉| 开心五月色婷| 99精品在线观看| 五月婷婷丁香综合| 日本九九视频| 国产婷婷五月| 无码网站视频| 九九精品免费视频99| 五月天激情偷拍| 色狠狠综合| 精品人妻在线| 免费亚洲婷婷五月| 日本99婷婷| 丁香婷婷五月基地| 国产精品成av人在线视午夜片| 亚洲久久视频| 色九月| 九九热99re8热免费观看| 五月天丁香综合| 操日本三片99| 97色啪| 五月色亚洲| 日屌日日操日日色| 高清 码 免费看片短视频| 五月天六月婷婷电影| 91丁香色| 开心五月深爱激情| av不卡网站| 伊人五月天婷婷| 色欲AVV| 久草xx性爱视频| 不卡在线中文字幕无| 深爱网深爱综合网| 大香蕉220| 初夜av| 99人妻碰碰久久久禁片| 九九久久综合网站| 色五月在线综合| 天天婷婷色六月| 色开心五月婷婷丁香HD| 色五月六月| 色欧美日| 91热99| 伊人五月天综合网| 91精品91久久久中77777| 激情婷婷五月天网址| 中文幕无线码中文字蜜桃| 亚洲Av入口| 伊人大香蕉毛片| 免费视频99| 超碰男人色| 五月丁香在线观看| 99色1| 97操碰日本女人| 精品99在线观看| 日本久久99| 另类色视频| 99精品偷自拍| 日夜夜久久| 亚洲色综久久五月| 丁香婷婷色五月激情综合| 久久6这里只有精品| 五月天丁香久久综合| 夜夜操夜夜操| 色婷婷99| 99热爆在线| 欧美Va婷色| 99re6热在线精品视频播放速度| 婷婷激情四射| 新伍月婷婷| 任你擦免费视频| 99热综合| 婷婷性爱五月天| 爱射综合| 免费91久久精品| 亚洲精品在线视频| 色久婷婷网| 日韩欧美婷婷丁| 成人在线网址| 激情五月婷在线精品| 爆乳熟女一区二区三区爆乳| 综合色色网| 天天干天天爽天天爽| 怡春院久操| 99精品视频在线观看| 日韩色五月| 婷婷香香五月| 日韩成人电泉AV| 久久综合九九| 五月婷婷色激情| 亚洲午夜av| 婷婷丁香五月天综合在线日韩| 五月婷婷激情中文字幕| 五月丁香婷婷激情在线| 日本一毛片| 97色五月婷婷在线| 婷婷综合久久| 五月丁香婷婷成人网| 99 热| 五月丁香最新| 国产偷人爽久久久久久老妇APP| 97干婷婷| 我要射综合| 五月天综合网| 999久久久国产精品| 亚洲视频一区| 26uuu精品国产| 九九视频这里只有精品| 日操五月婷| 国产精品久久..4399| 国产精品男人AV不卡| 色五月婷婷网| 99久在线精品| 婷婷深爱五月| 综合色色婷婷| 婷婷天天舔| 香蕉综合在线| 亚洲无码成人网| 国产精女同一区二区三区久| 五月天开心网| 五月婷婷香| 五月丁香久久| 五月色婷婷综合| 婷婷丁香基地在线| 99re思思在线视频| 久热大香蕉| 97黑人精品区| 人妻激情网| 99色综合久久| 久久久天堂国产精品女人| 五月在线| 在线99热| 另类视频综合| 91碰| 中文字幕成人影视| 欧美五月婷婷| 亚洲五月花| 五月婷婷视频28| 丁香五月深爱五月婷婷| 99er这里只有精品视频| 7777激情基地| 黄网在线免费观看| 成人在线网| www99精品| 久热AA| 丁香久久综合| 久久色五月| 人人干99| 久久资源网五月婷| 丁香激情网| 另类专区在线| 五月色网| 开心六月婷| 噜综合| 九九综合精品| 五月天成人在线精品| 天天爱天天做综合| www.日日夜夜| 996热re视频精品视频这里| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 999热在线视频| 色综合久久天天综合网| 一本久道综合色婷婷五月| 久久综合爱| 久久伊人大香蕉| 中文字幕 中文字幕明步| 天天做天天爱| 日本熟妇乱妇熟色A片蜜桃| 国产成人AV| 日本91在线播放| 婷婷五月天激情丁香| 毛片色五月| 九九热最新| 五月丁香91| 欧美25p| 色色无码| 日韩国产AV播放| 自拍视频在线观看9| 日本久久99久久| 色色丁香五月天| 99热这里只有精品268| 亚洲色色爱| 五月天婷婷黄色| 天天做夜夜爽| 狠狠干狠狠色| 国产午夜成人免费看片无遮挡| 狠狠婷婷日韩| 色婷婷成人网| 五月人妻婷婷| 六月激情久久| 久久人妻久久| 婷婷久久色五月婷婷久久久| 五月丁香久久综合色| 99自拍视频| 丁香五月天婷婷中文| 亚洲精品国产精品乱码视99| 色综合色五月| 成人亚洲精品久久久久| 丁香五月综合首页| 久久婷婷五月国产色综合激情| 狠狠色激情综合| 丁香五月婷婷香| 99热这里是精品| 99热综合在线观看| 亚洲综合久| 婷婷五月丁香伊人网| 色五月婷婷综合在线| 99热啪啪| 黄色一极大片| 色婷婷成人影片| 五月丁香六月婷婷啪啪| 丁香五月偷拍| 九九热在线视频观看免费10| 99免费视频久久| 99热精品在线免费观看| 五月天激情图片| 五月天堂六月丁香亚州中文字幕久久| 操人无码| 色播激情五月天| 91超级碰碰| 久久婷综合网| 婷婷成人丁香色情基地30 | 精品少妇蜜臀91| 日本啪啪天堂| 第四色色六月色综合| 开心婷婷中文字慕| 99这里只有精品视频| 1000部毛片A片免费观看| 7777精品伊人久久久大香线蕉最新版| 亚洲色婷婷99一9|| 色色激情网| 就爱日五月天| 五月丁香激情五月天| 婷婷五月天AV| 久久性综合| 青青草性爱视频| 婷婷色片| 99综合入口| 丁香桃色综合网| 五月婷婷五月天| 丁香五月 无码| 五月激激网w'w'w| 久久婷五月天| 人妻激情视频| 色综合综合网| 疯狂做受XXXX高潮A片| 婷婷五月天奸女| 激情五月天激情五月天| 丰满少妇猛烈A片免费看观看 | av一区二区电影免费在线观看| 这里只有视频精品| 久久97| 久碰婷婷视频| 可以看的AV| 99久久欧美| 伊人五月久久| 超碰免费在线| 青青草原中文字幕| 日韩啪啪视频| 六月婷欧美| av人人干| 久久天堂色| 午夜电影网VA内射| 蜜桃五月天| 99精品国产在热久久| 日本99在线视频| 日韩av高清| 五月丁香六月婷婷亚洲| 免费视频WWW在线观看网站| 亚洲永久免费| 日韩成人av在线| 在线伦子99热| 丁香色婷婷五月天| 国产91在线视频| 狠狠操狠狠狠| 久久9热好| 亚洲激情免费久久| 91日本在线观看| 久久er免费视频| 色五月成人| 亚洲AV综合在线观看| 色五月综合资源推荐| 六月丁香天堂| 俺去也在线官网| 国产精品久久久久9999小说| 色婷激情网| 99精品偷自拍| 五月激情婷婷播播网| 综合激情站| 色色精品色| 久综合网| Av狠狠色丁香婷| 五月天色五月| 成人精品一区二区三区四区五区| 色色色色综合网| 亚洲一色色色色色色色色| 99视频精品在线| 99视频精品视频| www.狠狠| 久久婷婷五月激情网站| 四虎99热在线观看网站| 五月天激情.com| 丁香五月很很肏| 色色网站| 99热最新精品| 可以免费观看的AV| 偷偷狠狠久久婷婷五月天| 欧洲色| 五月丁香亚洲五月| 99日热在线视频| 成人色五婷婷| 9久久久| 99啪啪视频| 另类视在线| 久久国产色| 性 色 婷婷| 国产午夜伦鲁鲁| 久久五月天激情| 99乱视频| 五月丁香六月婷婷网| 天天综合天天做天天综合| 五月丁香婷婷成人网| 五月婷视屏在线观看| 激情文学第四色婷婷丁香五月| 91色在线/日韩| 日韩一66精品| 玖玖婷婷免费| 久久看婷婷| 99爱这里只有精品| 深夜婷婷 丁香| a久久| 婷婷激情五月天网站| 日本欧美成人片AAAA| 99久热这里只有精品| 激情五月天啪啪| 色情婷婷| 天天做好综合色| 久久精品63| 亚洲视频一区| 亚洲色vA| 国产亚洲成AV人片在线| 99色网站| www.婷婷五月天啪啪| .comwww在线观看免费操| 色欲色香综合网| 五月天婷婷影院影院| 久久Xx| 成人视频一区| 欧美激情综合色综合色| 五月天堂色| 欧美精品在线观看| 九九热re99re6在线精品| 五月丁香啪啪拍| 精品一区二区三区三区| 九九色影院| 色色亚洲视频| 婷婷六月丁香在线| av成人在线播放| 久久久精品人妻| 天天日天天爽夜夜爽| 婷婷久久婷婷色五月| 天天操天天插天天射| 九九视频在线| 丁香五月婷婷视频| 色色色视频| 久久婷婷色综合| 99热超碰在线| 丁香久月| 色婷婷综合网站| 99久re热视频精品98| 中文字幕av网站| 成人精品视频99在线观看免费 | 超碰激情网| 婷婷丁香77777| 99九九视频| 大香蕉丁香五月| 天天操婷婷| 五月丁香啪| 五月丁香婷婷激激激综合网色播| 伊人色综合影院视频| Caoub青青超碰| 国产成人精品一区二三区熟女在线| 99在线免费观看| 亚洲丁香五月在线观看| 亚洲在线资源| 亚洲成人AV在线| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 免费黄色视频网址| 这里只有精品免费| 秋霞影音91人妻久久| 亚洲成人网站在线观看| 久草a片| 97超碰色| 国产亚洲精品AAAA片APP| www99热| 婷婷激情九月| 日本色色色| 97韩国久久电影院| 激情五月丁香色婷婷| 丁香五月色色| 99九九在线精品热动漫| 殴美日韩成人| 91女人18毛片水多国产| 五月婷婷色欲| 丁香色色网| 99riAv1国产在线观看| 亚洲另类视频| 嫩草AV久久伊人妇女超级a| 天天成人综合| 天天激情视频| 色频玖玖五月天| 人人爽天天莫| 婷婷开心深爱五月天| 91人人超碰在线| 日韩99视频| 在线观看亚洲视频影院| 久热伊人在91| 天天射色五月天| 九月大香蕉| 99热综合在线观看| 在线观看日韩12345区| 射婷婷中文字幕| 第九色区av天堂| 99热在线观看| 中文字幕丰满孑伦无码专区 | 婷婷五月丁香超碰| 99视频网址| 五月婷婷六月丁香| 99ri精品在线| 91操熟女| 色五月综合在线| 99无码黄色视频| 99精品视频在线观看| 色五月婷婷亚洲| 丁香五月av| 蜜桃人妻无码AV天堂三区| 婷婷五月激情综合| 成人国产欧美大片一区| 男同91 | 99热91| 97啪啪| 国产精产国品一二三在观看| 丁香五月天激情| 中文字幕丰满孑伦无码专区 | 俺去也婷婷| 日本三久久| 五月天激情电影| 激情综合五月| 国产精产国品一二三在观看| 91av传媒高清在线视频网| 日韩艹比| 热九九九九| 一级性感黄色内射视频| 97操在线视频| 五月婷高清视频| 五月深爱网| 99视频在线| 中文字幕视频在线播放| 色婷五月天| 色五月激情五月| 奇米影视在线视频| 成人精品人妻| 97福利视频| 激情亚洲色图片丁香综合| 99色色色色| 超碰成人av| 婷婷综合久久| 亚洲综合色激情色五月| 久久9热| 99综合视频一体| 另类小说五月天激情| 五月天国产| 狠狠色综合网| 97超碰免费超级在线观看| 免费成片在线观看| 日韩性视频| 人人色AV| 丁香五月人妻| 久久九九网| 亚洲电影中文字幕| 色综合久久久久| 婷婷五月天伦理| 这里只有精品视频在线| 国产亚洲99久久精品| 去色色五月天| 色婷婷狠狠18禁| 严洲天天插| 翔田千里 50岁 无码| 开心激情婷婷| 亚洲av无码精品色午夜| 亚洲激情淫网| 天天天天天日| 久久久激情| 伊人久久中文网| 五月情四婷婷| 五月六月丁香激情| 色情成人五月天| 天堂综合久| 天天AV导航网| 久久色五月天| 激情都市另类| 久久五月婷婷视频| 五月婷婷六月丁香激情深爱| 久久机热/这里只有精品| 亚洲中文字幕网| 97干资源在线观看| 六月欧美综合色情| 香焦网五月天| 亚洲无AV在线中文字幕| 991国产精选视频在线播放下载| 丁香婷婷五月天色播| 久久婷婷啪啪视频| 色欲色欲久久宗合网| 99色在线视频| 激情五月天小说网| 嫩草AV久久伊人妇女超级A | 色99欧洲色19| 五月激情综合网| 五月天婷综合| 99综合一区| 久青草影院| 色九亚洲| 超碰1999| 色五月丁香网| 激情五月丁香色色去久久| 狠狠操狠狠狠| 色色婷婷五月| 1024操逼视频| 天天狠狠干| AV片一区在线观看| 99日本在线| 思思国产99| 影音先锋91在线资源站| 五月丁香六月综合情在线观看| 五月天久久婷婷| 青吴乐视频| 在线色五月婷婷| 中文字幕 中文字幕明步| 在线看黄色| 99热这里只有精品最新网址| 亚洲成av人影院| 日韩色色色色色| 91婷婷色| 无码橾| 五月天婷婷久久视频| 无码成人播放器| 97激情五月天| 中文字幕在线日亚洲9| 停停六月 综合| 激情五月视频在线婷婷| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 91av视频| 狠狠干 狠狠操| 韩日另类| 翔田千里aV中文字幕| 99精品在线播放| VA日本视频| 91婷婷| 天堂中文国产| 五月综合丁香婷婷| 人人干女人| 丁香五月激情在线| 丁香五月天婷婷大香蕉| 五月婷婷六月少妇激情| 婷婷9月天| 九玖欧洲亚洲| 婷婷丁香色五月天| 久色网五月| 99se丁香| 激情五月婷婷综合视频| 国产午夜精品一区二区三区四区| 九色成人AV在线| 全部老头和老太XXXXX| 日日干日日色| 26uuu最新地址| 色,激情五月天| 久久久久这里只有精品| 激情网战码亚洲A| 日韩欧美一级大黄网站| 99综合网| 99熟女| 五月丁香六月婷精品视频| 一起草AV| 热久久66| 2015在线中文字幕| 五月开心深爱激情网| 在线播放 精品| 天天干天天干天天操| 夜夜久久综合网| 超碰操网| 亚洲永久四色| 五月丁香激情综合网| 爱草视频在线观看| H亚洲| 五月天婷婷影院影院观看| 亚洲午夜一区二区| 婷婷99| www天天干| 99在线精品免费视频| 丁香五月综合在线观看| 婷婷刺激综合| 色综合色色| 五月激情婷婷图片基地| 丰满少妇乱A片无码| 深情五月天| 91人妻人人操人人爽| 人妻av在线| 丁香婷婷偷拍| 丁J香六月首页| PORNY九色9l自拍视频成人| 99九九精品| 无码激情AAAAA片-区区| 亚洲精品激情| 在线中文字幕视频| www.五月天色色.com| 丁香色情五月天| 一级黄色片看看| 色五月色图| 婷久看人爽| 亚洲第一成人AV| 天天操加勒比| 激情五月丁香色婷婷| 日韩性爱无码| 伊人久久大香网| 五月丁香综合伦理片| 成人在线高清| 丁香六月啪| 婷婷五月丁香综合人妻| 久久精品五月天| 久久AV无码精品人妻系列试探| 婷婷五月激情丁香| 色视频2025| 91聚色综合网| 狠狠综合久久| 激情五月丁香激情综合网| 色五月激情综合| 婷婷视频网| 色五月中文网| 丁香五月天天日| 日本97在线视频| www.99热|