高併發(5000)+tomcat+nginx+seesion共享------記一次應急後分享

高併發(5000)+tomcat+nginx+seesion共享
背景
公司最近緊急開發一款應急程序,前期由於使用人數不是很多,最大併發人數一個tomcat即可應付,後來由於公司本部,分公司,子公司等加入使用,使用人數急劇增大,高峯時段經常報502,tomcat IOE異常,當時我們就意識到請求過多,服務器無法及時應答,需要負載。

方案:
1.首先想到的方案便是 Nginx+memcached+tomcat,因爲我們不想修改代碼,需求緊急,先考慮最快實現方式。memcached用於解決session共享問題。前期搭建過程曲折,tomcat版本,memcached的版本,MSMjar包版本,等等,各種版本問題,啓動tomcat 各種報錯,網上一查基本是版本衝突。後來搭建成功發現本地測試沒問題,壓測一下2000併發立馬seesion 失效,網上關於memcached 解決方案太少,放棄了。畢竟對memcached不熟。需要的jar包,我這可以提供一下,方便後續研究。
鏈接 Nginx+memcached+tomcat7 所需要的jar
2.後來,我的思路轉向redis,之前項目有用過,也比較熟。
具體方案是:Nginx+redis+tomcat7 ;
兩臺服務器,8核,16G—虛擬機,windows server 2012 ;
兩個tomcat7,nginx負載。
其實最先應該優化單個tomcat,提高tomcat最大性能,我看網上說極限是2000併發,經過幾次調優,壓測1000併發會有20% 機率丟失,

    <Connector port="8099" protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="2000" minSpareThreads="1000" 
maxSpareThreads="2000"  connectionTimeout="20000"   URIEncoding="UTF-8"/>

主要就是maxThreads 和 protocol 非阻塞 方式調優。

由於我們是web項目(非maven),我們想在改最少代碼情況下,將session存取到redis,我由此想到是基於xml 的springSession 方案解決。

applicationContext.xml redsi注入bean

<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="1800"></property>
    </bean>
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="password" value="${redis.password}"/>
        <property name="timeout" value="20000"/>
        <property name="poolConfig" ref="poolConfig"></property>
    </bean>

web.xml 對springSession 過濾

<filter>
	<filter-name>springSessionRepositoryFilter</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
	<filter-name>springSessionRepositoryFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

需要注意的是過濾的路徑 可能會無法正常訪問頁面。

所需要的jar 在這:
springsession+ redis jar

經過四輪壓測,由2000 - 3000 -4000 -5000併發,網址秒開,後臺無異常報錯。

實際部署後上線,毫無壓力,一致好評。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章