久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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)開發(fā)中幾乎等同于“深夜告警電話響起”的前奏。我第一次在某能源監(jiān)測(cè)平臺(tái)上線后第三天凌晨?jī)牲c(diǎn)被叫醒就因?yàn)?Spring Boot 應(yīng)用連接 EMQX 后每 47 秒斷開、3 秒內(nèi)重連、再斷開……循環(huán)往復(fù)日志里堆滿Connection lost和Attempting reconnect而設(shè)備上報(bào)數(shù)據(jù)卻像被掐住喉嚨吞吐量跌到正常值的 12%。這不是配置沒點(diǎn)“重連開關(guān)”那么簡(jiǎn)單也不是加個(gè)Scheduled手動(dòng) ping 就能糊弄過去的事。它背后是 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)境里“按在地上摩擦”后重新拼出完整因果鏈的過程。適合正在用 Spring Boot 接入 MQTT 消息中間件的后端開發(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é)。接下來所有內(nèi)容都圍繞這三者的咬合縫隙展開。2. 整體設(shè)計(jì)思路拆解為什么“開重連”反而讓系統(tǒng)更脆弱2.1 不是所有重連都叫“可靠重連”很多開發(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ā)來的 5 條報(bào)警消息全丟了還得手動(dòng)去數(shù)據(jù)庫(kù)查歷史記錄補(bǔ)漏。我們當(dāng)時(shí)線上問題的根因之一就是誤以為“連上了消息通了”實(shí)際是“連上了從零開始”。提示Spring Boot Starter for MQTT如spring-integration-mqtt默認(rèn)創(chuàng)建的MqttPahoClientFactory實(shí)例其cleanSession屬性為true且無顯式配置入口。你必須通過自定義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ì)話過期時(shí)間和max_clientid_len客戶端 ID 長(zhǎng)度限制。前者決定了 EMQX 在客戶端斷開后最多保留該會(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ā)客戶端無限退避重試exponential backoff日志里卻只顯示Connection refused根本看不到 Client ID 被截?cái)嗟奶崾?。后來?EMQX 的emqx.log才發(fā)現(xiàn)一行invalid clientid length: 36 23。這說明重連失敗的表象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。但問題在于這個(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)還沒完成集群狀態(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é)同把重連問題當(dāng)成客戶端單點(diǎn)問題來解決注定失敗。我們最終落地的方案是三層防御客戶端層禁用cleanSession啟用sessionExpiryInterval8640024 小時(shí)Client ID 固定如springboot-app-prod-v1重連策略改為固定間隔非指數(shù)退避避免雪崩式重連沖擊 EMQX服務(wù)端層EMQX 配置zone.external.max_clientid_len 64zone.external.session_expiry_interval 86400并開啟mqtt.allow_anonymous false強(qiáng)制認(rèn)證杜絕非法 Client ID 沖突網(wǎng)絡(luò)層在 Kubernetes Ingress 層配置proxy_read_timeout: 3005 分鐘防止 Nginx 等反向代理因空閑超時(shí)主動(dòng)斷開長(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)制斷開而 EMQX 的session_expiry_interval又必須大于客戶端重連最大間隔我們?cè)O(shè)為 120 秒否則重連時(shí)會(huì)話已過期。這種參數(shù)間的數(shù)學(xué)約束才是“反復(fù)重連”問題的本質(zhì)。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)從日志里挖出真相的 7 個(gè)關(guān)鍵線索3.1 日志是唯一真相源必須開啟的 4 類日志級(jí)別別信控制臺(tái)打印的Connected to broker那只是 Spring Boot 的樂觀假設(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配置過短客戶端 Netty 日志添加-Dio.netty.logger.levelDEBUG關(guān)注ChannelActive、ChannelInactive、exceptionCaught。當(dāng)出現(xiàn)java.io.IOException: Connection reset by peer說明是 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)期開啟 DEBUG 級(jí)別日志但排查重連問題時(shí)必須臨時(shí)開啟并定向輸出到獨(dú)立文件如mqtt-debug.log否則海量 INFO 日志會(huì)淹沒關(guān)鍵線索。3.2 Client ID 設(shè)計(jì)固定、唯一、可追溯的黃金三角Client ID 不是隨便起個(gè)名字就行。我們吃過虧的三種錯(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)來自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 秒。算下來第 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ì)話過期。最終我們將sessionExpiryInterval設(shè)為8640024 小時(shí)重連策略改為fixedDelay2000ms, maxAttempts5固定 2 秒重試最多 5 次總耗時(shí) ≤10 秒并確保86400 10徹底消除會(huì)話過期風(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ù)組說明同步延遲 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ù)避開同步窗口。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 # ? 這里無法配置 cleanSession、sessionExpiryIntervalspring.mqtt.*屬性只映射到MqttPahoClientFactory的基礎(chǔ)字段URL、用戶名、密碼高級(jí) MQTT 選項(xiàng)如cleanSession必須通過 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ì)話過期時(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í)客戶端斷開即發(fā)送 Will當(dāng)cleanSessionfalse時(shí)只有“首次連接時(shí)建立的會(huì)話被銷毀”才發(fā)送 Will。而 EMQX 銷毀會(huì)話的條件是客戶端以cleanSessiontrue重連或會(huì)話過期。我們最初的 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跳過 CRLEMQX 端關(guān)閉 OCSP Stapling配置listener.ssl.external.ocsp_stapling off增加 TLS 握手超時(shí)options.setConnectionTimeout(60)默認(rèn) 30并設(shè)置options.setKeepAliveInterval(120)TLS 連接?;钚韪L(zhǎng)間隔。4. 實(shí)操過程與核心環(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ì)話過期時(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)聽器關(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)制重訂閱繞過 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ù)原始值推薦值說明zone.external.max_clientid_len2364防止 Client ID 被截?cái)嘀С指L(zhǎng)、更語(yǔ)義化的 IDzone.external.session_expiry_interval0永不過期86400顯式設(shè)為 24 小時(shí)避免集群同步延遲導(dǎo)致會(huì)話丟失zone.external.keepalive_max120020 分鐘120必須 ≥ 客戶端keepAliveInterval否則 EMQX 強(qiáng)制斷開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斷開mqtt_client_reconnect_total{client_id...}累計(jì)重連次數(shù)1 小時(shí)內(nèi) 5 次告警mqtt_client_message_delay_seconds{topicsensor//temperature}消息端到端延遲 P95 2s 告警EMQX 側(cè)通過/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)超過 0.1 次/秒且emqx_client_connected_count同步下降則 100% 是服務(wù)端配置問題立即檢查 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ò)斷開 10 秒客戶端在 2.3 秒內(nèi)完成重連消息丟失率 0.02%QoS1 保證主節(jié)點(diǎn)宕機(jī) 30 秒客戶端自動(dòng)路由到備用節(jié)點(diǎn)重連耗時(shí) 4.7 秒會(huì)話無縫遷移sessionPresenttrue認(rèn)證失敗客戶端在 3 次重試后停止拋出MqttSecurityException觸發(fā)告警人工介入修復(fù)。實(shí)測(cè)心得壓測(cè)必須包含“故障注入”純功能測(cè)試永遠(yuǎn)發(fā)現(xiàn)不了重連問題。我們最初只測(cè)了連接成功結(jié)果上線后遇到網(wǎng)絡(luò)抖動(dòng)就全線崩潰。5. 常見問題與排查技巧實(shí)錄那些寫在日志邊緣的真相5.1 問題速查表根據(jù)現(xiàn)象快速定位根因現(xiàn)象最可能根因驗(yàn)證方法解決方案重連后消息全部丟失cleanSessiontrue或sessionExpiryInterval過短查 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排除舊版依賴日志無報(bào)錯(cuò)但消息不消費(fèi)Spring Integration 通道阻塞或線程池耗盡jstack查看task-scheduler線程狀態(tài)增大taskScheduler.pool.size檢查MessageChannel是否背壓5.2 那些“看起來像 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永不過期”EMQX 5.0 已支持但需在emqx.conf中顯式配置zone.external.session_expiry_interval 0。注意0表示永不過期但會(huì)占用內(nèi)存不推薦生產(chǎn)環(huán)境使用?!盀槭裁碝qttMessageDrivenChannelAdapter不提供resubscribe方法”因?yàn)?Spring Integration 認(rèn)為訂閱是連接建立時(shí)的原子操作。我們必須繞過它直接調(diào)用MqttAsyncClient.subscribe()并在connectionLost()中手動(dòng)管理。5.3 我踩過的 3 個(gè)最深的坑坑一K8s Service 的sessionAffinity: ClientIP陷阱我們給 EMQX 集群配置了 K8s Service并開啟sessionAffinity: ClientIP期望客戶端始終路由到同一節(jié)點(diǎn)。結(jié)果發(fā)現(xiàn)當(dāng)客戶端重連時(shí)K8s 的ClientIP親和性在連接斷開后失效新連接被隨機(jī)分發(fā)到其他節(jié)點(diǎn)而該節(jié)點(diǎn)沒有會(huì)話數(shù)據(jù)導(dǎo)致sessionPresentfalse。解決方案**關(guān)閉sessionAffinity改用 EMQX 自身的
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久97| 午夜福利一区二区影院| av大香蕉网站| 久草综合视频| 97超碰天天爱天天爱| 欧中日成人免费影视| 亚洲熟妇图片| 色悠久久久av| 操迟操逼在巾线Fre看| 夜色91| 97色色色综合网站| 久污| 美女网站91| 免费a v| 一级黄色性爱裸体视频| 亚洲伊人a线观看视频| 国产高清精品一区二区三区毛片| 久久激情亚洲精品无码?V| 老司机射| 中日无幕一二三四区| 欧亚乱色熟一区二区三四区| 福利在线视频一区二区| 91制服丝袜中文字幕| 中文字幕一区二区视频在线观看| 岛国黄| 色情五月综合婷婷| 美腿丝袜偷拍亚洲欧美| 舔人妻中文免费视频| 日韩精品 欧美激情| 日本中文熟女视频| 激情五月综合网| 91久久午夜无码鲁丝片久久人妻| 欧美黑人168页欧美黑人167| 亚洲国产精品久久AV| 黑人精品成人一区二区三区| 久久精品熟女亚洲AV麻豆软件| 91少妇| 操日韩第| 不卡人妻少妇精品毛片一区23区视频| 中出人妻中文字幕91在线| 91爱| 精品视频久久久久九九九九9999| 91色色综合| 天天澡天天狠天天天做| 久久ww| 激情五月天校园春色网| 五月丁香激情综合| 性色av一区二区| 亚洲精品黑丝| 干日本人少妇午夜寂寞影院| 加勒比在线视频| 久草色在线观看| 26uuu性| 伊人青青一区成人视频在线观看区| 九九九九97| 天天躁日日躁xxxxx| 大粗鳼巴久久久久| 天天爽天天| 亚洲素人综合| 亚洲天堂,男人| 67914在线兔费成人视频| **一级毛片国产| 成人综合视频久久| 影音先锋视频在线| 玖玖无码超碰| 国产欧美美女免费观看视频| 日韩免费中文字幕视频| 狠狠躁天天躁日日躁| 亚洲男人久久综合天堂| 伊人96在线| 日韩欧美国产高清视频| 国产久久久久久| 亚洲AV乱码专区国产噜噜亚洲| 国产精品国产精品国产| 99热在线不卡| 丁香婷婷九月| 久久久久9999| 九九九九97| 久久婷婷伊人| 激情抓乳插进去啪啪啪日韩| 男女啊啊啊啊啊| 蜜桃久久久久久久| 日韩不卡av一二三| 欧美色一二三| 超碰97中文| 啊啊啊不要啊啊受不了了视频在线| 欧美日韩免费性爱| 麻豆精品一区二区三区四区免费观看| 丝袜美腿校园春色| 亚洲男人的天堂一区二区| 亚洲综合成人网| 翔田千里AⅤHD无码| 日韩青久久| 超碰99热中文字幕| 久操黄色视频| 婷婷六月色| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 后入内射蜜桃臀| 日本一级性爱| 精品区国产区一区二区三区| 免费精品国偷自产在线在线 | 夜夜爽夜夜操| 日本二三四区| 久久精品超碰| 欧美综合中文| 亚洲高清欧美总合| 97Ai亚洲| 久久久久久久强迫| 日韩日本欧美在线观看| av在线播放国产一区| 美女天天干| 亚洲在线网站| 嫩草影院在线观看精品 | 国产av激情无码久久天堂| 综合另类| 亚洲91在线播放影院| 亚洲精品三区在线观看| 91天堂色男人的天堂| 福利伊人玖玖国产| 99操99| 爽爽淫人网| 精品网站9999| 骚女高跟AV在线| 欧美激情精品久久久| 久久久月天| 久久精品黄色| 国产树林里野战在线看| 少妇二级| 国产乱青青草久久| 久久久精品网站| 麻豆综合一区av| ?亚洲伊人伊成久久人综合网| 激情五月综合| 久久精品成人一区二区三区蜜臀| 亚洲天堂资源在线| 色嗨嗨在线| 日韩精品 资源| 中文字幕人妻色偷偷久久皮| 97久久久久| 国产精品ⅴ无码大片在线看.| 国产激情av女片自拍| 日韩有码一区三区| 久久久免费视频18| 日韩性爱1级片视频| 亚洲中文字幕av| 91殴美大片| 哈哈操 大香蕉| 天天操人人操狠狠插| 丁香五月综合| 欧美激情高清性猛交| 亚洲成人无码影院| 97一区二区三区视频| av影片在线观看不卡| 91精品丝袜在线观看| 人妻无码久久一区二区三区免费| 亚洲伊人久久综合97| 一区二区日韩欧美久久| 热99re69精品8在线播放| 亚洲第一在线视频| 最新制服中文第一页| 大香蕉五月天婷婷| 啊啊啊好大好深| 國產尤物AV尤物在線觀看| 自拍亚洲综合| 九九久久综合| 欧美综合另类| 97国产天堂岛| 国内自拍 日韩激情 99| 另类欧美色| 丝袜 亚洲 偷拍| 91 天天综合| 亚洲日韩AV视色| 天天综合91| 天天看特黄的免费网站| 激情视屏国产乱伦强奸| 啊啊啊啊啊啊啊啊视频| 91黑丝美女| 51一区二区三区| 强乱老妇中文字幕| 91色图片| 天天日天天操心| 91综合网站| 插老姨肥穴| av天堂5| 91美女网站| 亚拍在线| 中文字幕乱码人妻一区二区三区,99精品 | 91精品成人www| 黄色AAAAAAAAAAA大片| 欧美日本不卡在线| 久久久久久久久久久久九| 六月色色| 国产色呦呦| 亚洲日韩精品久久久久一区壹牛 | 国产欧美日韩臀| 色婷婷激情| 亚洲第2页| 国产强奸乱伦无码视频| 青娱乐亚洲自拍| 操九九九九九九| 国产在线综合网| 国产精品日韩在线一区| 啊啊啊想要| 欧美色道啊| 中文字幕十五区| 丝袜综合色图| 欧美性爱一内片一区二区三区| 懂色AV蜜臀无码精品APP| 97亚洲精品超碰| 我爱操| 四季av一区二区凹凸精品小说| 亚洲欧洲中文日韩女优乱码| 天美AV片| 亚洲一区日韩精品中文字幕| 亚洲中文日韩欧美大香蕉视频| 操九九九九九九| 亚洲免费在线探花| 超碰在97| 果冻国产精品麻豆成人av| 91人妻最真实刺激绿帽| juliaann欧美丝袜办公室| 国产精品在线网站| 91美女视频| 啊好大好舒服| 亚洲成人黄色在线观看| 按摩中文字幕| 亚洲色图欧美| 国产欧美日产一区二区三区 - 国产欧美日 | 欧美情色男人的天堂| 妇女性内射冈站HDWWWCOM| 超碰碰激情97+久| 欧美成人四级在线播放| 又大又大又大又粗爽高潮观看| 五月天色电影| 蜜臀久久99精品久久久久久成人小说 | 九九色色| 欧美 亚洲 综合 制服 另类| 欧美懂色综合网| 久久精品国产亚洲AV嘿嘿| 69人妻精品一区二区绯色| 97狠狠| 香蕉热人人精品| 熟女一区二区| 人妻少妇精品一区二区三区| 欧美最婬乱婬爆婬性视频| 久久精品国产99国产精品亚洲| 精品亚洲俞拍视频一区| 60秒不遮不挡| 秋霞成人一级在线观看| 国产免费永久精品无码| 男人的天堂日本东京热| 色悠久| 俄罗斯一区二区视频在线观看| 大地资源在线观看中文第二页| 中文字幕乱码人妻二区三区| 国产一级特黄大片处女| 有码免费观看| 亚洲天在线| 人人做,人人操,人人摸| 精品少妇一区二区三区在线视频| 学生妹天天看| 日韩精品色呦呦| 任你艹| 日日橹狠狠爱欧美超碰| 三男一女不戴套的A片| 日本三级R| 欧美78| 探花精品 一区二区| 无码伊人久久大杳蕉中文无码| 精品久久久久黄少妇| 亚洲欧美97√| 久久久久9| 欧美高潮| 亚洲成人日韩小说| 91成人久久| 综合伊人网12色| 大香蕉宗合网在线| 91亚洲最新在线| 亚洲天堂一区二区久久| 天色综合网| 日韩福利电影网| 婷婷伊人| 亚洲成人ab| 日本熟女中文| 日韩av情韩国爱禁区av一区二区| 国产高潮AA片免费看| 99久热精品99re6热| 青娱乐999| 怡红院怡春院| 操逼无码操逼| 大香蕉99热| 久久天堂| 久草资源在线视频官方总站日韩丝袜美腿 | 欧美一区二区在线资源| 91亚洲欧美| 黄色污污污污污污网站| 无码78| 成人无码在线视频网站| 强免费黄色网址| 台湾佬中文娱乐网久久久久久久久久com| 国内毛片欧美香蕉精品| 国产日韩精品一区二区三区| 欧美黄色手机在线观看| 天天综合网在线| 久久亚洲中文字幕视频| 久草老司机| 日韩性爱高清免费视频| 熟妇视频一区二区三区在线| 日韩丝袜人妻AV| 亚洲国产精品无码AV久久| 亚洲综合色男人网| 成人无遮挡毛片免费看| 午夜AV污污污| 91狠| 亚洲激情综合另类男同| 亚洲怡春院| 综合激情婷婷| 91P0RNY大屁股人妻| 加勒比AV网| 欧美日本中字另类在线| 男人的天堂视频精品乱在线| 中文字幕天天天天天| 日本免费人成视频播放120秒| 亚洲高清少妇| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 超碰这里只有精品| 日本性爱少妇| 1769成人国产精品视频| 9 9无尺码天堂网| 俄罗斯一区二区视频在线观看| 久久久96| 欧美熟女丝袜| av大香蕉| 欧美黄片免费在线观看视频| 久久精品无码专区| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 天天色图| 一二区在线观看视频| 淫淫总合网| 一区二区影院| 欧美在线官网| 影音先锋少妇| 日韩97P| 午夜福利在线合集| 欧美性爱一内片一区二区三区| 黄色区免费观看中文字幕| 91爱| 日韩91网| 2019午夜福利视频| 99热精品青草在线| 日本久久精品| 老司机深夜影院18未满| 亚洲黄片免费在线播放| 69精品| 97国产精品久久久久 | 婷婷五月天激情四射| 激情五月天婷婷| 精产品久久| 久久超碰98| 欧美1727免费观看视频| 丝袜熟女一区二区三区| 欧美性爱18观看| 丰满人妻一区二区三区免费| 9久9久| 91n免费处女| 日欧美色| 美女久久久久久久| 亚洲……91| 91狠狠综合久久| 天天干夜夜一操| 国产最新小视频在线播放下载| 男人天堂欧美| 午夜超碰| 亚洲高清自拍| 欧美综合天天| 久久久久久久人妻丝袜| 欧亚日韩一区在线| 99热| 国产亚洲色停停久久99精品91| 九九九九九九九九九国产精品 | 熟女熟妇一区二区三四区| 亚洲第一视频 欧美风情 日韩| 欧美情色男人的天堂| 亚洲AV成人在线| 日韩性爱免费视频在线网站| 午夜福利在线合集| 成人性爱av.com| 性爱综合一区二区| 日本性爱欧美性爱| 伊人久操| 久久黄黄| 91新在线欧美| 国产第二页| 国产日韩欧美| 97精品视频在线| 亚洲91射| 超碰色97| 尹人免费观看视频在线| 日韩综合无码色欲vv| 思思热久久成人| 欧美日韩 强奸乱伦| 女同性恋久久| 水澄无码AV| 中文字幕 一区二区 亚洲无码| 久久久久日本视| 亚洲综合有玛| 久久久久久久久女黄| 五月天伊人网| 精品亚洲成人免费在线| 亚洲性爱无码乱伦av| 大香蕉伊人久久| 最新加勒比丝袜在线| 天堂麻豆天美| 欧美图片色五月天| 国产综合色精品在线观看| 香蕉热人人精品| a在线视频免费观看| 欧美aaaaaaa| 亚洲人天堂| 国产亚洲性生活视频播放| xxxx网站亚洲精品| 91操人视频| 久久深夜无码| 99re久久| 久热香蕉精品在线视频| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲精品99| 91久久伊人婷婷青青草| 正宗无毛一线天嫩逼| 国产精品人妻免费精品| 男人亚洲91首页在线| 神马福利久草| 9997se| AA级电影三区| 久/久精品99看9| 色五月第四色| 亚洲久久久| 亚洲啪啪视频一区二区| 国产夜夜操| 欧美日韩亚洲少妇寂寞影院正在播放 | 99re这里只有精品中心播放| 日韩AV噜噜噜一区二区三区四区| 先锋激情∨在线视频播放| 蜜臀久久99精品久久综合| 精品无码一区二区人妻久久蜜桃| 日韩三级在线观看网站| 国产999精品久久久久久| 天天综合网AV91| 日韩欧美日韩| 99在线精品视频| 国产97综合| 91在线超高颜值国产| 高清不卡国产| 久久夜夜| 91色女| 好吊色综合| 久热伊人| 殴美色网| 亚洲色啪| 人妻91少妇| 国产又爽又黄| 亚洲情色 自拍| 日本视频一区二区三区| 97AV在线免费观看| 亚洲中文字幕久久人妻| 亚洲限制级| 国产精品一区av在线| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产一区二区在线看| 丝袜美腿制服人妻二区中文字幕| 中文字幕AV片| 国产 无码 一区二区| 青青伊人久久| 美女自卫慰黄网站免费| 中文字幕一区二区三区人妻不卡| av无线看| 天天插天天干| 日韩欧美性爱电影在线观看| 91色噜噜狠狠| 亚洲成人性爱在线观看| 啊啊啊轻点在线观看| 午夜国产成人福利视频| 色综合大香蕉| 九月丁香婷婷| 翔田千里一区二区三区奶水| 日韩 女同 综合| 亚洲第一无码播放立川理惠| 亚洲色性| 久久久99久9| 亚洲国产91精品一区二区久久| 国产极品久久久| 99久久精品无码一区二区| 亚洲好色人妻| 人妻久热在线| 国产精品干干干| 加勒比性爱成人在线| 日本欧美国内在线| 日韩三级在线观看网站| 欧美天天综合站| 91超级碰碰| 香蕉欧美| 亚洲第一男人天堂| av操操不卡| 日韩精品碰碰| 酒色综合网| 性爱网站一区二区| 97久操| 中文字日本乱码| 日本一级性爱| 国产精品视频自拍在线| 国产伊人精品在线| 骚逼一区二区| 色欧美天天| 日本性爰一道本| 91欧美经典| 小骚逼被操的爽不爽| 日本三级大片| 十八禁的黄污污免费网站| 嗯嗯不要视频| 青青草华人在线欧美在线| 欧洲综合视频| 日日操天天操| 亚洲性爱无码乱伦av| 日韩欧美福利视频看看| 国语精品对白| 夜夜夜夜爽| 欧美久久婷| 337p大胆噜噜噜噜噜91Av| 国产对白刺激视频| 日本影视久久免费| 天天欧美| 天天性射网| 日日夜夜模| 口爆欧美91| 精品一区二区3区| 久久人人爽人人爽人人片Ⅴ| 国产精品久久久久久无码红治院| 色综合一本| 日韩三级av片| 五月天精品| 日韩精品电影| 九九自拍伦理| 熟女一区二区三区| 黄色十八禁网站| 国产剧情一区在线观看| 91婷婷| 熟女六十路| AV不卡在线| 亚洲第一免费视频| 99久久精品无码一区二区毛片免费| 中文字幕视频在线观看| www.男人的天堂| 欧美男人的天堂| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | AV有码在线| 夜夜春夜夜操| 久久久久久久久9| 97操综合| 91热| 97色在线视频| 张柏芝国产一区在线观看| 丰满人妻一区二区三区免费| 亚洲欧美黄| 色吧91| 一区二区三区美女超清| 国产精品分类在线观看| 欧美一区二区一级岛国大片| 久久精品国产亚洲AV高清演员表| WWW啪啪的com| 久久久久久国产精品免费网站| www.99中文字幕| 亚洲色图日韩精品| 国产福利第一视频| 床上啊啊啊一区二区三区| 日本三级黄页| 97青娱乐超碰久久| 日韩精品影视| 美女高潮国产高清| 国产日韩精品suv| 国产一级特黄大片处女| 五月丁香社区婷婷日韩欧美精品影院| 欧美少妇性爱网站| 日本免费不卡二区| 亚洲情色图片区| 91男同| 传媒在线观看一区二区三区| 97在线看| 国产自产一区视频在线| 性爱av网站| 超碰在线人妻中文字幕| 久久透逼视频| 日本亚洲熟女视频| 亚洲 91 在线| 97在线无精品| 久操免费观看| 亚洲密乳AV| 91精品国产高清久久久久久,亚洲成人 | 天天天肏屄肏屄肏屄欧美欧美| 天天插网| 欧美中出1| 欧美色图亚洲色图成人在在线| 久久m| 91色宗合| 日韩成人性爱电影在线播放| 亚洲精品819| 天操天操夜操夜月月年年操操| 97国产精品视频| 在线观看国产黄色| 99精品网站| 九九热精品| 中国乱伦一区二区| av操操不卡| 怡红院久久老司机| 国产欧美日韩一区二区三区| 成人夜夜爽| 亚洲脚交| 干干干天天| 99爱久久视频频| 91色夜| 欧美性爱视频免费一区一A| 人妻久热在线| 啊v在线观看视频| 可以在线观看AV的网站| 欧美九九九| 操国产逼| 偷拍欧美综合| 欧美亚洲中文字幕| 嫩草美女久久| 国产夜夜艹| 亚州综合在线| 激情五月激情综合网| 女上位精品在线| 美国精品国产精品| 日韩三级在线观看mp4| 搡老女人老熟女91| 亚州精人品大香蕉| 4虎在线观看| 秋霞视频一区二区| 人人妻人人色一区二区三区| 欧美日韩性爱无码| 色综合20p| 综合 欧美 亚洲 日本| 国内操逼视频二区| 日韩中文字幕精品一区在线| 大香伊人在线一区| 色在线综合| 亚洲免费日韩在线一区二区| 国产乱伦视频污| 99热精品青草在线| 国产一区二区免费福利片| 性色高清在线| 日韩在线一区二区| 久久99草| 免费的黄片wwwwww| 99rre在线精品99re8| 99综合| 嗯嗯啊好爽| 日韩AV中文字幕电影| 精品性爱| 亚洲精品一卡二卡三卡福利视频网站| 奇米四色影视777久久久| 大香蕉综合在线| 操屄不卡视频| 神马麻豆福利院 | 欧美熟妇精品黑人巨大91| 超碰av人人人| 久久午夜鲁丝片| 亚洲性图91| 日本精品第一视频在'| JuliaAnnXXX888| 狼人综合婷婷激情四射 | 成人性爱视频在线看| 亚洲AV色图一区| 丁香五月激情综合| 无遮挡又黄又刺激的视频| 久日91在线| 色爱综合网| J?P?NESEHD熟女熟妇伦| 久久草视频污视频| 啪啪啪综合网| 男女日B国产| 精…码一二三区| 色999亚洲人成色| 好看的久久不射无码影视影院| 欧美日韩亚洲少妇寂寞影院正在播放 | 欧美国产欧美在线观看| 中文字幕黄色片| 激情色图| 天天日熟妇| 极品丝袜无码| 丰满高潮18xxxx| 国产日本一区二区三区蜜臀在线观看| 欧美精品 - 91爱爱| 噜噜吧,噜噜色,噜噜| 成人一二| 日韩日韩日韩-国产乱码精品一区二区| 超碰超碰欧美| 久久婷婷综合国际产色怕| TS人妖另类精品视频系列| 免费国产| 99蜜桃臀亚洲成人在线观看| 无码色| 草草网站影院白丝内射| 狠狠操,使劲操| 欧美欧美少妇| 狠狠干2020| 天天天乱色综合全| 蜜桃色色网站视频三区| 一区二区三区视频在线观看免费| 国产一区二区免费福利片| 欧美性暴力猛交| 日韩色图 一区二区| 麻豆性爱视频在线播放| 欧美大香蕉卡久久| 99热18| 日韩黄色成人性爱| 色官网色综合| 91精品久久久久五月天精品| 国产呦精品系列在线观看| 欧美BT 亚洲色图| 蜜桃臀AV在线| 欧美一级专区免费大片| 精品免费国产二区三区| 大香蕉综合| 超AV色女| 欧美少妇一区二区三区| 日本人体九九九九九九| 一区二区三区精品黑丝白丝酒店对鸡 | 999国产精品999久久久久久| 粉嫩久久久极品| 亚洲精品白丝| 欧美色图 人妻| 级品肉射| 偷拍综合亚洲| 91色综合色| 蜜桃狠狠色伊人亚洲综合| 91丝袜在线视频| 福利在线视频一区二区| 97精品国产精品免费观看| 98精品国产乱码久久久久久| 精品999日本| 91久久久老司机| 91丝袜美腿片| 91网站在线播放| 久久精品女同亚洲女同13| 玖玖资源视频一区二区三区| 亚洲操操操无码| 国产日本顶级一区二区三区| 网友自拍第1页| 97超碰超碰| 日本爽爽爽爽爽爽免费视频| 一本色道久久天天射天天干| 国产 日韩 欧美高清| 亚洲精品啪视频| 久久五月丁香| 国产suv精品一区二区四区999| 用力操死我| 亚洲成人妻日韩在线| 国产欧美日产一区二区三区 - 国产欧美日| 美国三级日本三级久久99| 亚州,欧美在线| 丰满人妻一区二区三区| 欧美性爱18观看| 欧美日韩国产高清在线一二三区 | 男人天堂毛片| 天堂无码| 日韩精品人妻一| 九色PORNY9l原创自拍| 大稥蕉免费视频这里只有精品| 超碰性爱97| 久久视频,这里只有精品| 亚洲第一页色网| 九九久久首页| 超碰成人免费| 欧美黑人猛交春色影视大全| 午夜欧美J进J出白浆流出久久久 | 欧美劲爆第一页| 久久性爱视频免费看| 国产一区二区精品久久99| 五月婷婷激情网| 男女91| 青青久日| 俄罗斯一区二区视频在线观看| 亚洲日本韩国在线| 精品久久久久黄少妇| 中文字幕色AV| 亚洲成人在线高清| 国产99 中文字幕日韩小视频| 九一亚洲国产免费| 一本一道久久综合久久| 成人精品久久久午夜福利| 日韩精品一区二区三区色欲 | 成人a级高清视频在线观看| 自偷自拍的亚洲视频| 精品十三区| 人妻天堂网| 26uuu国产成人综合| 不卡超碰护士AV在线免费播放| 精品妇操一区二区三区| 久久久久久久强迫| 天天弄天天操| 久久久熟女一区| 91av一区二区在线观看| 亚洲 日本 一 二 三| 欧美最大综合网| 在线观看不卡一区二区三区| 五月天激情婷婷| 少妇高潮喷水无套久久久久久| 性爱网站一区二区| 黄色污污污污污污网站| 91制服丝袜| 在线无码操| 91丝袜在线视频| 黑人免费福利视频| 精品一区二区三区蜜桃臀赵总| 九九九九九九免费视频| 性在久久久久久| 97色诱| 激情黄色片在线观看| 色性综合| 欧美亚洲图片| 中文字幕五区| 国产精品无套内谢| 日韩一性一交一A片俄罗斯| 成人欧美一区二区三区黑人一| 人妻内射一区二区在线视频| 91精品微拍福利| 影音综合网| 热99这里有精品综合久久| 激情综合五月婷婷| 蜜臀久久99精品久久久久久成人小说 | 亚洲日韩XXX| 中国AAAAAA黄色片| 人妻在线中出视频| 亚洲无码视频免费在线观看网址!| 中文字幕 码 自拍 视频 区| 99999久久精| 920日本午夜免费| 亚洲欧美日韩激情不卡| 国产超碰国产97| 国产一级高清免费观看| 中日无幕一二三四区| 日韩电影在线观看网址| 情色av电影| 亚洲一曲日韩精品| 色偷偷超碰亚洲| 黑人黄片在线免费观看| 欧美韩日精品99综合| 亚洲操操| 超碰导航97| 精品国产精品一区二区| 久草久日| 亚洲精品男人的天堂| 熟妇乱伦一区二区| 欧美视频激情久久久久久| 亚洲欧美在线观看免费| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美日韩222| 国产极品精品美女视频| 九九九草| 伊人天堂在线| www.91人妻.com| 97国产精品久久久久| 五月婷婷丁香| 国产三级资源在线观看| 久久机热| 热久久91婷婷| 综合免费无码中文| 日本媚薬中文字幕在线| 91夜夜蜜桃臀1区2区3区| 殴美在线AⅤ| 国产三级片在线观看| 欧美色图下一页| 丁香五月激情啪啪| 人人性爱视频免费| 九99久久| 亚洲91网。| 97人人超| 91丨九色丨国产丨人妻在线 | 日本亚洲熟女视频| 黄色视频高清无码网站| 破处bbq| 国产性感骚丝袜在线| 久久精视频美日韩在线视频| 啊啊啊在线观看| 久久影视二区三区行押| 大香蕉 222| 日本三级日本三级99| 男女做爰猛烈动高潮A片免费应用| 女人天堂网| 亚洲av热热色| 五月婷婷影院| 日韩人成网站在线播放| AV乱伦国产| 蜜臀久久99精品久久久久久成人小说| 精品国产99| 久久一二三四五六七八九区区区 | 超碰成人免费| 强奸国产精品视频| 淫荡网址| 欧洲亚洲人妻无码高清久久三区四区| 欧美情色贴图| juliaann精品熟女一区| 超碰在线看| 日韩丰满熟妇| 18禁无码永久免费无限制| 亚洲天堂加勒比| 久久9精品网站| 欧亚日韩三区| 亚洲城人男人的天堂| 激情丁香五月婷婷| 手机看片1024你懂的国产| 成人一级性爱| 亚洲AV成人精品网站在AV| 人人妻人人澡人人爽人人精品浪潮| 久草精品视频| 天天夜夜久久| 亚洲精品欧美专业| 青青操97| 麻豆区99999| 天天日日舔舔| 97久久精品亚洲| 五月丁香色综合| 日韩无码专区| 柠檬AV导航| 欧美啪啪女女| 麻豆啪啪啪视频| 欧美久久伊人| 欧美亚洲日本激情在线| 能直接看AV的网站| 中文字幕123| 亚州色交| 性影在线视频| 午夜操逼不卡| 国产女同视频在线播放| 亚洲无码成人精品| 久久久国产av美女私房| 91视频伊人| 国产午夜在线观看视频| 天天激情综合站| 国产精品久久久久无码Av网曝门| 麻豆国产97在线| 欧洲黄色网| 岛国在线国产| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 久久午夜鲁丝片| 日韩免费福利在线观看| 日本高清免费一本视频在线观看| 亚洲熟伦熟妇AV无码春色| 国产家庭乱伦表演| 97在线精品观看视频| 色呦呦呦在线观看视频| 黄片www.| 亚洲欧美精品一区天堂久久 | 亚洲欧美日韩电影网站一区 | 亚洲最大成人a毛毛片| 日本国产高清色www视频在线| 亚洲 欧美 手机在线观看| 120分钟婬片免费看| 骚货人妻偷情自拍在线视频| 午夜性| 大香蕉伊然在亚洲91| 青青草色AV| 免费a v| 亚州一区二区成人片免费| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 日本99久久| 大香蕉在线视频15| 天天摸夜夜操视频| 中文字幕熟女人妻丝袜丝| 97欧美| 国产人伦a片信息免费片| 欧美精品999| 蜜桃视频一区二区三区在线观看| 久久高清无码夜夜操| 久草这里只有精品 | 中文幕97| 久久久性爱| av天堂精品久久| 色九月婷婷| 香港日本韩国人妇99www.wccm20| 啊啊啊男女| 97精品一区二区视频| 国产一级做a爰大片免费久久| 丰满欧美少妇| 超碰午夜| 大香蕉一级黄色片久久| 国产色精品午夜大片| 偷拍网站久久男女男| 九九人妻| 亚洲电影中字一区二区| 狠狠色综合网| 97bbn| 亚洲伊人成综合成人网| 久久美女福利是上海美女| 亚洲熟妇熟在线电影视频| 亚洲精品国产拍免费91在线| 成人免费看吃奶视频网站| 红杏大香蕉| 爱丝福利| 欧美日韩不卡a片| 日本天天人人狠狠在线日美女 | 国产成人无码a| 欧美极品女人的天堂| 破处bbq| 尤物黄色在线观看网站| 一牛影视久久久一区二区三区| 蜜桃传媒视频第一区入口在线看| 亚洲欧洲自拍| 九热中文字幕| 日本福利二区视频| 97在线资源| 国产精品爱欲| 青青操97| 综合网天天| 婷婷色在线| 33044男人的天堂深夜备| 日本成人A片免费看| 男人天堂站| 国产精品诱惑| 天天干天天做| 亚州欧美在线| 在线看免费无码AV天堂的| 美女丝袜激情小说| 韩日性爱av| 97在线观看免费视频l| 91看黄片| 久久精品老司| 黄色大片免费在线| 日本 免费 一区二区三区 久久香蕉| 精品999999| 观看免费区二区三区二| 日韩兔费看黄片| 久久久工口| A级在线视频| 日韩伦理视频| 欧美18老人禁| 亚洲 图片 欧美 色图| 亚洲成人激情小说视频| 久久大香蕉手机高清| 亚洲色图欧美一区二区不卡| 91久久精品国产| 欧美色www亚洲国产阿娇要播| 亚洲AV免费在线观看| 玖玖爱在线视频免费观看| 中文字幕在在线观看网站| 成年人网站在线免费观看| 青青草视频久久久久| 亚欧免费| 夜夜青青无码影院| 国模精品娜娜一二三区| 99999久久精| 极品色社| 亚洲日韩精品久久久久一区壹牛 | 日韩性爱视频在线免费观看| 一区二区国产视频在线观看| 最新中文字幕在线亚洲| 后入精品| 91原创在线观看| 久综合国内精品自在自线| 九七毛片九九毛片| 91超级碰| 热99这里有精品综合久久 | 激情抓乳插进去啪啪啪日韩 | 国产精品999zyz| 91插B网站| 欧美性天天影视| 国产无吗在线播放| 色老久久| 五月综合激情| 精品久久久久久无码| 玖玖爱伊人玖玖爱| 95人妻爽爽人人做人人澡| 日本成人免费一区二区三区| 熟女精品一区二区在线观看| 五月丁香综合啪啪| 国产在线综合网| 在线小说视频一区| 深夜啪啪啪视频免费| 色色网91| 午夜啊啊| 欧色性第一页| 920日本午夜免费| 精品中文字幕第一页| 九t超碰| 欧美亚洲AN| 在线只有精品| 国产欧美日韩一区二区三区| 色爱亚洲| 91黑丝操| 天操天操夜操夜月操月年年操| 大伊香蕉在线视频免费| 丰满人妻aA一区二区三区| 99精品丰满人妻无码| 欧洲免费一区二| 婷婷丁香五月激情啪啪| 成人免费看吃奶视频网站| 欧姜老司机| 91性| 中文字幕55555| 五月天综合网| 日韩精品免费高清视频在线| 91东北熟女| 亚洲美腿丝袜香蕉影视欧美成人| 女一区二区| 久久久无码国精品无码三区三区| 国产精品美女在线一区| 中文字幕亚韩| 欧美日韩理论一区| 欧美日韩性爱视屏免费看了| 国产JDAV无码视频在线观看| 九九热只有精品| 亚洲综合69| 求求你操操我| 欧美精品另类人妖xxxx| 日韩九区| 日韩不卡a级视频专区| WWW啪啪的com| 精品无码一区二区三区色欲| 日本二三四区| 91精品国产长腿丝袜美女| 久久久∴| 超碰碰97| 青苹果影院男人的天堂| 日本超碰在线国产一区| 亚洲AV无码国产成人| 日本欧美一区二区三区免费| 伊人网青青| 国产精品爆乳懂色蜜乳| 日骚逼视频| 色嘟嘟人妻天堂网| 欧美激情一| 九九热精彩视频| 天天日天天射天天干| 久久久久久久久久久人妻| 天综合网| 97超级久久强资源| 欧美躁死她一区二区| 五月婷丁香| 91狠狠综合久久久久久| 噜噜吧,噜噜色,噜噜| 99精品久久久久久久婷婷蜜桃| 欧美性爱视频免费一区一A| 夜色AV无码手机在线影院| 在线观看AV片| 黄色av片三级三级三级免费看| 夜色AV无码手机在线影院| 日本一级二级三级网站| 国产成人bd在线观看| 亚洲第一成人影院色播| 中文字幕一区日韩精| a在线观看| 日本 欧美 亚中文字幕| 欧美日韩国产传媒在线精品| 按摩中文字幕| 天堂精品小草| 亚洲999综合| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 九九精品99| 一区二区三区免费岛国片|