免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

輕量級消息路由與任務(wù)執(zhí)行引擎 hermes-agent 的設(shè)計與實踐

輕量級消息路由與任務(wù)執(zhí)行引擎 hermes-agent 的設(shè)計與實踐 1. 項目緣起為什么我會自己寫一個叫 hermes-agent 的東西先聊聊名字。Hermes 是希臘神話里的信使神腳上長著翅膀負責(zé)在眾神之間傳遞消息。我當(dāng)時給這個項目起名的時候想的就是這一層含義——在一個系統(tǒng)越來越復(fù)雜的時代消息的傳遞、路由、分發(fā)、執(zhí)行就是數(shù)字世界的信使工作。所以我管它叫 hermes-agent一個專門負責(zé)消息接入、規(guī)則匹配和自動執(zhí)行的小型智能體框架。這個項目的背景很具體。我手里維護著好幾套內(nèi)部服務(wù)有定時任務(wù)、有外部回調(diào)、有用戶行為事件還有各類監(jiān)控告警。這些消息源格式五花八門有的是 JSON有的帶簽名需要驗簽有的是純文本塞在 Webhook 里。早期我的處理方式是在每個服務(wù)里各寫各的入口邏輯A 服務(wù)收到回調(diào)就更新數(shù)據(jù)庫B 服務(wù)收到事件就調(diào)用某個內(nèi)部 APIC 服務(wù)收到告警就發(fā)釘釘通知。問題是一旦消息處理邏輯發(fā)生變化我需要同時改好幾個服務(wù)重新部署排錯的時候還要挨個翻日志非常被動。后來我認(rèn)真想了一下這些場景的本質(zhì)其實是一樣的源頭把事件拋出來中間需要有一套穩(wěn)定的機制接住再根據(jù)規(guī)則決定接下來讓誰去干活。這正是 agent 最擅長的事情。于是 hermes-agent 的雛形誕生了——一個運行時基于 Python asyncio、存儲用 SQLite生產(chǎn)環(huán)境可以換 Postgres、規(guī)則配置走 YAML 的輕量級消息代理與任務(wù)執(zhí)行引擎。它不依賴重量級框架部署就是拉代碼起進程非常適合中小型團隊內(nèi)部自動化場景。這篇文章我會把整個項目的設(shè)計思路、運行模型、核心代碼、踩坑記錄和演進方向都攤開來講。如果你也在做 Webhook 統(tǒng)一接入、任務(wù)分發(fā)、事件驅(qū)動型自動化或者單純想看看一個 agent 框架應(yīng)該怎么設(shè)計這篇內(nèi)容應(yīng)該對你有幫助。對于基礎(chǔ)偏弱的讀者我會盡量把涉及到的基礎(chǔ)概念一并講清楚不預(yù)設(shè)你已經(jīng)掌握 Python 異步編程或者消息隊列的完整知識。2. 核心架構(gòu)消息路由與任務(wù)編排的運行模型2.1 三層模塊劃分接入層、規(guī)則層、執(zhí)行層hermes-agent 從設(shè)計之初就是三層結(jié)構(gòu)這個分層思路不是我拍腦袋決定的而是從實際需求里自然長出來的。第一層是接入層Collector。它負責(zé)統(tǒng)一接住各種來源的消息。常見的 Collector 有 HTTP Webhook Collector、定時器 Collector、文件監(jiān)聽 Collector 和隊列消費 Collector。對于 HTTP 類型的 Collector我會封裝成一個獨立的 Web 服務(wù)進程只做一件事把收到的請求體轉(zhuǎn)成統(tǒng)一格式的 Event 對象寫入消息隊列或存儲然后立刻返回響應(yīng)給上游。這樣上游接口的響應(yīng)速度不會受到下游處理邏輯的影響這是個很關(guān)鍵的設(shè)計。第二層是規(guī)則層Router。它負責(zé)判斷一條消息應(yīng)該交給誰處理。判斷依據(jù)可以從消息內(nèi)容、消息來源、消息優(yōu)先級等多個維度提取。每一條規(guī)則本質(zhì)上是一組條件和動作的映射。條件支持等值匹配、正則匹配、JSONPath 取值匹配等多種模式。動作則是指定執(zhí)行器名稱和參數(shù)。第三層是執(zhí)行層Executor。它負責(zé)真正干活。執(zhí)行器是一段可插拔的代碼單元接收 Event 對象執(zhí)行具體業(yè)務(wù)邏輯。比如 HttpExecutor 把 Event 轉(zhuǎn)成 HTTP 請求發(fā)給內(nèi)部系統(tǒng)PythonExecutor 直接執(zhí)行一段配置好的 Python 腳本ShellExecutor 跑一條命令NotifyExecutor 發(fā)送通知到釘釘或者郵件。這樣的好處是接新場景時你不需要動框架本身只需要寫一個新的 Executor 注冊進去再配一條規(guī)則。這三層之間通過一個消息存儲默認(rèn) SQLite生產(chǎn)建議 Postgres和進程內(nèi)的消息通道串起來。實際運行的時候接入層進程把消息寫進存儲并標(biāo)記為 pending處理進程輪詢 pending 消息交給規(guī)則層判斷再調(diào)用執(zhí)行層完成任務(wù)并回寫狀態(tài)。2.2 一次消息從接入到執(zhí)行完成的完整生命周期我用一個實際例子說明整個流程。假設(shè)你有一個電商訂單系統(tǒng)用戶支付成功后訂單服務(wù)會調(diào)用你配置的 Webhook 地址通知支付結(jié)果。這個地址就是 hermes-agent 暴露出的 HTTP 接入點。第一步訂單服務(wù) POST 一條 JSON 到/hooks/payment內(nèi)容大概是{order_id: ORD20250101, status: paid, amount: 99.5}。HTTP Collector 收到請求后先做格式校驗提取必要的元信息來源標(biāo)記、接收時間、原始內(nèi)容然后封裝成 Event 對象dataclass class Event: event_id: str # 全局唯一ID用于冪等 source: str # 來源標(biāo)記比如 payment_webhook event_type: str # 事件類型比如 payment.paid payload: dict # 原始消息內(nèi)容 received_at: datetime priority: int # 優(yōu)先級默認(rèn)0越大越優(yōu)先第二步Collector 把 Event 寫入消息存儲。同時進程內(nèi)會立即觸發(fā)一次路由判斷但注意這里不是同步阻塞的。寫入成功后 HTTP 接口立刻返回 200處理邏輯全部在后臺繼續(xù)。這個異步設(shè)計能保證上游的 Webhook 調(diào)用不會被你這邊慢邏輯拖死。第三步處理進程從存儲中輪詢到這條 pending 消息進入 Router。Router 讀取已加載的規(guī)則集合并找到匹配項。rules: - name: payment_paid_order_finish match: event_type: payment.paid actions: - executor: python_executor params: script_path: ./scripts/order_finish.py timeout: 30第四步執(zhí)行器運行后腳本讀取 Event把訂單狀態(tài)更新為已完成、發(fā)送短信通知用戶、調(diào)用倉儲系統(tǒng)的出庫接口。執(zhí)行結(jié)果回寫到消息存儲狀態(tài)從 pending 變成 success 或者 failed。如果失敗會進入重試隊列按配置的退避策略重新執(zhí)行。整個生命周期最核心的原則是消息不丟失。消息無論是在接收階段還是在處理階段每一步的狀態(tài)更新都落盤保存絕不在內(nèi)存里直接處理完不記錄。這樣即使進程中途崩潰重啟之后依然可以從 failed 或者 pending 狀態(tài)恢復(fù)執(zhí)行。2.3 數(shù)據(jù)模型與存儲選型邏輯存儲這塊我是從簡單出發(fā)最初直接用 SQLite。直到現(xiàn)在如果場景是單機處理SQLite 完全夠用。表結(jié)構(gòu)非常簡潔CREATE TABLE events ( id INTEGER PRIMARY KEY AUTOINCREMENT, event_id TEXT UNIQUE NOT NULL, source TEXT NOT NULL, event_type TEXT NOT NULL, payload TEXT NOT NULL, status TEXT NOT NULL DEFAULT pending, priority INTEGER NOT NULL DEFAULT 0, retry_count INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL ); CREATE INDEX idx_events_status_priority ON events(status, priority, created_at);這個表承擔(dān)了消息隊列和狀態(tài)存儲的雙重職責(zé)。很多剛接觸這個項目的朋友會問為什么不直接用 RabbitMQ 或者 Kafka答案是看場景。對于內(nèi)部自動化、Webhook 統(tǒng)一接入這類日吞吐量在幾萬條以下的任務(wù)引入獨立消息中間件會增加部署成本和運維成本。而且 SQLite 表天然支持 SQL 查詢消息審計、問題排查非常方便。當(dāng)你真的需要橫向擴容時把這個表換到 Postgres再對處理進程做多實例部署改動成本并不高。選擇存儲方案的一個重要標(biāo)準(zhǔn)是你的消息量級是否值得引入一套額外的分布式系統(tǒng)。如果答案是不確定就用最簡單可靠的方案起步。這個原則后來幫我省了非常多的時間。3. 規(guī)則引擎核心中的核心3.1 規(guī)則配置與條件匹配的設(shè)計思路Router 是整個 hermes-agent 的決策大腦而規(guī)則引擎中的匹配條件則是大腦的每一個神經(jīng)元。我把條件匹配設(shè)計成三種形式覆蓋了絕大多數(shù)實際需求。第一種是 exact 等值匹配。就是消息某個字段的值等于某個固定值。適合場景來源是某個固定系統(tǒng)、事件類型是某個固定字符串。第二種是 regex 正則匹配。適合場景訂單號以 AB 開頭、用戶郵箱屬于某個域名、請求路徑符合某個模式。正則匹配可以配置在 JSONPath 取值后的字符串上。第三種是 expression 表達式匹配。這是最靈活但也是我最謹(jǐn)慎使用的一種。你可以寫一段簡單的布爾表達式內(nèi)部通過受限的 eval 執(zhí)行不提供任意代碼執(zhí)行能力。屬性取值通過 JSONPath 實現(xiàn)。統(tǒng)一配置方式如下rules: - name: high_value_order match: $type: all conditions: - field: $.payload.amount op: gt value: 5000 - field: $.event_type op: eq value: payment.paid priority: 90 actions: - executor: notify_executor params: channel: dingtalk template: high_value_order這條規(guī)則的意思是當(dāng)消息的 payload.amount 大于 5000且 event_type 等于 payment.paid就觸發(fā)一個高價值訂單的通知動作。priority 決定多條規(guī)則同時匹配時誰先執(zhí)行。這個字段在設(shè)計早期被忽略過后來有人反饋說同時命中財務(wù)通知和庫存通知時希望財務(wù)先跑才補上的。3.2 規(guī)則匹配的反向查詢優(yōu)化規(guī)則多了以后如果每條消息都遍歷所有規(guī)則去匹配性能會逐漸變差。我后來做了一項優(yōu)化反向索引。具體做法是啟動時把所有規(guī)則的 event_type 條件提取出來建立字典然后按 event_type 快速定向到候選規(guī)則再進一步做深度匹配。這個優(yōu)化把規(guī)則匹配的復(fù)雜度從 O(N) 降到接近 O(1)。實現(xiàn)上也很簡單就是預(yù)處理階段class RuleIndex: def __init__(self, rules): self.event_type_map {} for rule in rules: for each_type in rule.get_match_event_types(): self.event_type_map.setdefault(each_type, []).append(rule) def find_candidates(self, event): types get_event_types(event.event_type) rules [] for t in types: rules.extend(self.event_type_map.get(t, [])) return deduplicate(rules)對于一條消息先用 event_type 快速篩出候選規(guī)則集合然后再逐條深度檢查完整條件極大減少了不必要的規(guī)則遍歷。從實際效果看規(guī)則數(shù)在三位數(shù)以內(nèi)時匹配耗時基本可以忽略。3.3 匹配失敗與未命中消息的處理策略做過通知系統(tǒng)的朋友應(yīng)該都有經(jīng)驗最怕的就是消息沒匹配到規(guī)則然后靜默丟失。你根本不知道它丟了直到業(yè)務(wù)方來問為什么我沒有收到消息。hermes-agent 對這一塊的處理是未命中的消息不丟棄統(tǒng)一進入 unmatched 表同時提供管理接口可以查詢。這樣你可以定期復(fù)盤是否有新的消息類型需要添加規(guī)則。我見過不少系統(tǒng)從一開始的忽略異常到后來接二連三出問題根源就是沒有負面消息的可見性。我的建議是把未命中消息當(dāng)成一等公民對待它們和正常消息一樣重要。4. 執(zhí)行器的設(shè)計與實踐從腳本到插件的演進4.1 執(zhí)行器接口設(shè)計與注冊管理執(zhí)行器是 hermes-agent 真正干活的部分。我定義了一個非常簡潔的抽象接口class BaseExecutor: async def execute(self, event: Event, params: dict) - ExecResult: raise NotImplementedError每個執(zhí)行器只需要實現(xiàn)一個 execute 方法。事件通過參數(shù)傳入執(zhí)行參數(shù)通過 params 傳入。返回值是一個 ExecResult包含 success、output、message、duration_ms 等字段方便持久化和追蹤。注冊機制方面我通過一個全局注冊表實現(xiàn)EXECUTOR_REGISTRY {} def register_executor(name): def decorator(cls): EXECUTOR_REGISTRY[name] cls return cls return decorator然后在每個執(zhí)行器文件里加上裝飾器??蚣軉訒r把所有執(zhí)行器文件 import 一遍注冊表里就有了全量執(zhí)行器。規(guī)則配置里指定 executor 名稱Router 就能根據(jù)注冊表找到對應(yīng)類并實例化調(diào)用。新增執(zhí)行器完全不需要修改框架代碼做到了可插拔。4.2 幾個常用執(zhí)行器的實現(xiàn)細節(jié)HttpExecutor 是最常用的執(zhí)行器之一。它負責(zé)把事件轉(zhuǎn)發(fā)給其他內(nèi)部服務(wù)。具體實現(xiàn)時有兩個細節(jié)容易踩坑超時控制和重試策略。register_executor(http_executor) class HttpExecutor(BaseExecutor): async def execute(self, event, params): url params.get(url) method params.get(method, POST) payload event.payload timeout params.get(timeout, 10) async with aiohttp.ClientSession() as session: try: async with session.request(method, url, jsonpayload, timeoutaiohttp.ClientTimeout(totaltimeout)) as resp: body await resp.text() return ExecResult(successTrue, outputbody, messagefstatus{resp.status}) except asyncio.TimeoutError: return ExecResult(successFalse, messageftimeout after {timeout}s)重試不用在 HttpExecutor 里做因為重試是消息處理框架層面的職責(zé)。執(zhí)行器只負責(zé)返回結(jié)果框架根據(jù)結(jié)果和配置決定要不要重試。這個職責(zé)邊界從設(shè)計之初就明確下來了避免執(zhí)行器里塞進太多與業(yè)務(wù)無關(guān)的邏輯。PythonExecutor 比較特殊它允許在規(guī)則配置里指定一段腳本路徑框架動態(tài)加載并執(zhí)行。這里有一個安全邊界腳本等同于本地代碼執(zhí)行權(quán)限等同于框架進程本身。所以它只適合內(nèi)部環(huán)境下執(zhí)行可信代碼不適合對外開放成多租戶執(zhí)行能力。NotifyExecutor 負責(zé)發(fā)送通知。支持釘釘、企業(yè)微信、郵件、飛書這些常見的通知渠道??紤]到外部 API 不穩(wěn)定這類執(zhí)行器最容易失敗所以通知類消息的重試策略通常配置得比較積極。4.3 執(zhí)行器的超時控制、并發(fā)與資源限制處理消息的時候最怕某個執(zhí)行器出問題導(dǎo)致整個進程卡死。所以從第一天起超時控制就是執(zhí)行器運行的關(guān)鍵約束??蚣転槊看螆?zhí)行器調(diào)用都包裹了 asyncio.wait_for強制超時try: result await asyncio.wait_for(executor_instance.execute(event, params), timeouttimeout) except asyncio.TimeoutError: result ExecResult(successFalse, messageexecutor timeout)并發(fā)控制方面hermes-agent 支持配置最大并發(fā)數(shù)。默認(rèn)是 20也就是同一時間最多 20 個任務(wù)在跑。超過的部分排隊等待。這個設(shè)計是為了避免某個瞬間大量消息涌入時打爆下游系統(tǒng)。對于危險操作類的執(zhí)行器比如刪除文件、清理數(shù)據(jù)庫數(shù)據(jù)我建議在 Executor 內(nèi)部增加二次確認(rèn)邏輯。規(guī)則配置里需要顯式設(shè)置confirm: true否則直接返回失敗。雖然增加了配置復(fù)雜度但在生產(chǎn)環(huán)境里這個保障非常重要。5. 可靠性設(shè)計重試、冪等與死信隊列5.1 重試策略與退避算法消息處理不可能永遠一次成功。網(wǎng)絡(luò)抖動、下游服務(wù)重啟、第三方接口超時這些都是常態(tài)。重試策略是整個可靠性設(shè)計中最重要的部分。hermes-agent 里的重試策略是四級退避第一次失敗后等 5 秒第二次 30 秒第三次 5 分鐘第四次 30 分鐘。超過四次仍然失敗消息進入死信隊列。這個策略的經(jīng)驗依據(jù)是大部分瞬時故障在前幾次重試時就能恢復(fù)如果 30 分鐘后還不行大概率不是瞬時問題了沒必要無限重試。實現(xiàn)上我把重試信息放在消息的元數(shù)據(jù)里dataclass class RetryPolicy: max_retries: int 4 base_delay: int 5 multiplier: int 6 max_delay: int 1800每次重試的延遲時間 base_delay * multiplier^retry_count不超過 max_delay。這個算法簡單明了不需要引入復(fù)雜的指數(shù)退避庫。5.2 冪等設(shè)計避免重復(fù)執(zhí)行帶來副作用重試機制帶來的一個直接問題是消息可能被處理不止一次。比如執(zhí)行器成功了但是由于網(wǎng)絡(luò)原因響應(yīng)沒有及時寫回框架判斷超時后重試于是同一個事件被執(zhí)行了兩次。這是所有分布式任務(wù)系統(tǒng)都躲不開的問題唯一的解法就是冪等設(shè)計。冪等有兩種做法。第一種是業(yè)務(wù)層冪等你在自己的業(yè)務(wù)代碼里判斷這個訂單是否已經(jīng)被處理過了處理過就什么都不做直接返回成功。這種做法需要業(yè)務(wù)方配合。第二種是框架層冪等框架記錄每條消息的執(zhí)行指紋指紋相同的結(jié)果直接用不實際執(zhí)行。hermes-agent 在框架層面做了一個簡單的保護。給每條事件生成 event_id這個 ID 在消息源頭生成并隨消息攜帶。事件表里 event_id 是唯一索引同一事件重復(fù)寫入直接失敗。處理成功之后這個 ID 會回寫到一個已處理表再次收到同 ID 的事件時直接返回成功。但要注意框架層的冪等保護沒法覆蓋執(zhí)行器已經(jīng)開始干活但是結(jié)果沒記錄這種情況。所以我的建議是所有 Executor 在編寫時都把事件已經(jīng)處理過當(dāng)成正常情況來處理不要拋出異常。把冪等當(dāng)成一種設(shè)計習(xí)慣而不是框架約束。5.3 死信隊列與人工介入流程死信隊列DLQ是消息系統(tǒng)的最后一道防線。我已經(jīng)設(shè)置了合理的重試次數(shù)和退避策略如果消息最終還是處理失敗就說明靠自動重試解決不了問題。此時消息進入 DLQ等待人工介入或后續(xù)補償腳本。在 hermes-agent 的管理界面上DLQ 消息可見、可查詢、可重新投遞。我通常的做法是先查詢 DLQ 里的消息內(nèi)容和失敗原因確認(rèn)問題后修復(fù)比如配置錯誤、依賴服務(wù)恢復(fù)然后在界面上點擊重新投遞消息會重新進入 pending 狀態(tài)再走一遍處理流程。這里我給一個建議DLQ 里的消息需要定期檢查不要讓它靜默增長??梢栽?hermes-agent 旁邊掛一個簡單的 cron每天統(tǒng)計 DLQ 數(shù)量超過閾值就發(fā)告警給你。不然時間久了積壓的失敗消息會變成一座沒人想動的山。6. 實戰(zhàn)項目搭建一個統(tǒng)一的 Webhook 接收器6.1 場景與需求定義這個實戰(zhàn)項目來自一個真實需求。我們內(nèi)部有好幾個服務(wù)需要暴露 Webhook 給第三方調(diào)用包括支付回調(diào)、物流狀態(tài)回傳、短信狀態(tài)報告。每個服務(wù)的回調(diào)地址不同、驗簽方式不同、處理邏輯不同。最麻煩的是某些第三方平臺的 Webhook 對響應(yīng)時間要求極高超過 2 秒就判定失敗并開始重試。需求匯總下來有三點統(tǒng)一 Webhook 入口一個地址接收所有第三方事件?;卣{(diào)立刻返回 200具體邏輯異步處理。驗簽邏輯可配置消息處理結(jié)果可追溯。6.2 配置實戰(zhàn)多來源接入與驗簽我在 hermes-agent 里配置了三個 Collector分別監(jiān)聽三個路徑/hooks/payment、/hooks/logistics、/hooks/sms。每個 Collector 綁定一個來源名稱同時可以配置該來源的驗簽規(guī)則。為了演示我用支付回調(diào)的 HMAC-SHA256 簽名方式作為例子。collectors: - name: payment_hook path: /hooks/payment source: payment_callback verify: type: hmac_sha256 secret_env: PAYMENT_HOOK_SECRET header: X-Signature body_from: raw驗簽邏輯不算復(fù)雜。第三方平臺用密鑰對請求體做 HMAC-SHA256 簽名放在 Header 里傳過來。hermes-agent 收到請求后用同樣的算法和密鑰計算簽名和 Header 里的值做比對。不一致就返回 401保持一致則繼續(xù)處理。這個驗簽過程看起來簡單但實際有一個非常重要的細節(jié)驗簽必須使用原始請求體不能先解碼 JSON 再重新序列化。因為 JSON 鍵值順序變化會導(dǎo)致簽名不一致。我在代碼里專門保留了原始 body 字節(jié)用于驗簽解析 JSON 放在驗簽通過之后。這個坑非常隱蔽希望看到這里的讀者能記住。6.3 實戰(zhàn)踩坑第三方回調(diào)的響應(yīng)超時問題這個項目的第一個線上問題就出在回調(diào)響應(yīng)超時上。某個物流平臺的 Webhook 配置了 HTTP 超時時間為 2 秒。hermes-agent 收到回調(diào)后需要驗簽、解析、寫入 SQLite 數(shù)據(jù)庫、再返回 200。正常情況下整個過程在幾十毫秒內(nèi)完成。但某個時間段內(nèi)由于服務(wù)器的磁盤 I/O 出現(xiàn)偶發(fā)高延遲SQLite 寫入超過了 2 秒導(dǎo)致上游平臺判定超時并重試。重試又帶來了重復(fù)消息處理邏輯里冪等沒做好部分物流狀態(tài)被重復(fù)回寫。這個問題的教訓(xùn)是雙重的。第一Webhook 接口的數(shù)據(jù)庫寫入不能放在返回響應(yīng)的路徑上。我的修復(fù)方案是HTTP Collector 先寫內(nèi)存隊列立刻返回 200后臺異步批量沖刷到 SQLite。內(nèi)存隊列的可靠性可以通過定時持久化快照來保障。第二冪等保護在任何可能重試的入口都必須做好即使你認(rèn)為概率很低。7. 性能優(yōu)化與壓測結(jié)果7.1 基于 asyncio 的并發(fā)模型背后的選擇理由我在最初選擇 asyncio 而不是多線程核心原因是這個項目的 IO 密集特性非常明顯接收 HTTP 請求、讀寫 SQLite、調(diào)用第三方接口、發(fā)送通知。這些都是 IO 等待沒有明顯的 CPU 密集計算。asyncio 在單線程內(nèi)用事件循環(huán)處理海量并發(fā)開銷遠小于線程切換且沒有線程安全問題。代價是要小心不要寫阻塞代碼。比如不要在 Executor 里用 requests 同步調(diào)用必須用 aiohttp不要直接調(diào) time.sleep必須用 await asyncio.sleep數(shù)據(jù)庫操作要么用異步驅(qū)動要么把阻塞操作丟給線程池。初期我在這上面踩了不少坑比如某個 Executor 里用了同步 SQLite 查詢結(jié)果整個事件循環(huán)被卡住所有消息處理都跟著變慢。7.2 單機壓測數(shù)據(jù)吞吐與延遲表現(xiàn)在一臺 4 核 8GB 的普通云服務(wù)器上我用 locust 對 hermes-agent 做了壓測。模擬客戶端持續(xù) POST 請求每條消息大小約為 1KB。事件處理邏輯為空操作只做規(guī)則匹配和落庫。壓測結(jié)果穩(wěn)定狀態(tài)下每秒處理約 500 條消息P95 延遲為 60 毫秒P99 延遲為 120 毫秒。消息從接收到進入 pending 隊列再被處理完成整體耗時平均在 300 毫秒左右。如果把規(guī)則匹配加上每條消息平均匹配 50 條規(guī)則吞吐量下降到 300 QPS但 P99 延遲仍在 200 毫秒以內(nèi)。對于內(nèi)部自動化場景這個性能完全足夠。7.3 壓測中暴露的瓶頸與優(yōu)化過程壓測暴露的第一個瓶頸是 SQLite 單條插入性能。每條消息獨立 INSERT 提交在事務(wù)開銷上浪費了不少時間。優(yōu)化方案是批量插入攢一批消息后統(tǒng)一提交使寫入吞吐量提升了一倍以上。這個批次大小我調(diào)到了 100 條一批平衡了延遲和吞吐。第二個瓶頸是規(guī)則深度匹配中的正則表達式操作。正則匹配雖然靈活但 CPU 開銷明顯高于等值匹配。優(yōu)化方案是給規(guī)則增加條件預(yù)篩階段先用 JSONPath 取出的值做一次快速數(shù)據(jù)類型和長度判斷過濾掉明顯不匹配的規(guī)則再進入正則不歸。實際效果是把規(guī)則匹配整體耗時降低了 40%。第三個優(yōu)化是熱點路徑上的日志修改。壓測時 statsd 和日志輸出占用了不少 CPU。我把每條消息處理的 DEBUG 日志改成按采樣率輸出比如每 100 條記錄一次整體性能提升明顯。對于日志這個點線上環(huán)境和壓測環(huán)境最大的區(qū)別就是線上大量無意義日志會把系統(tǒng)拖垮保留關(guān)鍵日志、關(guān)閉頻繁的 DEBUG 日志才是工程化做法。8. 部署與運維實踐8.1 單機 Docker 部署方案hermes-agent 的部署很簡單。我提供了一個 Dockerfile基于 python:3.11-slim 構(gòu)建體積控制在 200MB 以內(nèi)。整個鏡像只暴露一個端口通過環(huán)境變量注入配置。FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV HERMES_CONFIG/app/config/config.yaml EXPOSE 8080 CMD [python, -m, hermes_agent]啟動命令也簡單docker build -t hermes-agent:latest . docker run -d --name hermes-agent \ -p 8080:8080 \ -v /data/hermes:/app/data \ -e HERMES_CONFIG/app/config/config.yaml \ --restart unless-stopped \ hermes-agent:latest將數(shù)據(jù)目錄掛在宿主機上的好處是升級鏡像時數(shù)據(jù)不丟排錯時可以直接查看 SQLite 文件和日志。8.2 配置管理環(huán)境變量與敏感信息配置管理這一塊我遵循的原則是非敏感配置放 YAML 文件敏感配置放環(huán)境變量。支付密鑰、數(shù)據(jù)庫密碼這類信息直接寫在 YAML 里并且提交到代碼倉庫是極其危險的做法一旦代碼泄漏全部密鑰跟著泄漏。在實際部署中我通過環(huán)境變量注入這些敏感信息配置文件中只引用變量名。import os from dotenv import load_dotenv load_dotenv() PAYMENT_HOOK_SECRET os.getenv(PAYMENT_HOOK_SECRET)建議在 CI/CD 流水線中把生產(chǎn)環(huán)境的密鑰存儲在專門的密鑰管理服務(wù)中運行時注入。即使是內(nèi)部系統(tǒng)的密鑰也不能因為覺得沒那么重要就放松管理。8.3 日志規(guī)范與健康檢查接口hermes-agent 的日志統(tǒng)一輸出為 JSON 格式字段包括時間、級別、event_id、source、event_type、執(zhí)行器名稱、耗時、結(jié)果狀態(tài)。方便接入 ELK 或 Loki 做日志搜索。統(tǒng)一的 JSON 日志格式我堅持了很久因為排查問題的時候跨字段關(guān)聯(lián)查詢比在純文本日志里用 grep 高效得多。健康檢查接口在/healthz上返回 200。檢查內(nèi)容包括進程是否存活、SQLite 是否能正常讀寫、掛起的 pending 消息數(shù)量是否超過閾值、最近 10 分鐘的錯誤率等。K8s 或 Docker Compose 的健康檢查探針可以把它配置為探活地址。8.4 消息積壓與延遲的監(jiān)控指標(biāo)運營 hermes-agent 的過程中我最關(guān)心的指標(biāo)有三個pending 消息數(shù)、處理延遲和執(zhí)行失敗率。這三個指標(biāo)分別對應(yīng)消息積壓、系統(tǒng)健康度和執(zhí)行質(zhì)量。pending 消息數(shù)可以通過一條 SQL 獲取SELECT status, COUNT(*) FROM events GROUP BY status;處理延遲指標(biāo)我通過記錄消息從 received_at 到 updated_at 的時間差在管理儀表盤上畫出分位數(shù)值。正常情況下 P95 應(yīng)該在 2 秒以下。如果某段時間 P95 突然上升基本可以判斷是某個執(zhí)行器變慢或者下游服務(wù)出現(xiàn)問題。9. 項目演進與多實例擴展9.1 從 SQLite 遷移到 Postgres當(dāng)消息量增大到日均幾十萬條時單機 SQLite 開始成為瓶頸。遷移到 Postgres 是自然的演進方向。我在存儲層抽象了一個接口SQLite 和 Postgres 各實現(xiàn)一份切換時只需要改配置。表結(jié)構(gòu)幾乎不變只有數(shù)據(jù)類型上做了一些調(diào)整比如 TIMESTAMP 帶時區(qū)、JSON 字段用 JSONB 類型。storage: type: postgres dsn: postgresql://hermes:passwordlocalhost:5432/hermes9.2 多實例運行時的任務(wù)鎖與消息分區(qū)Postgres 版本支持多實例部署也就是多個 hermes-agent 進程同時消費同一個消息表。這里的關(guān)鍵問題是不能讓兩個實例同時拿到同一條 pending 消息。解決辦法是使用 Postgres 的行級鎖通過 SELECT FOR UPDATE SKIP LOCKED 實現(xiàn)安全的消息領(lǐng)取。SELECT * FROM events WHERE status pending ORDER BY priority DESC, created_at ASC LIMIT 1 FOR UPDATE SKIP LOCKED;這個 SQL 的意思是鎖定并返回一條 pending 消息如果該行已經(jīng)被其他事務(wù)鎖定則跳過它不會阻塞等待。這讓多個實例可以并行安全地消費消息無需額外引入分布式鎖。實際測試中3 個實例部署時吞吐量基本能線性擴展到 1200 QPS。9.3 多執(zhí)行器協(xié)作的編排能力單條規(guī)則只能綁定一個動作這個限制在復(fù)雜場景下會顯得不夠用。例如用戶下單后需要同時完成扣庫存、通知發(fā)貨、記錄財務(wù)流水這三個動作如果失敗其中一個其他兩個應(yīng)該如何處理這就需要編排能力。為此我在新版本里引入了 action chain 的概念actions: - executor: inventory_executor params: operation: deduct - executor: financial_executor params: operation: record - executor: notify_executor params: channel: dingtalk template: order_created默認(rèn)情況下同一規(guī)則下的多個動作按順序執(zhí)行前一個失敗則后續(xù)中斷。你也可以配置為并發(fā)執(zhí)行或者允許部分失敗繼續(xù)。這個編排能力讓 hermes-agent 從單純的消息轉(zhuǎn)發(fā)進化為一個輕量級的任務(wù)調(diào)度引擎。9.4 多智能體協(xié)作模式的探索目前版本的 hermes-agent 支持讓執(zhí)行器反過來向消息隊列寫入新事件這為多智能體協(xié)作提供了可能。例如一個訂單超時監(jiān)控執(zhí)行器發(fā)現(xiàn)訂單存在異常它可以生成一條新事件交給另一個專門處理異常的執(zhí)行器處理。Agent A 處理完自己的部分把結(jié)果作為新消息發(fā)布出來Agent B 接住再處理下一環(huán)。這樣的好處是處理鏈路上每個節(jié)點都清晰可追蹤天然支持分布式部署。這個模式我目前還在實踐中探索比如用于消息分片后的并行處理、跨部門業(yè)務(wù)鏈路的自動化等場景。對于已經(jīng)上手的團隊這可能是把 hermes-agent 能力翻倍的關(guān)鍵方向。10. 遇到問題時的排查思路與實操經(jīng)驗10.1 消息處理失敗但日志沒有明顯報錯這種情況遇到過好幾次。排查的第一步是先確認(rèn)事件目前的狀態(tài)是 failed 還是 success如果是 failed去 events 表里看 retry_count 字段判斷是執(zhí)行器主動返回失敗還是框架重試后放棄。第二步查看失敗執(zhí)行器的 message 字段框架會把 Executor 返回的失敗原因記錄進去。第三步看 framework 日志重點查找該 event_id 對應(yīng)的執(zhí)行記錄和異常堆棧。這類問題的根源往往是 Executor 內(nèi)部吞掉了異常返回了一個本該拋出的結(jié)果。實際排查一次之后定位到某個腳本里用了 try...except... 把異常吃掉并直接返回成功導(dǎo)致框架認(rèn)為執(zhí)行成功但實際上業(yè)務(wù)處理并沒有完成。這個教訓(xùn)后來讓我養(yǎng)成了一個習(xí)慣執(zhí)行器內(nèi)部絕不允許無差別捕獲異常后靜默通過必須顯式返回失敗結(jié)果。10.2 消息重復(fù)消費問題消息重復(fù)消費的排查思路我每次都是先確認(rèn)事件表里 event_id 是否存在重復(fù)記錄。如果存在說明消息源頭或接入層已經(jīng)產(chǎn)生了重復(fù)事件。如果不存在但業(yè)務(wù)層面處理了兩次說明是執(zhí)行器冪等設(shè)計有問題。一個具體的案例是某執(zhí)行器在調(diào)用下游接口時由于框架超時重試同一事件被執(zhí)行了兩次但兩次執(zhí)行都改了不同字段所以業(yè)務(wù)數(shù)據(jù)變得不一致。解決辦法是在執(zhí)行器里增加一個基于 event_id 的處理記錄表每次執(zhí)行前先檢查是否已經(jīng)執(zhí)行過。10.3 規(guī)則匹配結(jié)果和預(yù)期不符規(guī)則匹配問題是日常排查里見得最多的一類。寫規(guī)則的時候想的是應(yīng)該匹配這類消息結(jié)果實際運行時不匹配或者錯誤匹配了。排查步驟一般是先在管理界面查看實際消息的完整內(nèi)容確認(rèn) event_type、source 等關(guān)鍵字段值再打開 Debug 模式輸出規(guī)則匹配時的條件逐項判斷結(jié)果看具體是哪個條件不滿足或誤匹配。有一次排查到最后發(fā)現(xiàn)問題竟然出在 YAML 配置文件里有人把鍵的縮進寫錯了導(dǎo)致條件層級與預(yù)期不同匹配邏輯完全變了。這類問題光看配置很難發(fā)現(xiàn)最好給規(guī)則文件加一個本地校驗工具在 CI 階段檢查 YAML 格式和必需字段。11. 個人經(jīng)驗總結(jié)與未來方向這個項目從最初的一個內(nèi)部腳本逐漸演化成了帶規(guī)則引擎、執(zhí)行器插件、重試機制和管理界面的輕量級 agent 框架。整個過程中我最深的體會有三點。第一輕量是王道。能用一個進程解決的事情就不要引入一整個微服務(wù)架構(gòu)。很多項目在初期規(guī)模很小的時候就把組件拆得滿天飛實際上每個組件都增加了排查問題的復(fù)雜度。hermes-agent 選擇用 SQLite 起步、用 YAML 做配置這個能不依賴就不依賴的理念幫助它快速落地并且在真實場景中穩(wěn)定運行。第二消息處理系統(tǒng)的核心價值在于可追蹤性。消息從哪兒來、被誰處理、處理成功還是失敗、失敗原因是什么這些信息必須完整記錄。很多系統(tǒng)出問題無法定位就是因為消息處理鏈路黑盒化。我設(shè)計 hermes-agent 時花費了大量精力在事件狀態(tài)、執(zhí)行結(jié)果、日志格式這些看起來不性感但實際極其重要的細節(jié)上最終實踐證明這些都是值得的。第三冪等設(shè)計比重試機制更重要。沒有業(yè)務(wù)冪等做支撐重試機制反而會放大問題。無論你用的是消息隊列、定時任務(wù)還是 Webhook都要養(yǎng)成同一事件可以重復(fù)執(zhí)行且結(jié)果一致的設(shè)計習(xí)慣。如果你也想自己實現(xiàn)一個類似的 agent 框架我建議你從最基礎(chǔ)的消息類型和狀態(tài)流轉(zhuǎn)開始做先跑通一條完整鏈路再逐步加規(guī)則、執(zhí)行器、重試這些復(fù)雜度。直接在項目初期設(shè)計一個面條式的大框架容易讓自己陷入細節(jié)不可自拔。一個穩(wěn)定可靠的小系統(tǒng)遠勝過一個看起來功能完整但處處漏風(fēng)的大架構(gòu)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日hao1区| 亚洲va欧美va天堂v国产综合| 五月天丁香色色| 色五月婷婷五月丁香五月| 婷婷五月丁香A∨| 九九色精品| 激情五月天激情综合网| 丁香综合伊人| 99自拍视频在线| 狠狠色激情在线| 国产综合丁香五月天| 99热精品中文字幕| 五月停亭六月,六月停亭的英语 | 久草A片| www.婷婷五月天| 这里只有精品免费视频| 午夜激情五月| 五月综亚洲| 五月婷婷丁香| 激情六月天婷婷| 男人的天堂婷婷色五月| 激情综合五月| 婷婷91| www.婷婷六月天| 婷婷五月婷婷五月天| 成人网在线视频| 国产,欧美,学生妹,视频| 激情99热| 9l视频自拍9l视频自拍九色学生| 狠狠干狠狠干| 婷婷五月天福利| 青草视频在线蜜臀| 伊人超碰| 思99热精品久久只有精品| 网色99| 天堂综合久| www.99精品日操伊人乱碰在线| www.五月天婷婷| 九九青草热| 99热久草| 可以看的AV网站| 激情五月婷婷| 爱99干99| 99re欧美精品| 黄色激情网站在线观看| www.99riav99| 亚洲韩国日产综合AV| 日本欧美成人片AAAA| 99精品在线观看视频| 啪啪激情网| 丁香五月婷婷在线| www.91婷婷| 99爱在线视频| 91人人操.COM| 婷婷久久网| 久久久99久久| 丰满人妻一区二区三区| 大陆极品少妇内射AAAAAA| 99色在线视频| 无码少妇高潮喷水A片免费| 天天干天天色综合| 久久久亚洲精品一区二区三区浴池| 色五月av| 亚洲六月色| 久久综合九色综合97婷婷| 亚洲综合另类| 91狼友视频网页更新| 亚洲亚洲人成综合网络| 久久99激情五月天| 99久久99视频| 欧美日本综合网| 天天插天天插天天操| 久9热| 六月婷婷天天操夜夜爽视频| 五月综亚洲| 综合激情五月丁香| 中文av网站| 婷婷中文字幕| 99精品在线播放| 婷婷久草| 色婷婷aV四虎| 9久精品视频| 国在线激情网| 伊人狠狠操| 婷婷五月六月激情| 9 1超碰九色| 日日夜夜天天| 欧美婷婷精品激| 婷婷综合亚洲| 色综合网综合| 日本一道久久| 91碰免费视频| 九九色人| 99九九99九九九视频精彩| 婷婷五月天伊人| 婷婷香五月天| 99精品久久久久久久久| 黄色99视频| 五月天婷婷激情小说| 婷婷五月天第四色| 狠狠干狠狠色| 中文字幕高清av| 五月丁香婷婷色色色| 青青草原中文字幕| 色婷婷久久综合久色综| 专区无日本视频高清8| 东京热五月婷婷| 婷婷开心激情| 婷婷激情综合色五月久久91| 99色色热| 婷婷久久免费| 99re资源在线视频导航| 丁香五月婷婷深五月| 天堂婷婷丁香六月网| 婷婷九月丁香| 亚洲成人AV电影在线| 91丨九色丨国产在线| 婷婷五月成人| 国产精品美女| 九九爱精品网站| 色丁香五月| 亚洲婷婷月丁香五月| 精品五月天| 91啪啪| 婷婷丁香六月天激情四射网| 九九视频免费| 婷婷五月电影院| 国产精品第一国产精品| 成人av中文字幕| 五月丁香六月婷婷中文版| 色情五月停停丁香| 国产黄色在线| 精品久久人妻热| 五月婷婷六月丁香在线| 90色免费视频| 99视频精品8| 欧美色色色色色色| ...婷婷五月综合不卡,国产在线手机| 五月丁香六月激情狠狠| 婷婷久久久| 丝雨一区二区| 五月婷婷精品视频| 97精品人人A片免费看| 一本色道久久综合狠狠躁小说| 五月丁香少妇网| 久久玖玖综合| 黑人无码一区| 丁香久久久| 激情综合色婷婷啪啪五月天| 爱草视频在线| 婷婷五月天成人网| WWW.激情| 色九九丁香九月色九九色| 天天影视天天爽天天草| 日日夜夜小色哥| 久99久在线| 中文字幕在线不卡视频| 天天日日综合| 丁香九色不卡aaa| 天天综合干| 丁香婷婷色五月| 超碰资源在线| 91九色视频| 在线91日韩| 五月丁香花激情综合网| 婷婷五月丁香色色| 国产三级秋霞| 婷婷伊人五月丁香天堂网| 久久综合天天综合| 97色综合视频| 色婷婷五月天综合网| 99热这里有精品| 五月婷婷在线视频免费观看| 超碰在线91| 99色在线| 人妻丰满精品一区二区A片| 97人妻碰碰碰久久香蕉| 日韩精品一区二区亚洲AV观看 | 综合婷婷六月| 这里只有精品1| 99色天堂| 精品五月花| 国产精品人成A片一区二区| 久99久99精品免| 丁香桃色网| AV操一操| 任你操精品免费| 91人人妻人人操| 99热网站| 久久99精品九九久久久婷婷| 91天天操天天干天天射| 婷婷色五月偷拍| 99热这里只有精品98| 色五月丁香网| 天天操九九插| 91精品国产色猫| 婷婷天天日婷婷| 亚洲色图81p| 超碰在线免费9| 97久久草草超级碰碰碰| 激情第四色| 我爱宗和色| 婷婷五月天久草在线| 色色婷婷五月天| 另类的婷婷| 99热99精品在线观看| 日本色爽| 开心五月激情五月丁香五月婷婷| 久久婷婷色情7777网站| 五月激情六月宗合| 色色无码| 色综合九九| 婷婷涩涩网| 五月天婷婷基地综合网| 国产亚洲成人综合| 六月激情网| 久久网站免费亚洲| 色综合色综合色综合| 性色天| 色婷婷亚洲婷婷| 婷婷五月激情四射手| 亚洲欧美999| 日本色道视频网站| 国产综合81p| 五月天激情综合网| 26uuu亚洲| 激情五月色播五月| 一本伊人色婷| 少妇久久诱惑视频| 五月丁香六月婷婷精品| 操逼毛片国语对白| 91人人操人人爱| 影音先锋男人女人| 99热在线观看| 色五月涩涩婷婷蜜桃| 久久99免费视频| 思思99热| 亚洲中文字幕在线观看| 深爱综合网| 日本天天操| 五月停停丁香| www.26uuu.com亚洲电影| 色综合香蕉视频| 在线视频区| 九九香蕉网| 色婷婷导航| 伊人婷婷五月天| 热久久66| 五月天激情子轮| 噜综合| www.天天日| 日本黄色一级| 欧美日韩五月婷婷| 婷婷五月天综合小说网| 99热99热在线观看| 天天草人人摸| 丁香五月成人论坛| 久久午夜理论| 常久最新免费的色吊丝| 开心婷婷五月天激情网| 色五月激情五月天| 久久九九国产精品怡红院| 丁香六月在线| 欧美激情综合色综合啪啪五月| 色婷婷狠狠18| 思思热在线视频精品| 欧洲激情精品婷婷| 五月激情婷婷综合| 99热在线看| 色色色综合网| 狠狠色综合网| 99爱在线| 99精品久久久久久久| AV免费在线网站| 免费观看2018www黄色操逼网站| 丁香婷婷浪潮AV久久综合| OYIWbGcPu8H| 性爱五月婷婷| 丁香婷婷五月天激情四射| 另类伊人婷婷| ...婷婷国产成人亚洲日韩| 第2色五月婷| 亚洲人人96@| 人妻操逼| 婷婷免费视频| 五月天激情小说| 夜夜撸日日操| 国产毛片操B| 97超级啪啪在线观看| 97久久精品视频| 亚洲色图日韩网址| 伊人影音无码一区二区三区| 色青青视频| 天天做天天爱天天玩夜夜爽| 色色色综合| 丁香五月天堂| 丰满少妇猛烈A片免费看观看| 超碰天堂网| 日本三级第一页| 91人人妻人人操| 六月久久婷婷| 激情图片婷婷| 91碰| 综合五月激情| 五月婷婷丁香啪啪| 五月天成人小说| 狠狠人妻色综合| 另类天堂| 99ri精品在线| 色综合久久天天综合网| 久热中文字幕| 久久91久久精品久久| yazhochengrenavwang| 婷婷黄色| 激情五月婷婷五月| 99热国品| 综合色情网| 九九久久综合| 中文av网站| 99热这里是精品| 亚洲免费电影2| 天天综合情| 快色t v在线入口| 久久激情五月婷婷| 成人 AV播放| 色综合婷婷| 丁香婷婷色五月合集| 激情四射婷婷| 成人精品免费在线观看| 中文字幕簧片| 五月婷婷婷| 99.N在线视频| 99日韩网站| 色色综合网站| 色色五月天网站| 色大综合| 在线观看国产高清视频免费网站 | 五月婷婷六月开心| 五月婷婷啪啪啪啪| 婷婷五月激情基地| 99自拍视频在线| 亚洲综合一区二区| 五月丁香六月婷婷激情视频在线观看免费 | 亚洲无码影音| 69婷婷丁香午夜| 亚洲色婷婷| 91se在线观看| 舔色婷婷| 六月婷色| 五月婷婷六月丁香| 热九九九九| 能看的av片| 色色热| 五月天婷婷免费| 亚洲第一精品网站| 久久综合香蕉国产国产蜜臀AV| 三级黄网站| 怡红院一二三| 婷婷视频在线碰| 亚州视频九九99| 婷婷五月天成人网| 婷婷五月天综合蜜桃| 婷色五月| 精品国产va久久久久| 91超碰人人操| 久9热视频在线观看| 色综合色色| 五月丁香色色色| 天天檫天天爽| 在线亚洲综合| 思思热在线观看| 另类图片五月激情| 美国十月色婷婷在线观看| 大香伊人婷婷影院| 综合啪啪| 婷婷久久五月天| 99精品久久| 91精品久久久久久77777| 五月天色婷婷综合| www.精品99| 99热这里| 涩涩五| 51精品国自产在线| 99久热这里只有精品| 久久久久久久久18久久| 狠狠狠色激情综合适合| 99婷婷| 天天干天天干天天干| 婷婷五月天777| 99噜噜噜在线播放| 青草激情综合| 色~性~乱~伦~噜| 五月丁香啪综合| 91怕怕网| 精品婷婷| 色五月开心开心五月激情五月| 久久99久久99久久99| 精品色| 五月天婷婷基地综合网| a网站免费观看| 久久久久久综合五月婷婷| 97色综合视频| 99在线精品视频在线观看| 丁香六月婷婷久久综合八月| 97日本操| 狠狠操天天干| www五月婷婷88导航| 日韩操逼小电影| 夜夜躁婷婷AV| 国产91资源在线| 久久丁香五月婷| 色九九综合热99| 99热这里| 激情综合国产| 99精品爱| 玖玖在线视频福利| 色色色五月| 97香蕉碰碰人妻国产欧美| 加勒比色色| www.色色com| 久久婷婷色| 丁香婷婷六月激情综合| 99人人干| 婷婷色六月| 婷婷色综合| 色色com| 色五月婷婷天天干| 99久超碰| 思思热99er| 久久这里只精品| 五月中旬婷婷丁香六| 色五月婷婷操逼| 9久久狠狠的| 色碰碰| 综合久久五月| sS丁香五月婷婷| 天天干,天天操,天天射| 夜色五月天| www.99热这里只有精品| 久婷久婷| 五月丁香婷婷欧美| 色五月综合激情| 丁香五月天偷拍| 国产美女无遮挡裸体毛片A片| 99热碰碰| 亚洲精品99| 丁香婷婷六月激情综合| 2020久久婷婷五月| 亚洲激情 久久| 91九色丨国产丨爆乳| 99情色五月天| 久久艹 五月天| 婷婷五月六| 五月天色婷婷图片| 久久久久亚洲A∨成人乱码电影| 成人网在线视频| 亚洲9久久精品| 超碰成人公开| 久色精品| 大香伊人久色| 亚洲成AV人片在线观看| 天堂在线观看视频| 综合五月激情| 日本韩国视频在线观看社区免费的9| 久久五月丁香| 五月激情在线| 国产日产亚系列精品版优势| 婷婷情色开心五月天99| 婷婷色色网站| 婷婷五月丁香成人网| 双性美人被调教到喷水A片| 九九大香视频| 啪啪啪综合网| 国产精品18久久久| 色色三级视频| 九九热99在线视频| 超碰国产av| 大天天伊人| 久热伊人9| 久色五月天| 久久视频婷婷| 久久综合性| 思思99热这里只有精品| 99re久热只有精品6在线直播| 色5在线| 思思99精品视频在线观看| 色婷婷婷av| 这里只有精9| 色狠狠综合网| 亚洲激情| 久久久91| 亚洲婷婷月丁香五月| 特黄三级片| www。五月天激情| 都市激情蜜桃婷婷五月天| 二人电影免费版在线观看| 激情五月天综合图片小说网站| 激情网狠狠干| 99成人在线观看| 可以免费观看的AV| 天天做天天爱天天爽| 99热在线观看| 五月激情婷婷偷拍| 狠狠色噜噜狠狠狠狠综合| 日韩亚洲视频| 婷婷十月丁香| 99久久婷婷国产综合| 国产成人网站在线观看| 久久综合综合综合| 蜜乳9188| 熟女激情五月天 | 综合久久五月| 激情婷婷五月天| 久久九九国产精品怡红院| 国产人妻777人伦精品HD| 日韩日比视频在线| 激情欧美婷婷| www激情com| 久久亚洲婷婷| 亲子乱av一区二区三区的| 久久久婷丁香五月天激情综合| 五月天婷婷一起草| 天天射影视综合网| 4399在线日本A片| 疯狂做受XXXX高潮A片| 一本狠婷婷综合| 久久网站免费亚洲| 成人va视频| 色色国产| 超碰97人人操| 噜噜色噜噜网| 人与禽A片啪啪| 狠狠爱婷婷丁香| 色婷婷最爱五月| 久久99久久99精品免观看软件| www.五月丁香| 五月婷婷综合成人| 五月社区丁香| 欧美色婷婷| 狠狠色噜噜狠狠亚洲A∨| 婷婷五月丁香综合亚洲| 九九激情视频| XX色综合| 五月情综合| 色色色婷婷五月天| 伦99热| 婷婷五月天在婷| 在线观看av网站| 另类婷婷五月天啪帕帕| www.狠狠色.com| 久久久五月天| 亚洲成人在线综合| 五月婷婷AV| 少妇AB又爽又紧无码网站| 91碰| 成人版视频在线观看| 五月婷婷综合色啪首页| 九九九九九九九热| 青草视频在线观看视频| 热的国产99热| 开心激情网五月天| 婷婷色在线观看| 九九这里只有精品| 亚洲成Av人片乱码色第1集| 99热精国产这里只有精品| 天天干一干| 99婷婷五月天| 久久97| 嫩模aV在线| 日韩在线99| www.91在线看| h亚洲| 日熟女| 五月天婷婷社区| 艹色18p| 激情五月丁香六月综合AVXXXX| 播丁香五月婷婷欧美| 丁香色播五月天| 婷婷五月天综合网| 五月天成人在线| 午夜精品久久久久久久爽| se色99| 亚洲日韩乱码一区二区三区四区| 成人欧美一区二区三区在线观看| 超碰在线看| 亚洲免费av在线| 99爱视频| 91狠狠综合久久久| 五月天婷婷久久| 丁香五月天激情婷婷丁香六月 | 久久婷婷成人综合色怡春院| av免费在线网站| 欧美激情综合色综合啪啪五月| 丁香五月综合无码趴趴| 久久超级碰碰| 色五月丁香总合网| 激情网 久久| 久久精品亚洲一级牲爱综合| 欧美WW在线网| 99精品视频免费观看| 成人色站,在线视频,看片-SS1AV| 日本无码专区| 66色在线日韩| 色噜噜狠狠色综合AV兰草影视| 99re久久| 婷婷激情五月综合| 99在线精品视频| 99热.com| 五月天黄色激情小说| 激情碰碰碰| 久久五月激情| 日本a片网址| 亚洲色就是色色色| 久久五月天视频| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 久久人妻熟女一区二区| 婷婷五月丁香在线视频| 狠狠色色| 九九色网| 这里只有精品视频在线| 六月狠狠综合| 婷婷丁香97| 亚洲成人一区| 人人看人人要| 99久久99九九99九九九| 99久久超级| 爽极品色| 久久性爱视频这里只有精品| 97久久五月丁香婷婷| 天天日天天色| 91丨人妻丨国产丨丝袜| 色五月激情五月开心五月| 精品99在线| w婷婷五月婷婷w| 中文字幕在线免费| 卡视频1区2区| 青青草视频免费观看| 国产激情AV| 亚洲欧美999| 2020久久婷婷五月| 曰曰久久| 久久sp免费视频| 亚洲中文字幕在线观看| 永久精品| 婷婷天天日婷婷| 色婷婷欧美在线| 99色.com| 91精品又长又大又粗又爽又猛| 五月婷婷开心丁香| 亚洲乱码精品久久久久..| 九九色影视| 99精品视频偷拍| av操一操| 婷婷丁香五月综合| 久9精品| 激情视频综合| 婷婷五月综激情| 丁香五月婷婷亚洲综合精品| 激情九月婷婷| 婷婷色综合| 丁香五月婷婷动漫视频| 亚洲中字AV电影在线网站| 色婷婷亚洲在线| 超碰妻人人| 久久久久久五月天| Caoub青青超碰 | 色五月激情五月丁香五月婷婷啪啪综合 | 色五月婷婷成人| 天天橾日日橾夜夜橾17| 婷婷丁香18| 五月丁香六月欧美| 久久婷婷五月综合网| 五月天激情综合在线| 色九网| 五月丁香六月婷| 激情五月天视频| 97色婷婷| 极品少妇高潮啪啪AV无码| 狠狠做五月婷婷| 九九热精品| 五月天开心成人网| 丁香激情综合| 九九视频在线观看| 九九色大香蕉| 婷婷色在线| 96人人操人人操人人| 少妇做爰免费视看片| 99久久综合网| 丁香六月婷婷久久亚洲天堂| 91婷婷丁香| 亚洲综合网激情五月天| 色色综合院| 激情综合色| 国产欧美日韩一区二区三区| 91日精品| 天天综合网站| 色五月中文网| 电影蜘蛛女| 大香人妻| 五月丁香六月婷综合成人综合 | 九九99精品| 操操操B| 亚洲性爱电影| 五月天影院婷婷在线观看| 99啪在线视频| 五月开心网| 开心五月网 | 久久婷婷五月综合| 激情电影五月婷婷| 亭亭五月丁香五月天激情| 天天干天天射综合网| 超碰91人人操| 99久99久| 夜夜谢天天干| 色五月丁香婷婷| 男人天堂亚洲综合| 美女精品一级不卡视频| 丁香五月婷婷国产av| 亚洲九区| 99精品福利视频| 月月AV| 五月婷婷综合久久| 永久天堂日本| 免费视频无码| 五夜婷婷| 成人va在线播放| 白天AV月月| 日韩婷婷| 色婷婷色| 色播jjjj| 狠狠狠狠狠| A在线观看| 亚洲情a| 这里只有精品视频在线观看免费| 激情人妻综合| se婷97| 亚洲亚洲人成综合网络| 色五月婷婷久久| 色婷婷五月天视频网站| 久久 这里只有精品1| jiZZdr| 亚洲天堂啪啪| 夜夜骑夜夜操| 婷婷五月色網站| 婷婷五月天直播| 丁香五月天网站| 丁香综合久久| 九九色情网五月天| 欧洲综合一区| 日本婷婷激情四射中文字幕在线观看| 中文字幕成人| 九九AV| 婷婷五月综合社区| 五月婷婷综合丁香视频| 色色色色色网站| 天天操,天天插| 五月丁香啪啪拍| 婷婷五月综合婷婷| 91丨九色丨熟女高潮| 久久综合首页| 日韩精品一区二区亚洲AV观看| Y11111111111少妇电影院| 一本色道久久88加勒比| 少妇水多A片太爽了| 成人av免费观看| 婷婷五月天久久| 婷婷五月天色色| 色婷婷免费观看| 色丁香五月| 激情九色| 综合久久高清| 丁香六月激情四射| 久婷婷婷| 色婷婷导航| www.日日夜夜.com| 99色网站| 五月天激情网图片| 欧美性色A片免费免费观看的| 亚洲精品又粗又大又爽A片| 五月婷婷五月天| 精品国产AV色一区二区深夜久久| 超碰99热| 成人无码髙潮喷水A片| 亚洲日韩一页精品发布| 成 人片 黄 色 大 片| 国产人妻777人伦精品HD| 国产XXXX搡XXXXX搡麻豆| 久久国产一区二区三区| 爱爱网址9| 五月婷婷综合成人| 91色碰| 99在线公开视频| 91日本在线| 久这里只有精品99| 国产日日夜夜操| 亚洲va在线| 天天操屄网| 伊人婷婷五月天| 五月天堂色| 丁香婷婷六月| 欧美性生交XXXXX无码小说| 91在线观看九区| 超碰色天堂| 玖玖综合色| 99热精品网| 欧洲免费视频色| 丁香五月婷婷基地| www.婷婷五月| 草草夜夜操| 久久婷婷六月综合综合| 人人操插| 五月综合亚洲| 日本色五月| 99热这里只有精品22| 国产毛片欧美毛片久久久| 亚洲va久久久噜噜噜久久天堂| 婷婷色情五月| 高清无码.com| 日日夜夜综合| 天堂中文国产| 国产精品久久久久久久久久| 亚洲色区17| 99热国产精品| 久久婷婷欧美| 久青操| 97色吧| 日本大逼91| 综合激情伊人影视在线| 色欲五月婷婷| 97超碰人人操| 亚洲午夜成人av电影网| 亚洲色夜| 日日色五月天| 中文在线成人| 亚洲国产精品二二三三区| 亚洲欧美国产A片免费观看| 亭亭色色五月天| 激情综合色婷婷啪啪六月天| 91视频一起草| 五月天天丁香婷婷| 五月丁香福利| 噜噜噜噜噜色| 成人va在线播放| 4399精品一区二区| 99热情这里只有精品在线播放| 青青草原福利在线| 五月天婷婷在线播放| 亲子乱AV-区二区三区| 色五月婷婷婷婷婷婷婷婷婷婷| 欧美啄木乌丝袜人妻系列| 久久婷婷五月天懂色| 啪啪日本欧美| 色热久资源| 久久a热| 麻豆WWWCOM内射软件| 丁香狠狠色婷婷| 99色 色| 色情五月综合婷婷| 色婷婷激情五月天| 亚洲 小说 欧美 激情 另类| 国产99久久久| 久久人视频| 丁香五月天婷婷久久| 亚洲99综合| www,99色| 婷婷综合网伊人| 色综合色色色| 99a级片| 色婷婷五月中文字幕在线dvd| 激情五月综合| 九九99九九99| 久久九九免费视频| 色逼综合网| 婷婷丁香六月影视| 老司机伊人| 4399在线观看免费高清黄色视频| 激情婷婷综合五月少妇| 色五月亚洲| av中文在线| 国产avapp 网| 亚洲在线播放| 丁香五月婷婷婷桃花影院| 五月天色婷婷视频| 丁香五月激情综合| 色婷婷五月天av在线| 久久婷婷五月天| 亚洲第二AV| 五月天激情啪啪| 97超碰婷婷五月天| 综合xx网| 亚洲激情av| 婷婷五月天最新综合你懂的| 99ri国产在线| 色九月婷婷丁香| 五月天狠狠网| 色婷大香蕉| 亚洲激情精品| 久久婷婷免费| 婷婷综合五月色播| 狠狠爱成人综合网| 色婷婷激情视频| 日本WwW色偷偷丁香花久久久京东热| 色亚洲中文| 成人视频网| 翔田千里aV中文字幕| 日本99久久| 天天色天天爽| 婷婷五月天AV| 99激情视频热| 北京熟妇搡BBBB搡BBBB| 五月天播播综合| 精品夜夜澡人妻无码AV| 婷婷六月婷婷| 四川女人毛多水多A片| 九九在线免费观看| 婷婷五月丁香综合亚洲| 天天日天天日天天搞| 超极99精品| 超碰熟女拍拍| 97伊人综合婷婷| 午夜婷婷久久| 欧美人人操| 亭亭玉月丁香| 丁香五月婷婷姐| 五月日韩中文字幕| 热成人网| 激情 婷婷| 丁香五月欧美激情| 婷五月丁香俺| 亚洲精品无AMM毛片| 婷婷五月中文字幕国产| 日韩AV成人电影| 香蕉人在线香蕉人在线 | 五月天久久www| 色五月天在线观看| 五月熟妇婷婷久久| 成人久碰| 99综合视频| 婷婷六月啪啪| 六月激情网| 亚洲激情综合五月婷婷啪啪| 久久久久五月丁香| 色播婷婷大香蕉| 亚色网站小视频| 中文AV网站| 九九热精品视频在线观看| 久久9久| 香蕉AV福利精品导航| 99成人小视频| 欧美大香蕉视频| 99热亚洲| www.五月天激情| 中美日韩成人在线| 农村熟妇高潮精品A片| 人妻久久久久久久久久久| 91热视频色网站| 亚洲激情网| 九九亚洲视频| 五月婷精品| 久热在线中文字幕色999舞| 婷婷五月天成人小说| 玖玖色综合网| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 日婷婷| 人人草公开操| av婷婷丁香| 五月婷婷综合激情网| 亚洲五月丁| av在线免费网站| 国产精品18久久久| 97热这里只有精品| 激情网五夜婷婷| 亚洲欧美国产A片免费观看| 性爱视频99| 五月激情久久综合网| 婷婷五月天久久久| 日韩人妻在线播放| 五月亭亭直播| 婷婷六月丁| 婷婷激情五月天7| 99视频在线看| 欧美激情综合色综合啪啪五月| 99无码黄色视频| 婷婷五月天改成什么了| 激情婷婷视频在线| 成人片黄网站色大片免费毛片| 丁香婷婷六月| 欧美黄色一级| 色色色色五月| 泰州成人视频| 五月伊人视频在线看| 亚洲第一成人无码A片| 五月天色软件| 丁香五月激情综合| 色欧美影院| 中文字幕性爱丰满| 26UUU一区二区| 久久新地此| 操操综合网婷婷| 天天干天天拍| www久久艹| 五月天激情啪啪| 激情五月综合六月丁香婷婷狠狠干| 人人操人人干AV| 亚洲成人日韩无码精品| A久久| 97操操| 激情五月色婷婷| 色色网站免费观看| VA五月激情在线| 97精品欧美91久久久久久久| 色原狠狠综合| 色综合99无码| 国产午夜成人AV在线播放| 日本三级大片| 激情床戏| 五月天婷婷小说| 久热这里只有精品视频免费观看| 99热国产国产| 99色色热热| 激情综合五| 免费人人操| 国产中文字幕在线视频免费观看 | 久热亚洲| 深爱开心激情| 有哪些A片网站| 另类小说五月天综合网| 99热这里只有精品国产免费| 超碰成人在线观看| 久久婷网| 大香蕉免费9| 99碰碰中文| 69久久久| 玖玖综合色区在线观看| 日本操天堂| av国产精品| 成人午夜天| 少妇性BBB搡BBB爽爽爽电影| 婷婷五月天基地| 婷婷99狠狠| 久热9| www.久久| 色婷婷狠狠爱| 激情五月综合网| 91久久婷婷| 国产亚洲99久久精品| 久久五月视频| 欧美日韩成人在线| 玖玖热视频| 思思热视频在线| 午夜一区| 无码少妇高潮喷水A片免费| 亚洲亚洲人成综合网络| 国产成人精品123区免费视频| 九九AV| 精品影院| 丁香五月婷婷社区| 色情网综合| 免费成片在线观看| 九九综合网色全集| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 色婷婷五月综合在线| 强伦轩人妻一区二区电影| 大香蕉婷婷丁香视频在线| 成人片在线播放| 可以直接看的av| 久久婷婷精品| 人妻丰满精品一区二区A片| 玖玖爱伊人网| 爱狠射| 国产成人在线不卡AV| 五月丁香激情综合| 天天色情站| 亚洲婷婷婷| 99热这里有精力| 五月丁香激情综合啪啪| 色色五月婷婷| 嫩草AV久久伊人妇女超级A| 激情网 久久| 成人VAV视频在线观看| 九色七七| 精品久久人妻热| 婷婷五月天欧美图片在线播放电驴| 九月婷婷色色| 久久激情视频99| 天天天天天色| 五月丁香啪啪伦理电影| 97影院一级片| 天天爽天天操| 亚洲综合碰| 六月婷婷激情图片| 狠狠草婷婷| 久久ab| 婷婷中文字幕| 97超碰婷婷五月天| 天堂五月婷婷| 亚洲综合激情五月天婷婷 | 亚洲中字AV电影在线网站| 加勒比久热| 婷婷九月激情| 婷婷五月丁香婷婷| 中文av网| 五月婷婷五月天| 国产精品黑丝| 7777激情基地| 国际国外精品欧洲南美洲专区无码不卡| 亚亚州久久高潮| 久操操| 色播激情婷婷| 亚洲色啪| 五月天婷婷丁香社区| 大香蕉综合在线| 九九热123| 任你日视频| 麻豆五月丁香婷婷| 99re热在线视频| 黄色网址五月婷婷| 另类综合激情| 人人人人人人人草| 色播丁香| 久久五月丁香综合| 天天干,天天舔| 99热这里只有精品2| 色五月五月婷婷| 久久五月情| 婷婷成人综合免费视频| 丁香五月六月婷婷综合| 青草视频在线播放| 成人在线不卡| 五月天,激情四射,婷婷频道| 丁香五月欧美| 成人在线视频一区| 中文无码精品一区二区三区| 色狠狠综合网| yw国产AV| 久久这里在精品视频| 丁香五月婷婷基地| 丁香五月婷婷激情四射深爱激情| 99性视频| 99网99热| 婷婷色色综合| 高清无码.com| 中文字幕综合| 日韩无码亚欧无码| 深爱激情五月天色婷婷| 女婷久久| 国产婷婷久久| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 色性综合| 97色热| 91综合网| 99爱免费在线视频| 五月天激情视频| 久久久宗合| 婷婷五月激情六月| 婷婷丁香五月天激情四射| 婷婷五月成人有| 五月婷婷狠狠干| se.久久视频在线观看| 久久久99精品| 福利视频在线播放| 99久热这里只有精品视频删减版| 人人摸人人澡人人| 4399精品一区二区| 人妻尝试久久久久久久久久久久| 99操逼| 99热婷婷| 97久久草草超级碰碰碰| 另类丁香综合| 91精品综合久久久久久五月丁香 | 激情五月色婷婷| 五月色情精品| 99视频热| 色综合99无码| 婷婷日日天天| 色噜噜狠狠色综无码久久合欧美| 久久色在线视频| 久久六月天| 丁香五月色情| 中文字幕在线免费观看视频| 91碰超| 婷婷色在线视频| 日韩一级网站| 久久久久久久人妻| 亚洲色图日韩网址| 中文字幕婷婷五月天在线观看| 丁香五月天天日| 色婷婷99| 色激情综合狠狠婷婷| 六月婷婷色综合| 99re思思| 婷婷色网| 天天做天天双| 中文字幕按摩做爰| 五月丁香久久综合精品| 免费看欧美成人A片无码| 五月丁香亭亭成人电影| 无码少妇高潮喷水A片免费| www。88热在线视频免费观看| 色丁香五月婷婷| 婷婷的五月天另类视频| 国产SUV精品一区二区6| www.五月天性.com| 国内一级片| 婷婷五月图片小说视频| 国产av网| 婷婷五月色天| 天天操婷婷| 色狠狠色| 日韩a热| 农村熟妇高潮精品A片| 久久婷婷五月草视频| 婷婷天堂综合网| 亚洲五月天激情| 亚洲av成人在线| 色播五月婷婷| 婷婷永久在线| 色五月噜噜| 九九热视频在线观看| 67194成I人在线观看线路1| 丁香五月婷婷在线| 综合激情五月丁香| 五月停视频天堂| www.天天干| 操91| 99精品偷自拍| 五月激情六月综合| 热久久91| 亚洲国产精品SUV| 丁香五月六月激情久久| 超碰无码318604| 婷婷亚洲综合| 五月丁香六月婷婷在线播放| 人人操人人添人人摸97| 91无码视频| 激情5月婷婷狠狠干| 五月天另类小说久久小说网| 26uuu欧美| 婷婷五月天成人五月天| 九久久婷婷| 开心激情站| 丁香五月综合色婷婷| Av中文在线| 99热这里只有精品1025| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 亚洲小电影在线观看黄999| 色婷婷亚洲婷婷| 日日夜夜小色哥| 婷婷伊人综合中文字幕| 国产JK精品白丝AV在线观看| 九一99| 99热偷拍| 成人龟情网丁香五月| 99色精品| 五月丁香婷婷久久| 日韩淑女人妻luan伦激情精品一区二| 九九热99热| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 99自拍视频| 百度一下国产精品A| 深夜男女福利刺激影院一区完整| 热99久久这里只有精品| 婷婷九色| 丰满少妇猛烈A片免费看观看| 色婷婷AV在线| 婷婷成人丁香色情基地30 |