簡體   English   中英

有2個Web服務器,單例類有2個實例嗎?

[英]With 2 web servers, will a singleton class have 2 instances?

有2個Web服務器,單例類有2個實例嗎?

兩個Web服務器都將具有其應用程序進程的單獨實例,無論是.net還是Java。 所以, 是的 ,兩個服務器都將擁有單個類的單獨實例。

無論這兩個Web服務器是兩個不同的物理機器,即使它們位於同一台服務器上,它們肯定會完全在不同的進程上運行。 每個進程都將其對象與其他任何進程分開加載到內存中。

specifically in case of asp.net - 即使在單個Web服務器中,每個站點也會導致Singleton類的單獨實例。 因為asp.net工作進程中的每個站點都加載在單獨的應用程序域中,所以沒有兩個域可以干擾彼此的對象。 因此,在asp.net的情況下,即使具有單個asp.net工作進程的單個Web服務器也可以/將具有單個類的多個實例,每個實例與另一個實例分離。

是的,每個JVM甚至是類加載器都有一個Singleton。

看到這個單身人士什么時候不是單身人士? 文章(針對Java)。

你是什​​么意思“2 Web服務器”? 靜態字段(單例)的作用域為Application Domain(在.net中)。

因此,如果您的兩個Web服務器在兩個單獨的應用程序域中運行,則為是,否則為否。

實際上,如果它是部署了兩次的webapp的一部分,那么在一個Web服務器中可能有2個單例調用實例。

在Java中,類加載器是類的標識的一部分。 您可以使用不同的類加載器兩次加載相同的類,並且所有靜態字段將存在兩次。 C#有類似的機制。

可以創建一個將在所有內容上復用的Web服務器 - 連接,偵聽套接字,甚至接口。 它仍然是該類的一個實例,只有一個線程,並且除此之外還有相當小的內存占用。 需要注意的是,從大多數實際角度來看,它看起來像兩台服務器,它仍然只有一台服務器(如果它崩潰了,它會崩潰整個...)

這種方法並不像多線程Web服務器那樣流行,因為雖然硬件較輕,但開發人員難以處理 - 您必須在所有內容之間進行顯式多路復用,並在非阻塞調用中處理所有連接。 如果你產生了一些額外的線程,操作系統會從你身上帶走很多工作,讓你更容易編寫功能更豐富的服務器。

當然,即使在單線程服務器中,在單獨的任務中產生第二台服務器仍然是可能的,只需用戶/ admin /再次執行二進制文件的人,使用不同的配置。 它需要一些非常精美的編程來防止這種情況發生。

這就是JSP / Servlets提供“會話”和“應用程序”數據的想法的原因。 這些應該在多服務器環境中的服務器之間共享。

作為此問題的擴展,特別是對於.NET Web應用程序,您還需要注意SessionState處理。 假設會話不是“粘性”(一旦建立會話,用戶就停留在一個Web服務器上),您需要將SessionState更改為進程外。 這可以是ASP.NET會話狀態服務器,也可以是SQL Server,但要記住的關鍵點是SessionState不會在服務器之間自動共享,除非您通過進程外共享它。 此外,您在SessionState中放置的任何內容都需要可序列化; 將[Serializable]屬性添加到您在SessionState中使用的任何類。

暫無
暫無

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

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