高併發思路

服務器性能、數據庫性能、網絡連接甚至編程語言都會影響併發數。但總結起來,高併發無非就是拆拆拆分分分

樂觀鎖

樂觀鎖是數據庫優化的典範。即,通過對數據條目的“版本控制”,來約束數據,防止髒讀寫操作。在實際操作中並不獨佔資源。在設計思路上是通過引入“版本”概念來放棄資源約束。
舉例:
數據庫中設置CREATE TABLE tbl (
id varchar(32) ,
/** 樂觀鎖字段 **/
optimistic_lock numeric(12)
)

java中使用spring @version 關鍵字,
@Version
@Column(name = “optimistic_lock”, columnDefinition = “INTEGER”)
private long optimisticLock;

讀寫分離

數據庫中的讀寫分離知識數據庫集羣的一種典型。並不一定需要按讀寫分離數據庫,也可以根據特定的業務邏輯來進行分開操作。
我們以讀寫分離舉例:
通常設計兩個數據庫master和slave數據服務器,在spring中配置兩個datasource
<!-- 定義數據源,使用自己實現的數據源 -->
<bean id="dataSource" class="cn.itcast.usermanage.spring.DynamicDataSource">
<!-- 設置多個數據源 -->
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- 這個key需要和程序中的key一致 -->
<entry key="master" value-ref="masterDataSource"/>
<entry key="slave" value-ref="slave01DataSource"/>
</map>
</property>
<!-- 設置默認的數據源,這裏默認走寫庫 -->
<property name="defaultTargetDataSource" ref="masterDataSource"/>
</bean>

並在dao層調用時進行讀寫分別調用。
爲保證master/slave服務器的數據一致性,兩個服務器間會有同步。

分離resource存儲

我們以圖片分離存儲爲例,在web場景中,頁面加載的圖片是非常消耗資源的,通常我們會放在其他的服務器上來進行存儲,針對圖片資源進行優化加速。這就像是java編程理念中的“解耦”。
同理,js文件、css文件、zip文件等皆可通過這種方式進行分離,再配合CDN加速技術,實現訪問速度和併發能力的提升。

CDN加速

CDN加速就是在靠近用戶的物理位置上架設服務器,根據就近原則使用戶訪問物理上最近的服務器來節省網絡傳輸時間。
通常這種CDN加速的服務器分散到全國設置世界各地,並適當採用的緩存、專線等技術。
爲保證數據的一致性,服務器間進行同步。

動態轉靜態

我們把一次HTTP請求的時間分成幾段:request–> calculate–> response,那麼靜態資源簡化甚至省略了calculate步驟,實現請求–>響應的簡單模型。
我們可以將“冪等”的請求進行靜態化處理。我們舉例來理解這件事:
比如用戶想快速的查詢自己近一個月的交易總額,按照傳統模式我們需要服務器在用戶查詢後進行累加計算來統計用戶這一個月的交易數據。那麼我們可以在每天凌晨運行一次spring batch 來統計所有用戶的交易總額信息,並存儲在用戶對應的表裏,當用戶查詢時,直接獲取。

緩存

緩存可以理解爲動態轉靜態的一個實例。也可以理解爲將硬盤上的數據存入內存方便讀取。通常設計爲key-value形式。
以常用的memcache舉例:
MemCachedClient mc = new MemCachedClient();
String key = “cacheKey1”;
Object value = SomeClass.getObject();
mc.set(key, value);

服務器鏡像

與CDN加速的設計類似,根據不同地域、網絡服務商等網絡條件假設多個服務器的“鏡像”來實現網絡傳輸環節的優化。
以此我們可以引出“負載均衡”。

負載均衡

負載均衡的設計理念是根據資源請求消耗情況來自動調節平衡。
比如我們在多個端口配置啓動tomcat:

<Connector port="11009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

<Connector port="12009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

其他

  1. 分庫、分表
  2. 合理的Synchronized
  3. 基本的SQL優化,比如儘量避免全表掃描

我個人理解的高併發就是,把傳統的“單元操作”進行拆分,分的越細緻越好。

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