導航:首頁 > IDC知識 > java高並發tcp伺服器

java高並發tcp伺服器

發布時間:2020-11-21 11:29:47

1、求java搭建高並發網站項目解決方案!

你的資料庫怎麼設計的,分庫了嗎?分表了嗎?
apache,tomcat只能解決前端負載,你如果沒有分庫、分表的話,弄再多的apache,tomcat也起不了多大作用。
頁面靜態化,分布式緩存,分庫(例如分20個庫)

2、Java高並發,如何解決,什麼方式解決

兩個方向。
代碼方向:1優化代碼,提高處理速度,2網路使用nio模式。3 使用非同步模式。4 使用memcache等內存緩存
硬體方向:1 伺服器升級 2 資料庫升級 3 縱向或橫向增加伺服器。

3、用Java做一個大流量,高並發的網站應該怎麼樣進行底層構架

架構是為了解決糸統中具有共性的問題而進行定義了減少重復工作量,且易於維護和擴展的技術准則和規范,它產出物和體現為文檔和基礎代碼框架等。
因此選擇那些框架只是架構的一部分,通常是選擇自己善長的,以及對新技術的更新比較及時的;所以現在的Java框架最多為SpringMVC。
所以你提出的大並發是一個問題,但先確定它是不是所有模塊都需要解決這個問題。
而大數據又是另一個問題,同樣每個模塊查詢或者計算都是大數據嗎。
綜上所述將問題定位並分解,並發問題,要考慮帶寬還是區域網,一個應用伺服器最大能支持多少請求連接,你需要多少個,每個應用伺服器是獨立的模塊呢還是齊群。齊群還要注意的登錄一次還是多次,也就是SSO了,是否注意內存共享,如sessionId,是否考慮內存相互同步還是通過分布式的解決等糸列問題。還有一個資料庫有多少連接可以用等跟應用伺服器同理。
那麼大數據呢,要考慮的關鍵為兩個,是計算還是查詢,是實時的業務要求還是可以延時的,查詢可以是緩存,分表分庫,分區,索引等方式。緩存的時候要注意你考慮的帶寬是一個lDC還是多個IDC,數據間怎麼同歩是個分布式問題,如果大數據計算問題是否考慮一下雲計算解決方案等

因此你所說的怎麼架構,如何選框架,這是兩個問題,不是解決你問的大數據大並發,反而是架構工作中的一個塵灰而已。你也知道架構最大的是那裡了吧一一分析到分割。

架構是很難的工作,作不好,別相信用硬體能解決問題。就像使用微軟的 盜版一樣,出了問題可能是用N的成本來解決,N可能是幾萬,也可能是幾萬的N次方。

4、java高並發,如何解決,什麼方式解決,高並發

高並發系統的設計需要注意一下幾點:
用jprofiler等工具找出性能瓶頸,減少額外的開銷專。
盡量使用緩存屬,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
硬體上就是提高伺服器性能,提升允許最大訪問量,代碼上面可以使用連接池的方式,更合理的規劃連接,提高連接的有效利用率
負載均衡(軟體負載均衡、硬體負載均衡)
分布式資料庫(資料庫主從分布、資料庫分割、資料庫緩存)
可以採用nginx或者lvs軟體工具,他好像最高支持65535的並發訪問。
實實在在太大的話,終極解決方式隊列方式,通過mq一個一個排隊方式,跟12306一樣。

5、用Java做一個大流量,高並發的網站應該怎麼樣進行底層構架

JVM
JEE容器中運行的JVM參數配置參數的正確使用直接關繫到整個系統的性能和處理能力,的調優主要是對內存管理方面的調優,優化的方向分為以下4點:
1.HeapSize 堆的大小,也可以說Java虛擬機使用內存的策略,這點是非常關鍵的。
2.GarbageCollector 通過配置相關的參數進行Java中的垃圾收集器的4個演算法(策略)進行使用。
3.StackSize 棧是JVM的內存指令區,每個線程都有他自己的Stack,Stack的大小限制著線程的數量。
4.DeBug/Log 在JVM中還可以設置對JVM運行時的日誌和JVM掛掉後的日誌輸出,這點非常的關鍵,根據各類JVM的日誌輸出才能配置合適的參數。
網上隨處可見JVM的配置技巧,但是我還是推薦閱讀Sun官方的2篇文章,可以對配置參數的其所依然有一個了解
1.Java HotSpot VM Options
Java HotSpot VM Options
2.Troubleshooting Guide for Java SE 6 with HotSpot VMTroubleshooting Guide for Java SE 6 with HotSpot VM
另外,我相信不是每個人攻城師都是天天對著這些JVM參數的,如果你忘記了那些關鍵的參數你可以輸入Java -X(大寫X)進行提示。
JDBC
針對MySQL的JDBC的參數在之前的文章中也有介紹過,在單台機器或者集群的環境下合理的使用JDBC中的配置參數對操作資料庫也有很大的影響。
一些所謂高性能的 Java ORM開源框架也就是打開了很多JDBC中的默認參數:
1.例如:autoReconnect、prepStmtCacheSize、cachePrepStmts、useNewIO、blobSendChunkSize 等,
2.例如集群環境下:roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster。
具體內容可以參閱MySQL的JDBC官方使用手冊:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-jdbc-reference
資料庫連接池(DataSource)
應用程序與資料庫連接頻繁的交互會給系統帶來瓶頸和大量的開銷會影響到系統的性能,JDBC連接池負責分配、管理和釋放資料庫連接,它允許應用程序重復使用一個現有的資料庫連接,而再不是重新建立一個連接,因此應用程序不需要頻繁的與資料庫開關連接,並且可以釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的性能。
在此我認為有一點需要說明:
連接池的使用也是需要關閉,因為在資料庫連接池啟動的時候就預先和資料庫獲得了相應的連接,之後不再需要應用程序直接的和資料庫打交道,因為應用程序使用資料庫連接池是一個「借」的概念,應用程序從資料庫連接池中獲得資源是「借出」,還需要還回去,就好比有20個水桶放在這里,需要拿水的人都可以使用這些木桶從水池裡面拿水,如果20個人都拿完水,不將水桶還回原地,那麼後面來的人再需要拿水,只能在旁邊等待有人將木桶還回去,之前的人用完後需要放回去,不然後面的人就會一直等待,造成資源堵塞,同理,應用程序獲取資料庫連接的時候Connection連接對象的時候是從「池」中分配一個資料庫連接出去,在使用完畢後,歸還這個資料庫連接,這樣才能保持資料庫的連接「有借有還」准則。
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-connection-pooling
數據存取
資料庫伺服器的優化和數據的存取,什麼類型的數據放在什麼地方更好是值得去思考的問題,將來的存儲很可能是混用的,Cache,NOSQL,DFS,DataBase 在一個系統中都會有,生活的餐具和平日里穿衣服需要擺放在家裡,但是不會用同一種類型的傢具存放,貌似沒有那個人家把餐具和衣服放在同一個櫃子裡面的。這就像是系統中不同類型的數據一樣,對不同類型的數據需要使用合適的存儲環境。文件和圖片的存儲,首先按照訪問的熱度分類,或者按照文件的大小。強關系類型並且需要事務支持的採用傳統的資料庫,弱關系型不需要事務支持的可以考慮NOSQL,海量文件存儲可以考慮一下支持網路存儲的DFS,至於緩存要看你單個數據存儲的大小和讀寫的比例。
還有一點值得注意就是數據讀寫分離,無論在DataBase還是NOSQL的環境中大部分都是讀大於寫,因此在設計時還需考慮 不僅僅需要讓數據的讀分散在多台機器上,還需要考慮多台機器之間的數據一致性,MySQL的一主多從,在加上MySQL-Proxy或者借用JDBC中的一些參數(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)對後續應用程序開發,可以將讀和寫分離,將大量讀的壓力分散在多台機器上,並且還保證了數據的一致性。
緩存
在宏觀上看緩存一般分為2種:本地緩存和分布式緩存
1.本地緩存,對於Java的本地緩存而言就是講數據放入靜態(static)的數據結合中,然後需要用的時候就從靜態數據結合中拿出來,對於高並發的環境建議使用 ConcurrentHashMap或者CopyOnWriteArrayList作為本地緩存。緩存的使用更具體點說就是對系統內存的使用,使用多少內存的資源需要有一個適當比例,如果超過適當的使用存儲訪問,將會適得其反,導致整個系統的運行效率低下。
2. 分布式緩存,一般用於分布式的環境,將每台機器上的緩存進行集中化的存儲,並且不僅僅用於緩存的使用范疇,還可以作為分布式系統數據同步/傳輸的一種手段,一般被使用最多的就是Memcached和Redis。
數據存儲在不同的介質上讀/寫得到的效率是不同的,在系統中如何善用緩存,讓你的數據更靠近cpu,下面有一張圖你需要永遠牢記在心裡,來自Google的技術大牛Jeff Dean(Ref)的傑作,如圖所示:

並發/多線程
在高並發環境下建議開發者使用JDK中自帶的並發包(java.util.concurrent),在JDK1.5以後使用java.util.concurrent下的工具類可以簡化多線程開發,在java.util.concurrent的工具中主要分為以下幾個主要部分:
1.線程池,線程池的介面(Executor、ExecutorService)與實現類(ThreadPoolExecutor、 ScheledThreadPoolExecutor),利用jdk自帶的線程池框架可以管理任務的排隊和安排,並允許受控制的關閉。因為運行一個線程需要消耗系統CPU資源,而創建、結束一個線程也對系統CPU資源有開銷,使用線程池不僅僅可以有效的管理多線程的使用,還是可以提高線程的運行效率。
2.本地隊列,提供了高效的、可伸縮的、線程安全的非阻塞 FIFO 隊列。java.util.concurrent 中的五個實現都支持擴展的 BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。這些不同的類覆蓋了生產者-使用者、消息傳遞、並行任務執行和相關並發設計的大多數常見使用的上下文。

6、JAVA高吞吐高並發後端架構設計經驗是什麼意思

有些網站並發量比較高,例如:12306,到了春節的時候,訪問量就非常高回了。以前不是經常卡住、答崩潰嗎?
就是因為架構設計的不行。去年好多了。
高吞吐、高並發指的是一種種業務場景,訪問人數很多,同一時刻點擊也很多。

類似的還有雙十一,雙12。
高峰期的時候 涉及大量的讀寫操作,讀取網頁資源、數據,寫入訂單等等。
小型網站可以通過增加伺服器的方法解決,分離應用程序和資料庫,放在兩台伺服器上。
大型的網站涉及的技術就更多了:緩存技術、讀寫分離、分布式部署伺服器、業務拆分、資料庫優化等等。

7、用Java做一個大流量,高並發的網站應該怎麼樣進行底層構架

別把高並發想復雜了,只要你能做到單個應用有並發,就算並發量只有2(這里有些誇張了),也可以通過集群來建立高並發。並發靠的是負載均衡,把大並發量平均轉移到各個系統節點上而已,你只要保證單應用的並發可靠性就好了。當然也有部分是要考慮,多機執行沖突和session共享,各類鎖的解決方案,具體看個人需求。

8、服務端--> java Serlvet如何解決服務端高並發訪問某個介面,出現的數據錯誤........

不是很明白抄你問題的意思。
你說的「在服務端並發100個線程訪問servlet的某一個介面,查詢出100人的信息,然後列印出它們的id」,100個線程每個線程都查詢100個人的信息?還是每個線程只查詢一個人的信息,任意兩個線程查詢不同人的信息?

9、JAVA高並發問題,大數據,頻繁I/O操作。

建議採用緩存處理,按照你說的這種數據量,基於redis的緩存完全可以滿足回,存取速度可以10W+的,另答外,擬採用的hashMap 是ConcurrentHashMap還是其他,頁面展示是增量查詢還是直接所有的再查詢一次,socket數據接收你是用的netty還是mina,這都需要經過仔細的斟酌考慮設計的。有這么大的並發的需求,完全可以考慮做分布式集群的,估計這只是領導想要的目標吧

10、java高並發是什麼意思,高並發的解釋

1、在java中,高並發屬於一種編程術語,意思就是有很多用戶在訪問,導致系統數據不正專確、糗事數據的現象屬。並發就是可以使用多個線程或進程,同時處理不同的操作。

與java高並發tcp伺服器相關的知識