技术总结
马上要重新启程了, 要从传统行业转到互联网行业. 这里先在技术层面做点总结吧.
===================
看好和看衰的技术和产品
===================
看好:
1. SQL 语言, 如果SQL语言加到编程语言排行榜, 肯定是第一. NoSQL带来的优点不足抵消SQL缺失带来的缺点.
2. HP Vertica 数据仓库, X86硬件+MPP+列式存储+读写优化技术. Vertica不仅仅是一个MPP, 而且也是一个SQL on Hadoop产品, 可通过export parquet导出到hdfs, 也可以通过external table访问hdfs, Vertica 9版本将更进一步.
3. Python 和 Java 语言.
3. Kettle ETL, 架构非常好, 部署也简单, 功能强大, 扩展性好. 可以用Java写插件, 可以写Java class, 这些扩展性能都很好. 采用JDBC的方式访问数据库, 其他ETL工具多采用ODBC的方式, 和ODBC相比, JDBC配置和部署都简单很多.
看衰:
1. Informatica ETL 工具, 我是这个工具的死黑. 相比 Kettle/SSIS/Datastage, 这个工具不是为人服务, 而是人要为这个工具服务.
2. Teradata 数据仓库, 原因是: 价格高, 产品封闭和bug很多, 技术已经落后.
===================
数据仓库和BI
===================
我接触的数仓数据量都在PB级以下, 只能给出这个量级的建议:
1. >10TB, 建议选用HP Vertica. Teradata/Exadata 价格太高, Greenplum 稳定性较差.
2. <10TB, 建议使用 Oracle R12, 建模做的好, 一般性能不是问题, 再不行上SSD硬盘, 或者上 Oracle shard. 也可以采用 SQL Server2012(因为SSIS很好用), EnterpriseDB(PostgreSQL)或bigsql(PostgreSQL).
3. >PB, 也许只有Hadoop+Hive了.
4. 实时大数据平台, OGG(或Debezium或Canal)+Kafka+Spark SQL+Vertica(或Kudu或HBase), 实时查询可以使用Vertica或Impala, PipelineDB知名度比SparkSQL差很多, 但它的使用方式和环境搭建更加简单.
4. 离线大数据平台, Kettle+Vertica(或Hive或Impala), Vertica不仅仅是一个MPP, 而且也是一个SQL on Hadoop产品, 可通过export parquet导出到hdfs, 也可以通过external table访问hdfs, Vertica 9版本将更进一步.
5. BI工具这块: Qlikview 不错, Microstragy/BO/Cognos 不建议. (Tableau 未使用过), 开源BI里面推荐Redash(Python)
6. ETL工具: 推荐使用ELT方式, 也就是SQL+调度就行了, 当然如果一定需要ETL工具, Kettle最赞, SSIS 和 Datastage 次之. Informatic千万别用.
7. 调度工具: 很多企业搞不清有了ETL工具, 为啥还需要调度工具. 我的观点是一定要有调度系统, 如果不涉及到Hadoop集群, 写一个一般功能的调度系统还是不难的, 开源的有Dolphi Scheduler 或 Airflow 或 Azkaban, Azkaban可以用Java开发插件.
===================
数据库
===================
关键的交易性数据库和一般的管理系统: 毫无疑问还是Oracle最好(性能, 稳定性).
偏分析型数据库,如果嫌Oracle许可贵, 可选用 PostgreSQL.
业务系统, 如果预期将来需要分表分库, 随大流选择MySQL没错, PostgreSQL就不推荐了.
缓存系统: 可随大流选择Redis, 也可以考虑Cassandra.
图数据库: 没怎么太深入了解, OrientDB/arangodb/neo4j 是较有名的图数据库.
消息中间件: Apache Pulsar
对象存储: MinIO
===================
软件开发项目要点
===================
1. 技术的选择: 使用久经考验的技术, 不要太求新, 同时避免花费大量时间纠结. 参考 instagram/stackoverflow 技术选型原则.
2. 架构要简单, 要以解决业务为目的, 不应过早考虑高可用性, 系统扩展性, 大并发等问题.
3. 要对:NoSQL/Micro-service/SOA/React/Vue/NodeJS 有一定免疫力.
4. 要能正确地面对技术债务, 前期可以适当欠债以保证项目的快速交付, 但后期应及时偿还, 否则债务会像滚雪球越来越大.
5. 开发环境要配好, 好的电脑, 双屏(至少2K), SSD硬盘投资小见效快, 好的网络, 好用的IDE.
6. 搭建好Git(SVN也不错)
7. 搭建一个好用的项目管理系统(比如禅道).
8. 搭建腾讯TIM或RTX通讯环境, 当然沟通还是以邮件为主.
9. 注重单元测试(不管是静态Java项目, 还是动态Python项目), 持续集成环境(比如jenkins等)
10. 注重服务器部署自动化(比如使用jenkins和rundeck, 最好和git/svn+rsync结合着用)
11. 搭建一个知识管理平台, 用于知识库管理/规范管理, 可以作wiki, 可以将word/excel等导入进去, 支持全文搜索, 可以记周报, 会议纪要. 商业软件可以选 Atlassian公司的confluence 系统, 开源的 Xwiki 也非常好(http://www.xwiki.org)
===================
再谈Python和Java
===================
1. Python 和 Java 语言, 我一直钟爱 Python, Python是很强, 但 Java 老大地位还是值得尊重的.
2. Python 是动态语言, 网上一句话, "动态语言一时爽,代码重构火葬场", 我基本认同这个讲法, 尤其对于我们普通水平的team, 能用Java优先用Java, 静态语言的IDE支持程度和编译的语法检查能在很大程度上减少bug.
3. 根据项目的类型, 选择最合适的语言. 我认为Python只在下面两个场景下优于Java.
(1)数据分析类和数据处理类项目, 这里的数据分析和处理不是指ETL类项目, 而是指需要做很多数值计算和统计.
(2)脚本类程序.
4. 如果选定了 Python 语言, 一定要选 Python 3.6 以上, 带有完整的类型annotation功能, 同时要使用mypy工具做静态类型检查.
===================
编程层面推荐的一些技术
===================
Http server: 推荐 Openresty(Nginx 的 bundle版), 高性能http服务器
Java Web 容器(生产): Tomcat
Java Web 容器(开发): Tomcat
Java 框架: Spring framwork/Spring Boot
Python WSGI(生产): Gunicorn(Linux)/CherryPy(跨平台)
Python Web Framework: Flask/Django
Python应用实时监控平台sentry: https://sentry.io/
前端(PC):
JS库: JQuery, underscore
UI框架/库: LayUI, AdminLTE , Bootstrap, Fontawesome,GitHub Octicons
Grid: ag-grid 或 jqgrid
Chart: ECharts, pyecharts(使用ECharts作为渲染引擎的 python 库)
LayUI 的后台管理模板 ok-admin
AdminLTE 是基于Bootstrap3的一套后台管理UI框架, 有很多现成模板可使用, github star超2.5万.
github https://github.com/almasaeed2010/AdminLTE
官网 https://adminlte.io/
前端(移动): 企业内部应用或用户数不算多, 我个人还是比较推荐H5.
JS库: Zepto, underscore
UI框架/库: SUI-Mobile, Fontawesome, GitHub Octicons
Chart: ECharts, 另外, Python bind https://github.com/chenjiandongx/pyecharts
需要将腾讯X5浏览器内核一起打包, 用来替代原生WebView, 解决移动设备原生webview碎片化问题, 也支持几十种常见文档的在线浏览.
移动开发选型: 阿里开源的 Weex 目前生态已经很不错, 是 react native 之外另一个比较成熟的 native 解决方案, 更多方案见 https://github.com/mishe/blog/issues/163
===================
监控系统
===================
监控系统推荐小米开源的open-falcon, 用一个就足够了, 不用考虑其他监控系统. open-falcon使用了 RRDTool 时间序列数据库, 承压能力很强, 自身有很好的展现界面, 如果觉得不好还可使用 Grafana. 系统做展现. 通过agent程序收集和push状态信息到服务器端, open-falcon已经支持很多监控项(CPU/Mem/JVM等)收集, 我们也可以自定义push指标,
主页: http://open-falcon.org/
http://book.open-falcon.org/zh/intro/index.html
自定义push数据: http://book.open-falcon.org/zh/usage/data-push.html
metrics的tag管理: https://book.open-falcon.org/zh_0_2/philosophy/tags-and-hostgroup.html
https://blog.csdn.net/puma_dong/article/details/51895063
===================
异常跟踪系统
===================
sentry, 专注于程序异常logging的分析系统, 提供多个编程语言接口(Java/C#/Python等).
https://docs.sentry.io/server/installation/
http://www.cnblogs.com/weaming/p/5158142.html
sentry raven-python 可以为 logging/logbook 提供handler.
===================
分布式配置管理平台
===================
携程开源的 apollo 系统是非常优秀的分布式配置管理系统, 支持prod/dev等多环境配置, 支持多系统. 官方已提供Java/C#客户端, 其他语言需要使用http协议访问配置平台.
https://github.com/ctripcorp/apollo
===================
大众点评的CAT系统
===================
http://www.infoq.com/cn/articles/distributed-real-time-monitoring-and-control-system
https://zhuanlan.zhihu.com/p/23351994
CAT系统, 后台系统的埋点分析工具, 埋点后可以在CAT系统中分析我们的后台系统, 典型的使用场景有:
1. 调用链分析, 分析一个完整调用链都包含哪些环节, 分析哪个环节耗时长
2. Event或Exception埋点, 用户分析一些特别的Event.
CAT埋点可以采用手动埋点方式, 也可以采用自动埋点(即使用官方log4j/logback/MyBatis的集成插件). 从功能上讲, CAT比Sentry系统更强大, Sentry重点是在exception分析上, 但CAT不足之处,在于仅支持Java语言.