高併發(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併發,網址秒開,後臺無異常報錯。
實際部署後上線,毫無壓力,一致好評。