久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

SpringBoot異步調(diào)用實(shí)戰(zhàn):@Async線程池、WebFlux與消息隊(duì)列全解析

SpringBoot異步調(diào)用實(shí)戰(zhàn):@Async線程池、WebFlux與消息隊(duì)列全解析 1. 為什么要做異步調(diào)用從一次接口超時(shí)說起先講一個(gè)真實(shí)的場景。之前我給某個(gè)后臺(tái)管理系統(tǒng)做導(dǎo)出功能用戶在前端點(diǎn)了一個(gè)“導(dǎo)出報(bào)表”后端同步去數(shù)據(jù)庫里查幾十萬條數(shù)據(jù)再拼裝Excel最后返回文件流。單次執(zhí)行時(shí)間普遍在15秒以上前端請(qǐng)求早超時(shí)了用戶反復(fù)點(diǎn)了幾次后臺(tái)直接堆了好幾個(gè)線程在處理同一件事。這個(gè)問題的根源不在代碼性能而是同步阻塞的調(diào)用模型。請(qǐng)求線程從接收到返回全程霸占著不放導(dǎo)出的耗時(shí)越長能用線程就越少數(shù)據(jù)庫連接池、Tomcat線程池都被拖累服務(wù)整體吞吐跟著掉。SpringBoot下的異步調(diào)用就是面向這類場景的標(biāo)準(zhǔn)解法把耗時(shí)操作丟給另一個(gè)線程去執(zhí)行請(qǐng)求線程立刻返回調(diào)用方不需要干等。本文會(huì)從三種主流實(shí)現(xiàn)方式展開基于Async注解的線程池異步、基于WebFlux的響應(yīng)式異步、以及消息隊(duì)列的最終解耦同時(shí)把實(shí)際開發(fā)中容易踩的失效、線程耗盡、上下文丟失這幾個(gè)坑一并講清楚。2. SpringBoot異步調(diào)用整體方案盤點(diǎn)2.1 同步、異步、阻塞、非阻塞幾個(gè)概念先理清聊異步之前得先把概念統(tǒng)一一下不然下面代碼容易看混。同步和異步說的是調(diào)用方的處理方式。調(diào)一個(gè)方法必須等它跑完才能繼續(xù)做別的事就是同步調(diào)用后立即返回結(jié)果通過回調(diào)、輪詢、Future或事件來獲取就是異步。阻塞和非阻塞說的是線程的狀態(tài)。線程在等待結(jié)果期間被掛起、不能做別的事就是阻塞線程發(fā)起操作后不等待繼續(xù)往下執(zhí)行就是非阻塞。“異步”不等于“快”它只是讓當(dāng)前線程不被拖住。真正省時(shí)間的是并行的計(jì)算資源所以異步方案幾乎必須配套線程池否則異步任務(wù)全堆在單線程里反而更慢。2.2 三套方案怎么選方案核心機(jī)制適合場景需要注意的點(diǎn)Async 線程池AOP代理 獨(dú)立線程池執(zhí)行方法業(yè)務(wù)代碼里局部耗時(shí)的操作比如發(fā)通知、寫日志、生成報(bào)表自調(diào)用無效、線程池參數(shù)要配好WebFlux 響應(yīng)式異步基于Netty事件循環(huán) 響應(yīng)式流高并發(fā)IO密集型接口網(wǎng)關(guān)層、數(shù)據(jù)聚合接口全鏈路要反應(yīng)式不能混用阻塞調(diào)用消息隊(duì)列異步生產(chǎn)者發(fā)消息消費(fèi)者獨(dú)立處理跨系統(tǒng)解耦、削峰填谷、可靠投遞場景需要額外中間件要考慮消息冪等這三套方案不是互相替代的關(guān)系。一個(gè)大型項(xiàng)目里接口內(nèi)部會(huì)用Async處理局部任務(wù)核心入口用WebFlux扛流量系統(tǒng)之間再用消息隊(duì)列解耦各管一段。3. Async注解最常用的異步實(shí)現(xiàn)方式3.1 第一個(gè)Demo從配置到生效Async是Spring框架自帶的能力SpringBoot里用起來很方便。先在啟動(dòng)類或者配置類上加上EnableAsync意思是開啟異步調(diào)用的注解掃描SpringBootApplication EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }然后寫一個(gè)異步服務(wù)把需要異步執(zhí)行的方法用Async標(biāo)記Service public class NotificationService { Async public void sendSms(String mobile, String content) { // 模擬短信接口耗時(shí) try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println(短信發(fā)送完成: mobile); } }調(diào)用方正常注入Service調(diào)用方法就行RestController RequestMapping(/api/order) public class OrderController { private final NotificationService notificationService; public OrderController(NotificationService notificationService) { this.notificationService notificationService; } PostMapping(/create) public String createOrder() { // 訂單業(yè)務(wù)邏輯 notificationService.sendSms(138****1234, 您的訂單已創(chuàng)建); return 下單成功; } }運(yùn)行起來請(qǐng)求接口后響應(yīng)立刻返回不會(huì)等那3秒。短信任務(wù)在獨(dú)立的線程里執(zhí)行這就是最基礎(chǔ)的Async用法。3.2 為什么Async能生效代理機(jī)制要明白這是理解Async的關(guān)鍵點(diǎn)也是后續(xù)排查失效問題的理論基礎(chǔ)。Spring容器在啟動(dòng)時(shí)掃描到Async注解的方法會(huì)給Bean生成一個(gè)代理對(duì)象。當(dāng)我們從容器里拿到這個(gè)Bean并調(diào)用方法時(shí)實(shí)際調(diào)用的是代理對(duì)象代理對(duì)象會(huì)先把任務(wù)提交給線程池然后返回。也就是說異步邏輯是被“包裝”進(jìn)去的而不是你寫的那個(gè)方法本身變成了異步?;谶@個(gè)原理有兩個(gè)經(jīng)典結(jié)論第一Async方法必須被Spring容器管理也就是放在Service、Component這些Bean里。第二同一個(gè)類內(nèi)部調(diào)用帶Async的方法不會(huì)走代理等于直接調(diào)用原方法異步失效。后面第6部分我會(huì)專門講這個(gè)坑。3.3 自定義線程池讓異步任務(wù)跑在正確的線程上默認(rèn)情況下Async用的是Spring自帶的SimpleAsyncTaskExecutor這個(gè)類每次執(zhí)行都會(huì)新建一個(gè)線程沒有復(fù)用機(jī)制。高并發(fā)場景下線程數(shù)無上限增長系統(tǒng)資源很快耗盡。生產(chǎn)環(huán)境必須自定義線程池。推薦用Java配置類創(chuàng)建ThreadPoolTaskExecutorConfiguration public class AsyncConfig { Bean(taskExecutor) public Executor taskExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); // 核心線程數(shù)正常情況下常駐的線程數(shù)量 executor.setCorePoolSize(10); // 最大線程數(shù)高峰期最多能擴(kuò)展到的線程數(shù)量 executor.setMaxPoolSize(50); // 隊(duì)列容量核心線程全忙時(shí)新任務(wù)先放隊(duì)列 executor.setQueueCapacity(200); // 線程名前綴排查問題時(shí)好識(shí)別 executor.setThreadNamePrefix(async-task-); // 拒絕策略隊(duì)列也滿的時(shí)候怎么處理新任務(wù) executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }參數(shù)大小怎么定這是被問得最多的。核心線程數(shù)參考機(jī)器的CPU核數(shù)和任務(wù)類型。IO密集型任務(wù)調(diào)遠(yuǎn)程接口、讀寫文件等待時(shí)間占比高核心線程數(shù)可以設(shè)成CPU核數(shù)的2倍以上CPU密集型任務(wù)大量計(jì)算設(shè)成CPU核數(shù)加1到2個(gè)就夠。設(shè)核心線程10、最大線程50、隊(duì)列200意思是正常情況下10個(gè)線程在跑任務(wù)多的時(shí)候先排隊(duì)隊(duì)滿之后才會(huì)把線程數(shù)往上提最多50個(gè)還是處理不過來就觸發(fā)拒絕策略。使用自定義線程池時(shí)Async注解里要指定名字Async(taskExecutor) public void sendSms(String mobile, String content) {如果不指定Spring會(huì)按類型查找默認(rèn)執(zhí)行器找到唯一實(shí)現(xiàn)類就自動(dòng)使用。建議還是顯式寫名字多個(gè)線程池并存時(shí)不容易混。3.4 有返回值的異步調(diào)用Future與CompletableFuture現(xiàn)實(shí)中很多異步任務(wù)需要帶結(jié)果回來。Async支持Future類型的返回值最常用的是CompletableFuture。Service public class ReportService { Async(taskExecutor) public CompletableFutureString generateReport(Long userId) { // 耗時(shí)邏輯比如統(tǒng)計(jì)數(shù)據(jù) String reportContent 用戶 userId 的報(bào)表數(shù)據(jù)...; return CompletableFuture.completedFuture(reportContent); } }調(diào)用方可以主動(dòng)組合多個(gè)異步任務(wù)public String handleReportRequest() throws Exception { CompletableFutureString reportFuture reportService.generateReport(1001L); CompletableFutureString otherFuture otherService.generateOtherData(1002L); // 等待兩個(gè)任務(wù)都完成并合并結(jié)果 String result CompletableFuture.allOf(reportFuture, otherFuture) .thenApply(v - reportFuture.join() otherFuture.join()) .get(30, TimeUnit.SECONDS); return result; }allOf會(huì)等所有任務(wù)完成后再執(zhí)行合并邏輯get方法設(shè)置超時(shí)時(shí)間避免任務(wù)卡死導(dǎo)致調(diào)用方無限等待。這里有一個(gè)細(xì)節(jié)CompletableFuture.join和get的區(qū)別。get拋受檢異常需要try-catch或向上拋出join不拋受檢異常直接在RuntimeException里包裝。業(yè)務(wù)代碼里我更習(xí)慣用get帶超時(shí)至少不會(huì)把控制權(quán)無限交給異步任務(wù)。3.5 異步任務(wù)的異常處理Async方法默認(rèn)的異常處理方式是如果方法沒有返回值異常會(huì)被吞掉日志里可能什么都看不到。這是新手最容易忽略的點(diǎn)。處理方案有兩種。第一種方法返回Future異常會(huì)封裝在Future里調(diào)用get時(shí)拋出由調(diào)用方處理。這種方式能讓異常回到業(yè)務(wù)鏈路但調(diào)用方需要等待結(jié)果有些場景不算理想。第二種實(shí)現(xiàn)AsyncUncaughtExceptionHandler配置成自定義的異步異常處理器Configuration public class AsyncExceptionConfig implements AsyncConfigurer { Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(50); executor.setQueueCapacity(200); executor.setThreadNamePrefix(async-); executor.initialize(); return executor; } Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return (ex, method, params) - { // 這里統(tǒng)一記錄異常日志或者接入告警系統(tǒng) System.err.println(異步方法執(zhí)行異常: method.getName()); ex.printStackTrace(); }; } }注意如果實(shí)現(xiàn)AsyncConfigurergetAsyncExecutor里返回的Executor就是全局默認(rèn)的線程池所有沒指定名稱的Async都會(huì)用它。如果類里還有其他配置方式要避免兩個(gè)配置源互相覆蓋。異常處理選哪種取決于對(duì)這個(gè)異步任務(wù)結(jié)果的依賴程度。純通知類任務(wù)用自定義Handler記錄異常就夠了核心流程的分支任務(wù)建議返回Future讓主流程能感知失敗。3.6 Async與事務(wù)的疊加效果Async和Transactional同時(shí)使用時(shí)很多人以為事務(wù)會(huì)正常工作實(shí)際上需要分情況。Spring的事務(wù)也是通過代理實(shí)現(xiàn)的Transactional默認(rèn)只在當(dāng)前線程內(nèi)生效。Async方法把邏輯推到了另一個(gè)線程事務(wù)注解如果只寫在異步方法上事務(wù)還是有效的——只要事務(wù)管理器能拿到對(duì)應(yīng)的連接。但組合時(shí)的經(jīng)典問題是事務(wù)傳播。假設(shè)主方法開啟事務(wù)調(diào)用本類里一個(gè)被Async標(biāo)記的方法這個(gè)方法又寫了Transactional此時(shí)它跑在另一個(gè)線程里主線程的事務(wù)上下文傳不過去兩個(gè)事務(wù)互相獨(dú)立。如果異步方法內(nèi)部對(duì)同一數(shù)據(jù)做了修改主事務(wù)提交失敗時(shí)異步事務(wù)可能已經(jīng)提交了數(shù)據(jù)一致性就出問題了。實(shí)操建議把異步和事務(wù)當(dāng)成兩個(gè)獨(dú)立的邊界。事務(wù)管理交給主流程異步方法里的數(shù)據(jù)一致性靠消息確認(rèn)、狀態(tài)機(jī)或者定時(shí)補(bǔ)償來解決不要指望跨線程的兩個(gè)代理還能保持完整的ACID語義。4. WebFlux響應(yīng)式異步換一種執(zhí)行模型4.1 WebFlux不是“異步版的SpringMVC”有些人把WebFlux理解成“用起來更異步的MVC框架”這是不對(duì)的。WebFlux改變了底層的執(zhí)行模型。SpringMVC基于Servlet規(guī)范每個(gè)請(qǐng)求占用一個(gè)Tomcat工作線程線程阻塞時(shí)這個(gè)線程什么都不能干。WebFlux基于Netty事件循環(huán)用的是少量線程配合事件回調(diào)來處理海量并發(fā)請(qǐng)求。線程不阻塞等待而是注冊(cè)回調(diào)數(shù)據(jù)來了再觸發(fā)后續(xù)邏輯。所以WebFlux的高并發(fā)能力來自它極低的線程占用。同樣一臺(tái)機(jī)器MVC能扛幾百并發(fā)時(shí)WebFlux往往能扛幾千甚至更高前提是代碼里不能有阻塞調(diào)用。引入WebFlux在pom里加依賴dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency注意如果項(xiàng)目里同時(shí)引入了spring-boot-starter-webMVC要移除其中一個(gè)或者明確端口配置否則兩個(gè)容器會(huì)沖突。4.2 響應(yīng)式寫法的基本形態(tài)接口返回Mono或Flux類型表示這個(gè)結(jié)果是“未來某個(gè)時(shí)刻才會(huì)出現(xiàn)的”RestController RequestMapping(/api/user) public class UserReactiveController { private final UserService userService; public UserReactiveController(UserService userService) { this.userService userService; } GetMapping(/{id}) public MonoUser getUser(PathVariable Long id) { return Mono.fromCallable(() - userService.findById(id)) .subscribeOn(Schedulers.boundedElastic()); } }這個(gè)接口里findById這個(gè)阻塞型操作被丟到boundedElastic線程池里執(zhí)行而Netty事件循環(huán)線程立刻返回不阻塞。等數(shù)據(jù)查到了再通過回調(diào)把響應(yīng)寫回客戶端。4.3 響應(yīng)式鏈路的寫法規(guī)范響應(yīng)式異步的關(guān)鍵在于整條鏈路都要保持響應(yīng)式。如果Service層用的是JPA的findById這本身就是阻塞調(diào)用。把它包在Mono.fromCallable里的效果是異步線程執(zhí)行了阻塞查詢這確實(shí)能提升并發(fā)但底層依賴的還是線程池本質(zhì)上是“用線程池隔離阻塞”而不是真正的全鏈路響應(yīng)式。真正做到全鏈路響應(yīng)式要求數(shù)據(jù)訪問層也返回響應(yīng)式類型。比如用R2DBC訪問數(shù)據(jù)庫public interface UserRepository extends ReactiveCrudRepositoryUser, Long { FluxUser findByStatus(String status); } RestController public class UserController { private final UserRepository userRepository; public UserController(UserRepository userRepository) { this.userRepository userRepository; } GetMapping(/active) public FluxUser getActiveUsers() { return userRepository.findByStatus(ACTIVE); } }這種寫法下從HTTP入口到數(shù)據(jù)庫驅(qū)動(dòng)全程沒有阻塞等待。每個(gè)環(huán)節(jié)都是“準(zhǔn)備好了就通知下一個(gè)環(huán)節(jié)”線程利用率極高。4.4 實(shí)際項(xiàng)目里的語句WebFlux適合網(wǎng)關(guān)層、聚合層比如給App提供統(tǒng)一的聚合接口同時(shí)調(diào)用訂單服務(wù)、支付服務(wù)、用戶服務(wù)的接口把它們的結(jié)果合并返回。每個(gè)下游調(diào)用都返回響應(yīng)式結(jié)果合并時(shí)用zippublic MonoOrderDetailVO getOrderDetail(String orderId) { MonoOrder orderMono orderClient.getOrder(orderId); MonoListPayment paymentMono paymentClient.getPayments(orderId); MonoUser userMono userClient.getUserByOrderId(orderId); return Mono.zip(orderMono, paymentMono, userMono) .map(tuple - { Order order tuple.getT1(); ListPayment payments tuple.getT2(); User user tuple.getT3(); return buildVO(order, payments, user); }); }三個(gè)下游調(diào)用并行執(zhí)行全部返回后組裝成VO發(fā)給客戶端。如果是MVC寫法這種聚合要么串行請(qǐng)求要么手動(dòng)管理線程池代碼冗長且容易出錯(cuò)。4.5 WebFlux的代價(jià)響應(yīng)式不是免費(fèi)的午餐。它最大的問題是調(diào)試?yán)щy。傳統(tǒng)代碼的堆棧在線程切換后變得支離破碎異常信息經(jīng)常不會(huì)指向真正出問題的位置。響應(yīng)式代碼的學(xué)習(xí)曲線也陡峭flatMap、concatMap、switchIfEmpty這些操作符的語義不熟悉的人很容易寫出性能極差的代碼。我的個(gè)人結(jié)論是中小型項(xiàng)目業(yè)務(wù)邏輯復(fù)雜團(tuán)隊(duì)也沒有響應(yīng)式經(jīng)驗(yàn)不要強(qiáng)行上WebFlux。用Async配合線程池改造局部痛點(diǎn)性價(jià)比高得多。WebFlux適合高并發(fā)、IO密集、業(yè)務(wù)鏈路清晰的下游聚合或網(wǎng)關(guān)項(xiàng)目。5. 消息隊(duì)列跨系統(tǒng)異步解耦5.1 什么時(shí)候需要消息隊(duì)列Async解決的是進(jìn)程內(nèi)的異步消息隊(duì)列解決的是跨進(jìn)程的異步。訂單創(chuàng)建后要通知積分系統(tǒng)、短信平臺(tái)、物流系統(tǒng)如果通過RPC同步調(diào)用任何一個(gè)下游出問題都會(huì)拖累下單主流程而且下游流量波動(dòng)還會(huì)反過來擠壓訂單服務(wù)的資源。消息隊(duì)列的方案是訂單服務(wù)把“訂單創(chuàng)建完成”這個(gè)事件以消息的形式寫入隊(duì)列下單請(qǐng)求到這里就結(jié)束了。積分服務(wù)、短信服務(wù)分別訂閱這個(gè)主題各自來消費(fèi)。訂單服務(wù)不再依賴下游的可用性下游也通過訂閱的方式解耦了與訂單服務(wù)的強(qiáng)綁定。流程訂單服務(wù)作為Producer發(fā)送消息到Topic消息隊(duì)列Broker持久化消息確認(rèn)收到積分服務(wù)、物流服務(wù)作為Consumer訂閱Topic各自消費(fèi)消息更新自己的數(shù)據(jù)5.2 消息隊(duì)列和Async怎么配合消息隊(duì)列兩側(cè)都會(huì)用到Async。Producer側(cè)發(fā)送消息本身是快速操作但網(wǎng)絡(luò)異常重試時(shí)可能耗時(shí)所以發(fā)送邏輯可以用Async異步化避免阻塞業(yè)務(wù)主流程。Consumer側(cè)如果一次拉取到多條消息單條消息處理耗時(shí)較長可以在消費(fèi)者內(nèi)部再用Async把每條消息的業(yè)務(wù)處理丟到線程池并發(fā)執(zhí)行提升消費(fèi)吞吐。要注意的是消費(fèi)端的并發(fā)度控制。如果消費(fèi)者線程池開得太大消息處理太快可能壓垮下游數(shù)據(jù)庫。一般建議消費(fèi)線程池的最大線程數(shù)跟數(shù)據(jù)庫連接池大小掛鉤保證線程數(shù)不超過連接數(shù)的上限。5.3 消息隊(duì)列的可靠性問題消息隊(duì)列把同步調(diào)用變成了異步通知同時(shí)也引出了一個(gè)新的問題怎么保證消息不丟、不重、不亂序。不丟Producer發(fā)送時(shí)開啟確認(rèn)機(jī)制Broker持久化完成后再返回成功Consumer消費(fèi)后處理完業(yè)務(wù)再提交位點(diǎn)。不重消費(fèi)端要做冪等因?yàn)橄㈥?duì)列的語義是“至少一次”重復(fù)消費(fèi)是正?,F(xiàn)象。常見做法是消費(fèi)端先查本地狀態(tài)已經(jīng)處理過的直接返回成功或者用唯一業(yè)務(wù)ID去重。不亂序同一業(yè)務(wù)的消息要保證分區(qū)鍵一致讓它們進(jìn)同一個(gè)分區(qū)消費(fèi)者單線程消費(fèi)這個(gè)分區(qū)。這部分的坑主要集中在冪等上。很多項(xiàng)目剛開始只做了“不丟”沒做“不重”線上跑一段時(shí)間就發(fā)現(xiàn)重復(fù)數(shù)據(jù)。做消息隊(duì)列異步第一件要設(shè)計(jì)好的事就是冪等方案而不是消息發(fā)送本身。6. 三大高階問題失效、線程耗盡、上下文丟失6.1 Async失效的幾種常見場景熟悉了代理原理之后失效問題基本都能自己排查。最常見的失效場景有四種第一種方法通過this調(diào)用。比如一個(gè)Service里面methodA調(diào)用methodBmethodB標(biāo)了Async。因?yàn)閠his指的是原始對(duì)象而不是Spring代理所以Async不生效。解決辦法注入自身代理或者把異步方法拆到另一個(gè)Service里。第二種異步方法不是public。Spring的代理默認(rèn)只能攔截public方法private和protected方法不會(huì)進(jìn)入代理邏輯。第三種異步方法所在Bean沒有被Spring管理。比如自己new出來的對(duì)象Spring根本不知道它的存在。第四種配置類上沒有EnableAsync。這個(gè)看起來低級(jí)但項(xiàng)目里多模塊化之后經(jīng)常出現(xiàn)主啟動(dòng)類掃描不到配置類的情況。6.2 線程池被打滿的排查方法異步任務(wù)量大時(shí)線程池可能被打滿任務(wù)進(jìn)隊(duì)列隊(duì)列也滿了觸發(fā)拒絕策略。CallerRunsPolicy會(huì)把這個(gè)任務(wù)交給調(diào)用方線程執(zhí)行看起來是“降級(jí)”但調(diào)用量巨大時(shí)會(huì)把請(qǐng)求線程拖死。排查時(shí)主要靠日志。所以自定義線程池時(shí)setThreadNamePrefix非常重要executor.setThreadNamePrefix(async-notify-);日志里搜a(bǔ)sync-notify線程能看到線程數(shù)是否接近maximumPoolSize隊(duì)列深度是否持續(xù)增長。如果隊(duì)列長期堆積說明核心線程數(shù)偏低或者任務(wù)量超過預(yù)期要調(diào)整參數(shù)而不是無限加線程。另外一個(gè)容易忽略的點(diǎn)是如果任務(wù)里都有數(shù)據(jù)庫查詢線程池配置不能只看服務(wù)本身的指標(biāo)還要看數(shù)據(jù)庫連接池的可用連接數(shù)。線程數(shù)設(shè)50數(shù)據(jù)庫連接池默認(rèn)只有1050個(gè)線程同時(shí)查庫10個(gè)持有連接剩下40個(gè)在等待這比不異步還要糟糕。線程池參數(shù)必須與會(huì)話外資源聯(lián)動(dòng)評(píng)估。6.3 異步線程里丟失請(qǐng)求上下文Async方法里需要拿到當(dāng)前登錄用戶信息、請(qǐng)求頭、traceId時(shí)經(jīng)常發(fā)現(xiàn)是null。這是因?yàn)檎?qǐng)求線程的數(shù)據(jù)存在ThreadLocal里而異步任務(wù)跑在不同的線程上ThreadLocal不共享。常用解決辦法是裝飾器模式主線程在提交任務(wù)前把關(guān)鍵上下文拷貝一份傳給目標(biāo)線程。Spring提供了TaskDecorator接口可以優(yōu)雅地實(shí)現(xiàn)上下文傳遞Bean(taskExecutor) public Executor taskExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(50); executor.setQueueCapacity(200); executor.setThreadNamePrefix(async-); // 任務(wù)提交時(shí)將主線程的上下文復(fù)制到子線程 executor.setTaskDecorator(runnable - { // 實(shí)際項(xiàng)目中這里會(huì)把請(qǐng)求上下文對(duì)象暫存 MapString, String contextMap copyContextFromCurrentThread(); return () - { try { setContextToCurrentThread(contextMap); runnable.run(); } finally { clearContext(); } }; }); executor.initialize(); return executor; }如果是Spring Cloud鏈路追蹤的場景也可以用類似方式把traceId從主線程傳到異步線程保證全鏈路日志能串起來。具體到邏輯執(zhí)行這段decorator是為了展示結(jié)構(gòu)實(shí)際會(huì)把traceId、用戶信息請(qǐng)求上下文做成一個(gè)線程私有對(duì)象。6.4 異步事務(wù)隔離與資源共享異步任務(wù)共享數(shù)據(jù)庫連接池、Redis連接池時(shí)要考慮資源競爭問題。之前幫別人排查過一個(gè)線上故障異步線程池核心線程從5調(diào)到了20數(shù)據(jù)庫連接池沒動(dòng)結(jié)果每個(gè)異步任務(wù)里都有大約300ms的數(shù)據(jù)庫查詢20個(gè)線程同時(shí)查詢連接池不夠用主業(yè)務(wù)的請(qǐng)求也開始等連接整個(gè)服務(wù)響應(yīng)變慢。這類問題的排查步驟是看監(jiān)控里線程池活躍線程數(shù)看數(shù)據(jù)庫連接池活躍連接數(shù)看兩者是否存在明顯的共同增長趨勢計(jì)算單個(gè)任務(wù)的平均IO時(shí)間反推需要的并發(fā)度不要盲目調(diào)高線程池資源配置是聯(lián)動(dòng)的關(guān)系。7. 常見問題速查與避坑清單下面這個(gè)表是根據(jù)我在項(xiàng)目中遇到過的真實(shí)情況整理的方便直接對(duì)照排查。問題可能原因解決思路Async方法同步執(zhí)行this自調(diào)用、方法非public、Bean未被Spring管理拆Service、改public、確認(rèn)包掃描異步異常無日志輸出方法無返回Future且未配置異常處理器自定義AsyncUncaughtExceptionHandler線程數(shù)暴增使用了默認(rèn)SimpleAsyncTaskExecutor自定義線程池并指定名稱隊(duì)列任務(wù)堆積核心線程數(shù)過少或任務(wù)量突增壓測后調(diào)參結(jié)合隊(duì)列容量一起評(píng)估異步方法內(nèi)用戶信息為空ThreadLocal無法跨線程傳遞使用TaskDecorator拷貝上下文接口偶爾變得很慢異線程池觸發(fā)了拒絕策略CallerRunsPolicy監(jiān)控線程池指標(biāo)動(dòng)態(tài)調(diào)參異步事務(wù)數(shù)據(jù)不一致跨線程事務(wù)隔離導(dǎo)致主流程管事務(wù)異步靠補(bǔ)償WebFlux接口里用了Thread.sleep阻塞了事件循環(huán)線程改為非阻塞延時(shí)或換到boundedElastic補(bǔ)充幾個(gè)容易忽略的實(shí)踐細(xì)節(jié)每個(gè)異步任務(wù)都要有業(yè)務(wù)標(biāo)識(shí)。日志里把業(yè)務(wù)ID、用戶ID、traceId全部打出來排查問題的時(shí)候能直接定位到是哪個(gè)任務(wù)、哪個(gè)線程在跑。線程池參數(shù)要支持動(dòng)態(tài)調(diào)整。生產(chǎn)環(huán)境用配置中心管理核心線程數(shù)、最大線程數(shù)壓測發(fā)現(xiàn)問題后可以在不重啟服務(wù)的情況下修改效果比改代碼快很多。異步任務(wù)要有熔斷或者降級(jí)方案。線程池滿時(shí)的拒絕策略不要只選一種結(jié)合業(yè)務(wù)的容忍度來選??梢詠G棄不重要任務(wù)DiscardPolicy也可以讓調(diào)用方自己跑CallerRunsPolicy但要做到心里有數(shù)知道每種策略的副作用。8. 異步調(diào)用的監(jiān)控指標(biāo)與可觀測性設(shè)計(jì)用了異步之后問題排查難度確實(shí)會(huì)上升。同步模式下一個(gè)請(qǐng)求從開始到結(jié)束是一條清晰的調(diào)用鏈異步線程切來切去傳統(tǒng)日志就斷了。所以異步用得越多可觀測性越要跟上。至少要監(jiān)控四個(gè)指標(biāo)線程池活躍線程數(shù)隊(duì)列積壓數(shù)量任務(wù)執(zhí)行耗時(shí)P99分位被拒絕的任務(wù)數(shù)量活躍線程數(shù)能看出線程池是否持續(xù)處于高水位隊(duì)列積壓數(shù)量能提前預(yù)警任務(wù)堆積執(zhí)行耗時(shí)能看出單個(gè)任務(wù)的健康狀況被拒絕的任務(wù)數(shù)量直接反映系統(tǒng)是否已經(jīng)超出容量。日志配合MDC來做traceId傳接我在上一部分提過用TaskDecorator傳上下文就是為了讓異步線程的日志也帶上同一個(gè)traceId。每個(gè)異步任務(wù)開始和結(jié)束時(shí)各打一條日志記錄線程名、任務(wù)名、業(yè)務(wù)ID、耗時(shí)自己畫一條時(shí)間軸基本能還原出任務(wù)執(zhí)行的完整路徑。監(jiān)控指標(biāo)都接好之后判斷線程池參數(shù)是否合理的依據(jù)就變得具體了。線程池穩(wěn)定在核心線程數(shù)附近、隊(duì)列偶爾積壓但能在幾秒內(nèi)排空這是比較健康的狀態(tài)。如果線程數(shù)長期貼近最大線程數(shù)、隊(duì)列持續(xù)有積壓說明系統(tǒng)已經(jīng)滿負(fù)荷了加線程不如削任務(wù)。9. 異步改造的實(shí)際落地順序不管項(xiàng)目里選擇哪種異步方案都不建議一次性大規(guī)模改造。我見過的所有改造失敗案例幾乎都是因?yàn)椤鞍旬惒疆?dāng)成了萬能的性能開關(guān)”一口氣把所有服務(wù)都標(biāo)成Async結(jié)果線上問題此起彼伏又不知道從哪里排起。比較穩(wěn)的推進(jìn)方式是分四步走。第一步盤點(diǎn)場景。把項(xiàng)目里所有耗時(shí)超過1秒的操作都列出來標(biāo)注它們是否依賴主流程的結(jié)果。比如發(fā)送短信、生成日志、統(tǒng)計(jì)數(shù)據(jù)這些明顯是分支任務(wù)適合異步化。第二步先做Async打底。給這些分支任務(wù)加上線程池和異步注解同時(shí)把異常處理器、日志、監(jiān)控配套做好。這一步投入小見效快也是積累異步經(jīng)驗(yàn)最快的方式。第三步局部引入WebFlux。當(dāng)某個(gè)入口的并發(fā)瓶頸特別明顯比如聚合接口、網(wǎng)關(guān)入口而這個(gè)服務(wù)的業(yè)務(wù)鏈路又相對(duì)清晰這部分可以嘗試換成響應(yīng)式編程。不要一開始就把所有Service都改成Mono和Flux鏈路過深會(huì)讓改造成本成倍增長。第四步涉及跨系統(tǒng)的異步再上消息隊(duì)列。消息隊(duì)列引入的是整個(gè)中間件的運(yùn)維成本如果沒有明確的削峰、解耦需求就不要為了用而用。10. 一點(diǎn)個(gè)人經(jīng)驗(yàn)收尾做異步調(diào)用這些年最大的體會(huì)是異步方案從來不是技術(shù)問題而是取舍問題。它把當(dāng)前線程的“等待時(shí)間”轉(zhuǎn)移給了別的線程換來的是接口響應(yīng)速度的提升和系統(tǒng)吞吐量的改善代價(jià)是代碼復(fù)雜性、排查難度的上升以及分布式場景下一致性問題的新增。實(shí)際動(dòng)手時(shí)我的習(xí)慣是先畫一張簡單的調(diào)用鏈路圖標(biāo)出每個(gè)環(huán)節(jié)的耗時(shí)、線程、依賴再考慮在這個(gè)鏈路的哪個(gè)環(huán)節(jié)插入異步。不看鏈路就動(dòng)手加注解往往是在給系統(tǒng)埋雷。如果你剛上手SpringBoot異步調(diào)用不用急著把三套方案都吃透先在自己項(xiàng)目里找一個(gè)實(shí)實(shí)在在的痛點(diǎn)比如每次下發(fā)通知都阻塞請(qǐng)求、導(dǎo)出數(shù)據(jù)超時(shí)、日志寫入拖慢業(yè)務(wù)用Async配合線程池改造一遍把代理失效、上下文傳遞、異常監(jiān)控這幾個(gè)點(diǎn)親手踩一遍比看再多文檔都有用。工具選型也一樣沒有絕對(duì)最好的方案。進(jìn)程內(nèi)的異步優(yōu)先Async高并發(fā)聚合優(yōu)先WebFlux跨系統(tǒng)解耦優(yōu)先消息隊(duì)列。每個(gè)方案的代價(jià)不一樣選適合自己項(xiàng)目階段的已經(jīng)足夠。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久国产一区二| 强奸乱伦αv片| 伦理弟一页| 96久久精品一二三区色欲| 欧美亚洲丝袜人妻制服中文99| 欧洲天天在线| 五月天激情四射| 手机久操欧美综合色码| 亚洲一二三四区| 后入式免费视频| 老鸭窝黄色视频网站| 人妻精品一区二区| 久久成人东京热人妻| 中文字日本乱码| 亚洲精品视频在线| 大香樵伊人网| 日韩啊V| 日日AV加勒比| 操操操操操操| 麻豆 亚洲 97| 热久日综合| 久久精品亚洲东京热色播| 日本3级一区二区免费| 熟女精品va中文字幕| 日韩免费av片高清无码| 91视频精品| 人妻少妇精品久久久久久久| 老熟女网站| 91性片| 国产精品视频自拍在线| 九九亚洲| 一牛影视久久久一区二区三区| 欧美亚洲第一页| 日韩视频精品在线观看| 久久久精| 色五月激情AV在线| 丰满少妇精品一区二区| 精产品久久| 一区二区三区一亚洲中文字幕、综合区灬 | 亚洲乱码尤物193YW| 天天插夜夜爽| 人伦四五区| 天天久久久久久| 91丝袜| www久久精品| 大逼色网站| 99人妻| 丁香六月激情| 色婷婷激情| 怡红院怡春院| 一本色道熟妇| 日韩无码黄色片| 91狠狠综合久久久| 99re69综合| 亚欧操逼片在线观看 | 亚洲色综网| 三四中文字幕| 久久社区一区二区三区| 97久久精品亚洲| av线电影| 玖玖大干人妻| 精品国产72| 伊人97色天使| 久久久久久AⅤ无码免费肉站| 日本 情色 1区| 成人 日韩欧美一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 久操热线| 成人小说视频在线精品欧美| 国产精品夜夜夜| 丰满翘臀美女影院视频| 熟妇激情| 人妻插插人妻人| 国产强奸超碰AV| 亚州一区二区| 亚洲91射| 东北操逼| 久久久久ab| 五月婷婷激情| 免費黃色視頻觀看一| av网站免费看| 超碰97人妻自拍| 久久宗合亚洲| 91成人社区| 91 手机在线播放 绯色| 免费在线观看国内色片网站网址| 懂色中文一区二区三区| 天天综合网在线91| 亚洲全色网| 久草线上视频免费看| 1024亚洲中文字幕久在线看片你懂的| 国产视频不卡在线观看| 色翁荡息又大又硬又粗又爽| 久久精品黄色| 欧美日本不卡在线| 后入式五六区| 亚洲清纯唯美| 乱子伦一区二区三区国产精品| 秋霞怕怕片| 粉嫩久久久久| 亚洲色91| 超碰碰97资源站| 久久久久幕乱码| 人妻丝袜肏逼| 97色涩| 欧美在线亚洲| 国产精品美女久久久久久网站| 丰满人妻-区二区三区免费| 日韩欧美一级特黄大片| 国产最火爆久久国产网站网站| 99999亚洲| 欧美色蜜桃97| 亚洲天堂精品日韩电影| 国产在线播放成人免费| 五月天精品| 黄色av网站在线播放| 久9久9久9久9久9久9| 人人色人人操在线| 日本高清一区二区在线| 日本道久久综合色色| 九月激情婷婷| 精品偷拍13p欧美dodk视频| 国产在线视视频有精品| 亚洲少妇激情视频| 1956日韩精品| 精品一区二区成人| av大香蕉| 成人情色一区二区| 97中文天堂| 久久黄色网址| 免费网色网站| 日韩av情韩国爱禁区av一区二区| 久久久九精品| 亚洲黄色| 97无码视频在线播放| 成年无码动漫av片无尽在线 | 岛国1区2区3区在线观看| 超碰97护士| 久久大黄片| 夜夜草我| 欧美人妻久久精品二区三区 | 神马久久中文字幕| 鸥美极品| 亚洲天天更新| 亚洲欧美国产中文视频| 久久欲| 一牛影视成人片免费| 午夜爽爽爽在线观看永久入口姬片| 青青伊人这里只有精品| 最新日韩黄片| 日韩乱码Av| 欧美色997| 久久日本熟妇熟色高清| 97精品人妻一二三四| 99999亚洲另类| 神马麻豆福利院| 又大又大又大又粗爽高潮观看| 亚洲加勒比久久日本道| 黄色激情电影在线观看| 亚洲男人天堂2019| 久久綜合很很很| 91日日夜夜| 97亚洲中文| 精品国产三级av韩国在线| 亚洲字幕一区二区| 五月天婷婷影院| 东京热一区二区三区四区五区六区| 成人天天看站长推荐| 色网1| 人人操人人操人妻人| 天美传媒精品一区二区| 天天做日日爱夜夜爽| 成人贴图日韩欧美| 91狠狠狠| 国产操逼视频在线观看| 亚洲丝袜二区| 嗯嗯啊啊的视频| 日韩有码中文字幕女同性恋| 无码高清国产AV| 水野优香在线观看| 97精品久久久久中文字幕| 超碰99在线| 高清无码一区二区三区| 日韩精品99999| 天综合网欧美| 热无码中文亚洲H一道本一区二区| 91欧美巨乳| 97天天综合| 无码国产精品午夜不卡(| 国产亚洲国产超碰| 黑人精品欧美一区二区蜜桃| 天天澡天天爽日日AV| 精品免费囯产一区二区三区| 亚洲无码国产精品久久| 成人 日韩欧美一区| 歐美性天天| 精品欧美乱码久| 久久精品中文字幕观看| 99亚洲人人| 爱爱动态60秒| 色色99| 在线小视频| 亚洲欧洲成人在线电影| 久久精品国产精品亚洲艾通辽熟妇 | 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 日本操逼aaaaa| 亚洲高清在线| 91精品在线播放| 激情抓乳插进去啪啪啪日韩 | 国产精品com| 熟女精品一区二区三区| 超碰久草| 韩国黄色片精品久久久| 人妻无码一区二区三区久久99| 亚洲成人激情小说视频| 大香蕉手机在线视频| 亚洲国产日韩精品久久久| 欧美日韩 强奸乱伦| 欧美熟妇乱码在线一区| 国产精品盗摄 偷窥盗摄| 超碰人人乐97| 久久国产成人精品国产成人亚洲| 大稥蕉免费视频这里只有精品| 91精品婷婷国产综合久久| 色网在线视频观看免费| 人妻黑丝袜电影| 国产操伦| 亚州高清色综合| 国产最新小视频在线播放下载 | 国产精品久久久久久久无码AV| 黄污污污污| 国产一区二区在线看| 免费一级毛片在线视频观看| 欧美人妻另类在线| 综合色啪| 亚洲网站一区二区在线| 九九热五区| a男人的天堂久久一级A毛片| 精产国品一区二三产品| 在线国产福利网址导航| 啊啊啊啊啊好舒服视频| 91精品大奶人妻| 亚洲国产97在线精品一区| 欧美日韩性爱视屏免费看了| 亚洲女优有码无码高清| 中文字幕精品人妻丝袜| 在线有码中文字幕| 性爱AV天堂| 韩国午夜理伦三级好看| 视频在线97| 99精品热| 日韩欧美亚洲自拍偷拍| 神马久久69| 国产强奸超碰AV| 夫妻AV网站| 五月天激情网图片| 国产午夜精品在线观看| 亚洲综合夜色| 五月婷婷性爱| 欧美组图日韩亚洲中文字幕| 高跟伊人julia ann| 一二三四视频中文字幕在线看| 久偷拍欧美日韩三区| 日韩中文字幕二区| 日韩操逼性鲍| www.acm成人黄色毛片| 99色热| J?P?NESEHD熟女熟妇伦| 男人天堂 天天射| www久| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 99热91| 亲子敌伦对白在线播放| 男人的天堂日本东京热| 亚洲AV成人在线| 国产h小视频在线观看免费| 97中文字幕色| 久久99网站| 在线a亚洲视频播放在线| 91欧美另类| 99热色精品| 久久天天艹| 午夜亚洲| 啊啊啊啊二区好大| 人人喜人人妻| 人人看人人摸人人色| 精品91日日夜夜超清资源| 九九自拍伦理| 欧美日韩超碰在线| 国产1769在线| 翔田千里无码一区| 天天舔日美女视频| 蜜臀99999| 丁香婷婷啪啪| 日韩一性一交一A片俄罗斯| 国产精品乱码久久| 搡老女人老91妇女熟女| 91偷拍欧美亚洲| 99久久综合| 日韩国产欧美伦理在线| 秋霞 色色| 后入精品| 国产和美国毛片| 97 超碰 人人做 人人爱| 天天做天天爱| WWW黄片COM| 黑人白女精品一区| 男女无套 免费网站| 青青草综合在线| 天美传媒Av在线| 久久久9视频| 狠狠综合网| 93人人操人人| 免费久久一级毛片大黄| 超碰在线人人射| 久啪视频| 天海翼久久| 图色综合网| 日韩AV电影网站| 国产亚洲国产超碰| 手机看av网站在线看| 高潮毛片无遮挡高清免费| 欧美亚洲综合高清在线| 外国免费性情大片| 91色射| 久久熟女久| 青青草原综合久久大伊人精品| 九九热在线视频| 日韩成人性爱电影在线播放| 可能人人看人人摸| 日va操| 操逼www.| 中文字幕交换人妻| 在线综合色| 少妇xx精品| 欧美日韩另类在线播放| 国产女s强制榨精视频| 大学生美女口爆| 性综合网| 操国产逼| 一本色道综合久久欧美| 国产精品久久久久久高清无码免费看 | 91搡老女人老妇女老熟女歌词翻译| 欧洲精品二区| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 欧美亚洲清纯| 色约约一区=区三区| 精品人妻久久久| 91亚洲图片| 极品色综合| 国色综合天| 久久精品黄色| 狠狠操官网| 在线岛| 伊人午夜福利视频| 成人久久久| 亚洲情色图片区| 免费网站观看www在线观| 日比av无码| 乱人乱色一区二区三区免费| 高清无码人妻久久久一区二区三区aⅴ| 青青操日韩| 操一对老熟妇爽上天视频| 九九九久久久W精品| 亚洲欧洲日韩中文字幕一区| 激情欧美97| 26uuu久久| 尤物网址| 国模吧 一区二区三区| 色色色热| 十八禁黄色成人网站观看| 国产 大胆 对白| 性欧美第一页| 亚洲天堂男人| 日韩精品人妻一| 精品超碰国产| 久久这里精品国产99丫e6| 美女91在线观看| 亚洲97网站| 超碰免费人妻在线| 婷婷丁香九月| 久久婷婷五月天| 不卡人妻少妇精品毛片一区23区视频 | 日日日大屁股骚女人精品| 天天综合站| 偷拍综合网| 亚洲性爱免费电影| A久久| 久久精品一区| 精品久久久一本一道| 日韩啪啪视频| 国产精品探花在线| 97亚洲综合电影| 日韩精品电影| 国产精品自拍视频| 久久亚洲AV无码专区国产精品| 红杏大香蕉| 丝袜美腿校园春色| 97免费在线观看| 亚洲国产奇米影视久久| 草草影院在线视频| 色综合 加勒比| 欧美福利视频啊啊啊啊| 亚洲午夜AV| 色爱欲亚洲| 欧美综合色| 乱伦a片视频| 91精品黄在线观看| 91欧美性| 日韩人妻一区二区| 亚洲综合激情五月久久| 长久操视频| 思思久热在线精品66| 色青青久久影视| 国产美女精品| 免费看黄片现成| 五月婷婷五月天| 天天射夜夜| 成人五月天丁香激情综合| 偷窥自拍亚洲天堂网爆| 丝袜色综合| 日韩极品无码B| 91欧美高清| 黑人性暴力毛片| 伦伦成年午夜免费视频| 1区2区3区中文字幕日韩| 亚洲情欲| 麻豆国产尤物AV| 欧美性第1页| 国产黄片精品在线| 噜噜噜久久亚洲精品色情| 女生91网站| 女人高潮大叫一级毛片| 后入福利| 国产精品探花在线| 美熟女逼导航AV操逼| 欧 美 自 拍 偷 拍| 欧美少妇一区二区三区| 国产老女人久久毛| 日本一区三级韩国| 精品人妻av区天天看片| 六六久久日韩不卡| 天天干人人乐| 激情婷婷五月天| 青青草色AV| 婷婷丁香五月激情啪啪| 99热线麻豆 | 男人天堂2019亚洲| 九九操久久国产免费视频| 无码抄逼网| 99re热| 国产一区二区三区导航| 性感美女啊啊啊在线| 国产乱码精品一区二区三区四川| 欧洲亚洲天堂精品| 黄色区免费观看中文字幕| 蜜桃久久精品一区二区三区| 国产AV色黄看到爽| 美女黑人91神马| 91精品女厕偷拍视频| 先锋音影AV| 欧美性生活免费网| 91男女| 久久婷婷影院| 91亚洲综合| 嗯阿好爽好紧| 强奸乱伦亚洲第一页| 男人的天堂久久狠| 亚洲中文一区二区三区视频| 欧美性色欧美| 熟妇熟女亚洲天堂网| 97香蕉网| 人妻免费观看| 久久久久9999| 蜜臀无码视频在线观看| 超碰1997| 四色永久成人网站| 亚洲欧洲成人在线电影| 精品成人女人久久| 欧美精品日韩一区二区| 欧美亚洲综合高清在线| 亚洲综合图色在线| 中文字幕 国产 精品| 亚州男人天堂| 欧美激情色婷婷花野真衣一区二区| 欧美日韩操操操| 97欧美资源| 一牛影视久久久一区二区三区| 日韩免费看在线黄色片| 日韩天天综合| 亚洲第一页欧美| 人人摸人人叼| 乱抡国产91| 色天使AV天堂| 亚洲中文人妻色| japan日本高清乱xxxx| 91色欧美| 久久这里| 日韩成人色图| 爱媛媛久久国产福利| 欧美天天| 人人操人人操草草| 日本一道在线播放高清| 欧美激情黑人| 成人日韩中文字幕| 色狠狠色| av天堂精品久久| 久久东京国产精品视频| 国产白嫩精品久久| 久久久久国产精品片区无码直播| 国产乱子伦久久精品综合一区二区三| 九九国产热| 女人爽到高潮久久久| 97人人操人人摸| 性猛交| 加勒比性爱成人在线| 国产久久视频| 人妻嗯啊啊在线播放| 日韩性爱毛片操骚逼| 91天堂网| 四虎免费在线播放| 久干网| caopeng97| 深田咏美亚洲精品福利社| 黄色片A级一区二区三区| 一本大道久| 夜夜久久| 日韩熟女精品无码专区一区二区| av资源在线播放天堂| 在线岛| 青草综合| 日本不卡在线二区三区| 好爽要喷了| 60秒免费小视频| WWW4虎| 无码又爽又硬又激情免费视频| 乱伦图av| 免费啪啪av| 日韩三级伊人| 欧美性性性| 99精品无码| 久久精品电影| 极品久久久久久久久久久久久久| 亚洲国产一区二区三区在线| 一区二区偷拍拍视频| 日本三级R| 精品偷拍13p欧美dodk视频| 爱射综合| 黄页av| 91国产丝袜美女| 国产熟女二区| 国产乱码久久久| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 欧美少妇色综合| 玖玖爱综合| 久久一区无码| 久久一区无码| 欧美日韩免费专区在线| 人人妻人人操人人乐| 久久久久久久人妻| 婷婷五月色| 五月天精品| 六六久久日韩不卡| 久久熟女人| 偷拍欧美激情| 成人熟女视频一区二区三区| 任我爽视频在线观看| 高潮内射在线| 久久內射| 欧美天天综合站| 久久久九九| 欧美日韩系列| 欧美偷拍| 尤物视频视频官网| 強姦亂倫a| 午夜操逼不卡| 秋霞免费AV| 中文字幕一区二区三区视频播放| 五月婷婷啪啪| 男人天堂.AB| 黑人中出21连凳花野真衣| 丝袜综合色图| 一区二区亚州激情久婷婷欧美| 欧美高清在线| 亚洲天天更新| 国产丝袜欧美在线视频| 亚洲精品无码成人久久久99| 操我啊啊啊啊啊| 国产玖玖| 色女综合| 天天操天天看| 欧美色网络| 99久久亚洲精品无码毛片潘甜甜 | 九九亚洲视频| 成 人 影视 一区 二区 三区 四区| 日本丝袜美腿人妻九九| 蜜臀一二三| 1024精品在线| 摸奶性爱视频网站在线免费播放| 深夜国产一区二区三区在线看| 伊人色综合网电影| 亚洲中文字幕妇伦久久| 素颜老阿姨乱情色| 91欧美www| 天天上日日上日韩精品| 97人人操人人摸人人爱| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 99re69| 啊啊啊轻点在线观看| 91精品国产91久久青草| 久久人人舔人人爽舔人人av片| 色九区| 干b在线性社区| 亚洲欧美激情小说| 不卡中文字幕aⅴ在线| 亚洲Av无码成人精品国产| 操狠狠| 激情四射熟女丝袜| 天天操夜夜操| 久久久精品成人国产| 丝袜狠狠草尤物人妻av91| 99re6在线视频精品免费完整版安卓版| 欧美色日| 欧美色97| 在线岛| 国产九月婷婷| 啊啊啊啊啊舒服| 人人爱人人乐人人操| 青娱乐日韩无码| 国产熟女| 日本一级特级毛片视频| 亚洲aV无码成人在线观看| 操操操操操操| 亚洲91色| 99天堂网| 国模91| av在线播放国产一区| 久久久久久国产精品| 中国的操老妇女| 综合激情二| 97九色人妻| 欧美日韩制服| 人人干人人操人人..com| 久久中出在线| 精品人妻一二三| 久久思思热| 亚洲情色无码一区二区三区| 精品无码不卡视频| 日本加靬比网站发布页| 人妻少妇一区二区| 在线观看视频91| 男女性无套 免费九一| 99精品在线播放| 941超碰| 国产欧美成人第一页在线观看| 久九干| 啊啊啊啊好爽好舒服一区二区易域| 8050午夜少妇无码| 午夜AV污污污| 黄骗免费| 中文字幕伊人| 亚洲国产成人精品无码专区| 欧美91精彩| 成人免费看吃奶视频网站| av在线人气| 免费观看成人www精品视频| 青青国产精品在线| 国产精品日日摸夜夜添骚逼| av大香蕉| 九九草| 精品一区二区啪啪啪| 日韩99999| 五月综合色| 亚洲欧美清纯| 97午夜剧场日韩| 婷婷激情一区二区三区俺也去| 亚洲天天操| 嗯啊免费视频| 日韩一级欧美一级国产一级台湾| 久久久影院| 福利视频合集| 九九成人精品| 久久精品国产99精品亚洲蜜...| 亚洲蜜臀懂色| 新久久AV| 久久后入制服| 色色五月天婷婷| 欧美少妇人妻| 97干色天堂| 久久久久久久伊人精品| 久久久久9| 爱av免费| 中文 人妻 制服| 天天综合精品| 成人免费看吃奶视频网站| 亚洲色情在线影视| 最新国产亚洲精品精品国产亚洲综合| 91精品国| 久热69九色熟妇97| 国产精品女生av| 狠狠干妹子| 五月天综合| 91在线精品一区二区三区| 中 文字幕一区二区三四 五 区日 日 骚| 为用户提供免费看黄网址在线观看| 一区二区国产视频在线观看| 国产精品亚洲一区二区三区四区| 97超碰超| 日本精品免费一区二区三区四区| 久操网线| 熟妇色99| 97公开久久| 久草视频分类在线| 国产精品午夜AV完会免费| 91网站视频在线观看| 国语对白在线播放视频| 干超碰碰熟女| 国产妇女精品视频青青草| 精品国产肉丝袜在线拍国语| 亚洲综合欧美| 青青草日韩免费观看高清在线| 涩五月婷婷| 国产美女自拍AV| 亚洲天天做日日做天天谢日日| 夜夜嗨AV蜜臀av| 国产高清精品一区二区三区毛片 | 欧美一区91大爱| 无码人妻精品一区二区中文| 日韩天天综合| 又黄又粗又硬又长又大| 精品国产久热在线观看| 一区二区乱码福利| 97视频在线观看网站| 日韩成人色图| 人人妻人人狠人人| PMv在线观看| 999热日韩精品| 男人久久精品| 91色艳| 欧亚性爱啪啪| 天堂v无码免费视频| 国产精品一级二级在线| 欧洲免费一区二| 九九色图| 精品人妻av在线播放| 91天美| 春色综合免费| 天天天天天天天天综合| 91 手机在线播放 绯色| 丝袜美腿制服人妻二区中文字幕 | 成人麻豆av电影网站| 日韩一级二级三级在线不卡观看完整| 操91| 日韩少妇丰满亚洲| 欧美后进式| 高清在线偷拍自拍视频| 亚洲国产ⅴ高清在线观看| 大香蕉78| 花花AV导航| 高清不卡 中文 人妻| 亚洲淫乱骚妇AV| 啊啊啊啊嗯嗯嗯用力好爽| 26uuu国产免费观看| 收看日本人日bb| 亚洲av青草久久一区二区| 高颜值美女口爆高潮浪叫| av 模特一区了| 96免费视频在线| 91精品成人www| 色播丁香| 国产高潮AA片免费看| 丝袜剧情| 在线一道啪| 99久久久无码精品国产人| TS人妖另类精品视频系列| 欧美精品一二三| 天堂网亚洲区手机版| 大干人妻| 在线电影亚洲色图| 蜜桃精品一区二区三区久在线| 爱啪精品一区| 日本啊啊啊啊啊视频| 亚洲伊人久久精品狠狠在线| 蜜臀久久99精品久久久久久久久| www色色色com| 九九久久99| 久热无码| 久久婷婷五月天| 激情五月天色色| 日本99视频| 五月丁香网站| 欧美夜夜狠| 殴美,日韩国产伦精品| 视频二区美腿丝袜制服人妻欧美| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 91欧美长吊| 91成人国产综合久久精品蜜月| 91日日| 久久国99999| 亚洲天天影视色综合| 欧美人妻另类在线| 日本二区不卡| 九九久久久| 家庭乱伦麻豆| 乱伦a片视频| 亚洲AV无码黄色强奸| 国产呦精品一区二区三区下载| 极品白嫩美女白浆成人福利在线看| 日本肉体xxxx裸交| 久久一二三四五六七八九区区区 | 一区二区三区四区免费视频| 国产成人无码高清| 九九激情网| 欧美不卡在线美女| 青青操在线亚洲视频观看欧美在线| 欧美亚洲美少妇一区二区| 大香蕉92| 欧美+日产+中文| 国产在线能看的你懂的| 草草影院日本第一页| 操逼逼无码| 无码99| 亚洲精品一卡二卡三卡福利视频网站| 肉丝中文无码高清| 91美女小视频| 黄色片一区二区三区四区五区| 草莓精品视频| 国产人妻精品久久久一区二区三区 | 天天躁日日躁AAAXX| 五月大香蕉| 欧美综合97www| 日韩精品在线放| 26uuu性物| 伊人久久婷婷| 97香蕉人人乳| 97在线播放 | 久久久九97| 97色欧州| 91亚洲黄色网| 亚洲啪啪视频免费| 国产视频一区二区免费| 九色 人妻 大香蕉| 男人的天堂久久狠| 91肉丝| 欧美性巨大╳╳╳╳╳高跟鞋| 婷婷色综合| 老熟妇综合| 中国熟妇| 亚洲精品一二区| 92福利社视频| 91无码人妻| 国产色产精品在线观看| 播播亚洲小说亚洲| 天堂日本亚洲欧美| 国产丁香精品露脸视频 | 又黄又爽在线观看视频| 久久夜夜夜| 91熟女视频| 久久免费精品视频免一| 男人的天堂在线2| 四虎影视国产精品| 高清无码在线播放网站| 920日本午夜免费| 久久视频,这里只有精品| 亚洲av噜噜噜噜噜噜| 91超碰人人操| 男人的天堂2000| 日韩免费a级毛片无码a∨| 人人透人人操| 小骚逼被操的爽不爽| 91 欧美| 婷婷久久大香蕉| 9久精品视频在线观看| 日韩福利电影网| 丁香六月婷婷| 91网站在线播放| 免费少妇一区二区| 超碰日本97美女人妻人人玩人人爱| 蜜桃臀一区二区三区久久| 欧美一级美片在线观看免费| 青青草视频久久| 亚洲色图8| 人人摸人人摸人人干| 懂色AV中文| 丰满人妻一区二区三区色-百度| 午夜免费福利视频一区| 97视频在线视频| 日韩免费三级黄片电影| 91亚·色| 91丝袜在线播放| 丁香五月天激情| 日本熟妇自慰性高潮一区二区三区| 北约熟女超碰| 另类av天堂| 国产亚洲精品一区二区三区| 精品久久久无码| 日韩欧美女求操每天更新| 最新国产亚洲精品精品国产亚洲综合| 99久热精品99re6热| 国产丝袜美女在线一区| 国产精品肉丝自拍| 呦呦一区| 人妻天天爽夜夜爽爽| 熟女人妻一区二区三区免费看| 激情综合久久| 国内毛片四区| 日本色色色| 男同专区一区二区三区在线| 日韩啪啪视频| 99少妇| 五月婷婷六月天| 久久久久久久| 精品一区二区三区蜜桃臀赵总 | 欧中美三级一区二区三区| 日本福利二区视频| 色婷婷日韩精品一区二区三区| 自拍大香蕉乱插| 91亚洲狠狠色| 99热99色| 久久人妻熟女一区二区| 国产 日韩 欧美 人妻 熟女 中文| 欧美日韩一二三| 无码99| 少妇久久久久久久| 青青草在线视频人人想人人上| 草草电影院| 91美乳| 女人被男人桶爽视频网站| 日韩无码久久熟女一级片| japan日本高清乱xxxx| 熟女91网| 99热色精品| 亚洲国产精品无码AV久久| 国产一级久久久| 999亚洲国产视频| 99日视频在线免费| 激情开心五月天| 色99999| 青青草啪啪网| 福利伊人玖玖国产| 97伊人超碰| 亚洲情色第一页| 亚洲欧洲日本精品中文a∨| 中文字幕综合人妻| 日本网色| 男人的天堂 在线一区| 久久精品老司| 自拍大香蕉乱插| 天天干嫩逼网| 91成人国产综合久久精品蜜月| 亚欧无码在线| 综合色欧美| 60秒试看最爽10分钟网站| 99久久久er直播网址| 九九热国产| 黄色高清久久无码依人| 天天干夜夜一操| 丰满少妇一区二区三区免费看| 97色爱| 日韩乱伦视频| 超碰成人人人爽人人爽| 久久久男人的天堂| 五月激情影院| 五十路六十路七十路熟婆| 男人的天堂日韩| 白嫩嫩一区| 久久国产热视频97电影| 超碰97综合在线| 久久久久久91香蕉国产| 国产精品熟女乱伦| 中文字幕人妻资源在线| 91美女视频电影| 国产精品九9| 在线v中文字幕一区二区三区 | 成人性爱AV在线免费观看| 伊人久大| 天天综合网91入口| 亚欧性爱在线无码| 欧美十八禁视频| 天天天干977| 日本久久综合| 日本人体九九九九九九| 国产精品69人妻无码久久久| 性91| 97超级色碰碰| 成人网欧美风情| 九九亚洲视频| 性影在线视频| 日本影视久久免费| 天天性射网| 嗯嗯,好大,好爽,好骚| 99热色精品| 日韩精品中文字幕一| 99精品国产户外露出| 91美女视频。| 国产精品久久久久久久免牛肉蒲团 | 午夜精品久久久久久久男人的天堂| 在线观看成人性爱免费小视频| 日躁天天爽爽| 九九久久国产精品怡红院| 久久精9| 四虎AV无码| 五月天激情小说网| 天天草天天干天天日| 午夜无遮挡男女啪啪视频| 日韩97在线| 白嫩妹子国产骚| 日影院久久婷婷夜夜网| 亚洲男人的天堂一区二区| 婷婷亚洲天堂| 强奸乱伦动态污图免费| 一本久道在线综合视频| A级在线视频| 欧美AB在线| 欧美97网| 天堂av最新电影网| 欧洲精品欧洲精品| 日本最新免费韩国1区2区视频播放| 亚洲欧洲小说图片视频| 操91| 色丁香五月婷婷| 黄色av片三级三级三级免费看| 国产精品一区av在线| 亚洲欧美色图小说| 91欧洲国产成人久久精品网站| 亚洲熟妇A V黑人| 欧美色图另类图片| 久久禁| 亚洲91射| 国产av色网| 蜜桃精品视频一区二区三区| 麻豆精品三区视频| 91老熟女老女人国产老太| 四虎视频在线观看| 干b在线性社区| 妇女视频网站| 91丝袜激情在线| 国产AV人人 夜夜人人澡| 97在线欧洲| 国产乱弄免费在线视频。 | 人人妻人人玩人人澡人人爽| 91熟女丨老女人| 78超碰| 又大又大又大又粗爽高潮观看| 中文字幕一二三| 亚洲国产综合视频| 91啦人妻| 天天插夜夜操| 啪啪免费| 一级啊性爱在线视频| 偷窥自拍A片| 97人妻碰碰中文无码久热丝袜| 婷婷激情五月| 久久秀这里有精品| 蜜桃精品一区二区三区ww| 女一区二区| 超碰在线97国产| 人人妻天天做天天爽| 一本大道青青| 啊啊啊啊啊好多水| 亚洲 欧美 日韩 国产一区二区 | 91精品人妻| 3PAV乱伦视频| 日韩无码三级影院| www黄片免费看com| 1024日韩| 精品人妻二区三区| 操b网站亚洲无码| 久久精品视| 久久亚洲一区女同性恋中文字幕| 欧美国产婷婷久久| 午夜啪| 丰满人妻无码一区二区三区| 睡产熟女乱伦| 天美AV片| 久久久久久久久久黄色网| 久湿久久 | 91老熟女91老女人| 偷拍新久久| 亚洲se91| 无码免费在线观看黄色片| 日韩不卡在线一区二区| 国产成人网站在线观看| 丰满人妻一区二区三区免费,| 欧美亚洲国产自久久| 丝袜美女诱惑 91 视频| 色狠狠一区二区三区香蕉| 91啪啪| 丰满岳乱妇一区二区三区| 欧美黄色大香蕉一区二区| 99少妇精品视频| 亚洲色资源| 欧美精品23| 天天天乱色综合全| 欧美在线视频观看一二三四区高清| 麻豆色约约| 第一高清av中文字幕| av九九| 亚洲永久永久永久永久一级一级一级精品 | 久久免费精彩视频| 人人澡综合涩| 中韩中文字幕在线观看| 日韩熟女无码| 无码抄逼网| 色鬼在线综合| 东京热,男人的天堂| 国内精品a| 色婷五月天| 亚洲色图综合网| 久久天堂| 亚洲一区二区三区欧美日韩| 亚洲。日韩。欧美| 男人天堂最新手机版在线青青草| 牛牛AV人人夜夜澡人人爽| 综合欧美日本三级| 久久超碰免费的| 蜜臀久久99精品久久久久久酒店 | 内射卯月麻衣| 亚洲啪啪综合?v一区综合精品区| 性爱精品一区| 丝袜视频一区二区在线播放国产中文| 青青青青青手机视频| 黄片免费久久久久久久| 亚洲熟妇乱女区二区三区| 91痴汉| 欧美一区二区三区另类精品| 中文字幕一区 二区三四五 区日 日骚| 欧洲亚洲人人爽爽视频| 被窝影院午夜看片无码| 中文字幕精品一区二区精品| 智利AV在线网| 欧美五十路熟| 啊啊啊啊啊啊在线看| 9精品久久久久| 亚洲最新a在线观看| 亚洲三级网址久久最新| 欧美色图91| 国产一区二区视频在线播放| 一牛一区二区三区久久| 秋霞怕怕片| 看日韩美女二区三区免费操逼视频| 亚洲男人天堂视频| 免费超碰97在线观看| 精品久久久久黄少妇| 淫荡网址| 婷婷五月成人| 97操97干| 牛牛aV| 嗯嗯啊啊日韩精品| 国产精品人妻熟女aⅴ| 成人老鸭窝人人在线视频| 三久久久四久久久久| 91chinese在线| 抽插一区二区视频| 伊人久操| 欧美中字不卡| 中文字幕亚洲热播人妻| 久久久久密臀一区二区| 亚洲春色欧美激情自拍| 夜夜爽妓女|