非推倒重來式的讀/寫伸縮擴充套件
Avanza銀行是一家瑞典的銀行,讓投資者易於作出股權交易和基金交易。它透過自己的線上銀行提供很好工具給投資者使用,當前線上系統是典型的基於Java/Jsp和Spring的Web網站。
當前大部分操作是讀取,主要可伸縮性的挑戰是併發讀操作,採取的是目前很多系統採取的架構LAMP + Memcached,第一次從資料庫中獲取,以後直接從快取中獲得。
新的系統改造將設計目標為實時性和社會性領域,這就意味著很多內容將不是由網站管理者來產生,而是由使用者自己來創造,由此帶來新的大量的流量和活動。
系統將改變到以流量負載為主要目標。
寫伸縮的挑戰:
前面提到的資料庫之前快取(side-cache)的問題是帶來副作用,由於大量資料更新,導致快取中的資料過時,同步快取增加了開銷。
使用Oracle RAC 並沒有象它宣稱那樣,而且成本非常昂貴。
不像一些Green Field綠色領域應用,Avanza 有自己的線上應用,屬於Brown Field,這就帶來如下問題:
已經存在成熟的資料模型,整個資料模型設計為關聯式資料庫,將這些關係數控模型遷移到NoSQL架構,將耗費幾年的努力。還有一些遺留系統,重寫這些遺留系統幾乎是不可能的。還有複雜的環境。
採取不重寫整個系統前提下進行讀寫伸縮擴充套件:
1.圈定需要伸縮擴充套件的範圍
2.保留資料庫,在資料庫之外進行讀寫伸縮,這樣不必改變資料庫表結構。
3.將資料網格In Memory Data Grid(IMDG)放在資料庫之前。IMDG中包含所有熱點表或資料表記錄,線上Web應用將訪問IMDG而不是資料庫,IMDG可分佈地將讀寫操作分散到叢集伺服器上。
4.使用write-behind策略減少過多的同步負載。將IMDG中資料持久更新到下面的資料庫中是使用非同步的批操作,這是透過一種內部查詢機制( internal queuing mechanism (redo-log))
5.使用O/R mapping等框架將IMDG中物件資料和關聯式資料庫進行對映,例如Hibernate或OpenJPA。切分資料帶來好可伸縮性,但是這不代表改變資料表結構,在IMDG資料網格中儲存的是另外一種不同於資料庫表格式的可切分資料格式應為一種領域物件模型格式)。
6.使用標準的Java API,例如IMDGs使用 GigaSpaces提供的標準 APIs, 比如 JPA等等,能夠在創新和繼承已有之間取得技能上的平衡。
7.使用兩個並行站點促使逐步轉換。
最後的軟體架構如下:
當前大部分操作是讀取,主要可伸縮性的挑戰是併發讀操作,採取的是目前很多系統採取的架構LAMP + Memcached,第一次從資料庫中獲取,以後直接從快取中獲得。
新的系統改造將設計目標為實時性和社會性領域,這就意味著很多內容將不是由網站管理者來產生,而是由使用者自己來創造,由此帶來新的大量的流量和活動。
系統將改變到以流量負載為主要目標。
寫伸縮的挑戰:
前面提到的資料庫之前快取(side-cache)的問題是帶來副作用,由於大量資料更新,導致快取中的資料過時,同步快取增加了開銷。
使用Oracle RAC 並沒有象它宣稱那樣,而且成本非常昂貴。
不像一些Green Field綠色領域應用,Avanza 有自己的線上應用,屬於Brown Field,這就帶來如下問題:
已經存在成熟的資料模型,整個資料模型設計為關聯式資料庫,將這些關係數控模型遷移到NoSQL架構,將耗費幾年的努力。還有一些遺留系統,重寫這些遺留系統幾乎是不可能的。還有複雜的環境。
採取不重寫整個系統前提下進行讀寫伸縮擴充套件:
1.圈定需要伸縮擴充套件的範圍
2.保留資料庫,在資料庫之外進行讀寫伸縮,這樣不必改變資料庫表結構。
3.將資料網格In Memory Data Grid(IMDG)放在資料庫之前。IMDG中包含所有熱點表或資料表記錄,線上Web應用將訪問IMDG而不是資料庫,IMDG可分佈地將讀寫操作分散到叢集伺服器上。
4.使用write-behind策略減少過多的同步負載。將IMDG中資料持久更新到下面的資料庫中是使用非同步的批操作,這是透過一種內部查詢機制( internal queuing mechanism (redo-log))
5.使用O/R mapping等框架將IMDG中物件資料和關聯式資料庫進行對映,例如Hibernate或OpenJPA。切分資料帶來好可伸縮性,但是這不代表改變資料表結構,在IMDG資料網格中儲存的是另外一種不同於資料庫表格式的可切分資料格式應為一種領域物件模型格式)。
6.使用標準的Java API,例如IMDGs使用 GigaSpaces提供的標準 APIs, 比如 JPA等等,能夠在創新和繼承已有之間取得技能上的平衡。
7.使用兩個並行站點促使逐步轉換。
最後的軟體架構如下:
相關文章
- 伸縮擴充套件Node.JS應用套件Node.js
- 使用Slice擴充套件伸縮OpenJPA 應用套件
- 12306火車票訂票系統的伸縮擴充套件套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- GeoEvent Server橫向伸縮擴充套件(四)——配置GeoEvent Server啟用分散式事件排程中心...Server套件分散式事件
- 重讀 ES6 — 陣列、物件的擴充套件陣列物件套件
- 寫擴充套件性好的程式碼:函式套件函式
- 編寫自己的php擴充套件函式 (轉)PHP套件函式
- 印度遊戲平臺Dream11如何伸縮擴充套件他們的遊戲中臺?遊戲套件
- 重學ES6 函式的擴充套件(上)函式套件
- PHP的LZF壓縮擴充套件工具PHP套件
- UNDO SEGMENT的擴充套件和收縮套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 擴充套件表示式套件
- 編寫自己的php擴充套件函式(一) (轉)PHP套件函式
- 重構聚合支付案例教你如何寫出高擴充套件性易讀的程式碼套件
- [擴充套件]laravel-xlswriter 一款基於xlswriter的laravel擴充套件包 excel極速讀寫套件LaravelExcel
- activiti通過擴充套件點重寫節點行為套件
- 編寫可擴充套件程式套件
- 壓縮/擴充套件qcow2磁碟套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- PHP的bz2壓縮擴充套件工具PHP套件
- Kotlin擴充套件函式Kotlin套件函式
- Z 函式(擴充套件KMP)函式套件KMP
- 為Unity元件編寫擴充套件Unity元件套件
- 利用Delphi編寫IE擴充套件套件
- HIVE自定義函式的擴充套件Hive函式套件
- Amazon Aurora 讀寫能力擴充套件之 ShardingSphere-JDBC 篇套件JDBC
- 讀構建可擴充套件分散式系統:方法與實踐15可擴充套件系統的基本要素套件分散式
- 使用ctypes來擴充套件Python套件Python
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- testng擴充套件 失敗的用例重跑套件
- 重構 - 設計API的擴充套件機制API套件
- 使用phpopenssl擴充套件實現非對稱加密PHP套件加密
- es6-函式擴充套件函式套件
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- Ace Editor 擴充套件編寫初步(轉)套件
- 利用Delphi編寫IE擴充套件 (轉)套件