简记某WebGIS项目的优化之路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

简记某WebGIS项目的优化之路的更多相关文章
- 新浪微博iOS客户端架构与优化之路
新浪微博iOS客户端架构与优化之路 随着Facebook.Twitter.微博的崛起,向UGC.PGC.OGC,自媒体提供平台的内 容消费型App逐渐形成了独特的客户端架构模式.与电商和通讯工具类 ...
- CSS代码重构与优化之路(转)
CSS代码重构与优化之路 阅读目录 CSS代码重构的目的 CSS代码重构的基本方法 CSS方法论 我自己总结的方法 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多 ...
- VUE项目性能优化实践——通过懒加载提升页面响应速度
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近我司因业务需求,需要在一个内部数据分析平台集成在线Excel功能,既然我 ...
- 微博MySQL优化之路--dockone微信群分享
微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...
- 阿里巴巴 web前端性能优化进阶路
Web前端性能优化WPO,相信大多数前端同学都不会陌生,在各自所负责的站点页面中,也都会或多或少的有过一定的技术实践.可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化 ...
- 仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化
仿百度壁纸客户端(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度 ...
- Golang 优化之路——bitset
写在前面 开发过程中会经常处理集合这种数据结构,简单点的处理方法都是使用内置的map实现.但是如果要应对大量数据,例如,存放大量电话号码,使用map占用内存大的问题就会凸显出来.内存占用高又会带来一些 ...
- 专访阿里巴巴研究员“赵海平”:Facebook的PHP底层性能优化之路(HipHop,HHVM)
专访阿里巴巴研究员“赵海平”:Facebook的PHP底层性能优化之路 http://www.infoq.com/cn/articles/interview-alibaba-zhaohaiping
- 仿百度壁纸client(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化
仿百度壁纸client(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager + Fragm ...
随机推荐
- 百度MIP移动页面加速——不只是CDN
MIP是用CDN做加速的么?准确答案是:是,但不只是. MIP全称Mobile Instant Pages,移动网页加速器,是百度提出的页面加速解决方案.MIP从前端渲染和页面网络传输两方面进行优化, ...
- ASP.NET Aries 入门开发教程1:框架下载与运行
背景: 鉴于框架的使用者越来越多,文档太少,不少用户反映框架的入门门槛太高. 好吧,再辛苦下,抽时间写教程吧! 步骤1:下载框架源码 开源地址:https://github.com/cyq1162/A ...
- 移动端1px边框
问题:移动端1px边框,看起来总是2倍的边框大小,为了解决这个问题试用过很多方法,用图片,用js判断dpr等,都不太满意, 最后找到一个还算好用的方法:伪类 + transform 原理是把原先元素的 ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- 从netty-example分析Netty组件续
上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...
- javascript之闭包理解以及应用场景
半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...
- 从display:run-in;中学习新技能
有时我们想在一行内显示一个标题,以及一段内容,虽然看起来比较简单,但是为了语义化用dl比较合适,但是它默认是block元素,改成inline?那么有多段呢?不就都跑上来了?用float?那问题也挺多. ...
- 整理下.net分布式系统架构的思路
最近看到有部分招聘信息,要求应聘者说一下分布式系统架构的思路.今天早晨正好有些时间,我也把我们实际在.net方面网站架构的演化路线整理一下,只是我自己的一些想法,欢迎大家批评指正. 首先说明的是.ne ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- Android开发案例 – 在AbsListView中使用倒计时
在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...