文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
1. 背景
該項目為研究生時的老師牽頭,個人已畢業數年,應老師要求協助其進行了該項目的管理。
項目組能獲取到全球主要作物的生長指標,以及降水、溫度等影響作物生長的指標數據。面對繁瑣冗長的大量遙感數據,致力讓廣大沒有遙感專業背景的用戶了解到全球各農作物的生長情況,為用戶提供一個可視化的全球農情遙感數據展示。
網站包括的功能有:
多種指標(NDVI、PAR、溫度、降水等)的展示。
反演影像展示。
聚類產品展示。
產量及價格指數展示等。
2. 初始架構(1.0版本)——傳統方案
2.1架構描述
由於對方已采購了SQLSERVER和ARCGIS SERVER,期望將這兩款軟件用上,所以初始版本的架構數據庫采用了SQLSERVER,地理服務器采用了AGS,服務端基於JAVAEE,前端采用AGS JS。
在展示中,對於指標數據(全球地圖)遍歷,並且根據讀出的指數值再逐個添加樣式,最后用graphic逐個畫出。 影像數據用MXD發布到ARCGISSERVER,包括邊界( 國家、MRU、MPZ等)數據。
2.2架構未解決的問題
此架構開發完DEMO后,便遇到了幾個必須解決的問題。
問題1:進入系統后,全球化地圖(基於graphiclayer)顯示緩慢。
問題2:影像成果數據各指數產品,每周每旬每月均會增加。如果依靠人工發布至AGS,首先無法實現智能化;其次AGS上一年增加上千個影像的發布,很顯然是不現實的。
3. 從數據處理進化架構(2.0版本)
3.1架構進化描述
a.開發自動切圖程序,掃描指定文件夾,當影像下載至指定文件夾時則進行影像切圖將其轉移至目標文件夾。
b.對全球尺度SHP數據進行簡化,使數據量大大減小。
c.將SHP數據處理為GeoJson文本后,再進行壓縮為PBF格式,並且開啟Tomcat中的GZIP壓縮,進一步減少數據請求量大小。
d.對所有前端JS文件進行壓縮打包,減少請求JS時的連接數。
總結:
舍棄AGS,將影像瓦片和SHP數據本地化,並且盡量減少JS請求個數。
3.2架構未解決的問題
隨着需求進一步增加,要求增加國內縣市級數據(2000+縣),並且按作物產區顯示反演影像。目前的數據庫設計會導致每張指數表中數據量激增,隨時過一千萬。系統前端的展示十分卡頓。
4.從數據庫層面開始進化之3.0版本
4.1架構進化描述
a.仔細分析業務后對數據庫進行分表,即按照指數和地域來進行分表,使每張數據表的大小大大降低。
b.針對影像按產區展示需求,增加地圖的MASK功能。
4.2架構未解決的問題
由於之前均是基於個人服務器開發,用戶后又提出希望將系統部署至阿里雲上,於是對架構提出了新的規划。
5.從個人服務器轉移至阿里雲的進化(4.0版本)
5.1架構進化描述
a.雲服務器采用Linux系統,數據庫更換成Mysql。在服務器上搭建tomcat+javaee+mysql的架構。
b.由於切圖程序為AE開發,所以這里將切圖程序部署在windows服務器上,其切圖成功后再將瓦片自動轉移至指定目錄。
5.2架構未解決的問題
在雲服務搭建好后,系統開始投入使用,發現即使分表了,由於全球數據過多,依然導致每張指數表快接近一千萬。系統又開始卡頓。
6.從索引、緩存、部署上進行進化(5.0版本)
6.1架構進化描述
a.增加合理的索引機制,如mysql的組合索引(mysql中的組合索引的各組合字段順序比較有學問http://blog.sina.com.cn/s/blog_46d93f1901017biz.html)。
b.優化SQL語句,同樣在mysql中between的使用也大有講究,如果使用不當(查詢內容占表的16%時會自動全表查詢)會導致索引無效,而用IN則無此問題。還有針對Where字句順序的調整等。
c.增加mysql的數據庫級別緩存。
d.使用ehcache緩存。
e.采用CDN。
f.部署nginx,將瓦片文件夾等做靜態資源代理,實現最大限度的靜動態文件分離。
7.總結
1.需求總是不斷變化的,我們即沒有必要使用成本最高的實施方案,也不能總是選用沒有擴展空間的方案,快一步就剛剛好。
2.一些必要的優化知識得銘記。
數據庫層面:加索引(單列、組合),分表,SQL優化(邏輯和語法),分庫。
服務器層面:GZIP,反向代理,集群水平擴展。
前端:代碼合並壓縮,通過CSS sprites來整合圖像,圖像壓縮,CDN(但內網無法使用),樣式修改需要放一起。
最后上一張系統圖:
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^