簡體   English   中英

具有異步支持的基於連接池的Web服務器與基於事件循環的Web服務器

[英]Connection pool based web server with async support vs Event Loop based web server

我正在學習Vertx及其生態系統,首先我學習了事件循環,這個概念對我來說真的很不錯。

但是從Servlet 3.1開始,我們可以在基於Java的服務器中使用異步支持。

我正在使用Spring,它是一個名為deferredresult的新類,該類可以從雄貓中獲取線程,將邏輯執行到執行者線程池中,從而使雄貓中的線程可以自由處理其他請求,然后在完成響應后返回。

在事件循環中,所有阻塞調用均應由工作程序vertx完成,其概念是絕對相同的,您為阻塞調用提供了一個線程,並在任務完成后提供回調。事件循環執行回調並返回響應。

這些概念看起來與我非常相似。

也許我錯過了一些東西,但是這些概念之間有什么區別?

基於線程池的Web服務器使用工作線程作為用戶請求的主要執行上下文。 開發Spring或JavaEE應用程序時,您會調用很多阻塞代碼(JDBC,Hibernate,JAX-RS客戶端等)。 然后添加了Servlet 3.1異步API,以解決長時間輪詢之類的問題(如果所有工作線程都在等待,則您將無法再處理請求)。

但是,基於事件循環的系統(Vert.x,Node)被構建為通過單個線程處理許多用戶請求。 通常,您將它們與不阻塞的數據庫驅動程序或Web客戶端結合使用。 這是一個非常強大的模型 (更少的線程遷移,熱緩存等)。 但是,您不能阻止事件循環,否則不能再處理事件。 在理想的情況下,您將只使用非阻塞庫,但現實是許多Java庫都沒有,我們不應該僅僅丟棄這種遺留物。 作為解決方法,Vert.x提供了一種將阻止代碼執行的工作卸載到工作池的方法。

我希望這可以澄清一點,並表明除了相似之處之外,用例也有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM