本文的目的是列举一些常用的技术,然后讲解一下不同技术的特点,进而延展出来如何选型
HTML称为超文本标记语言,是一种标识性的语言,他主要的功能是定义文件的结构,通常和CSS以及JS一起使用。HTML定义了网页内容的含义和结构,这里需要强调一点,HTML、CSS和JS本身的目的并不相同,CSS描述一个网页的表现与展示效果,JavaScript描述功能与行为。
解决Web上存在的问题:
**Web浏览器间的兼容性低:**在一个浏览器中可以运行的HTML、Css、Javascript,在另一个浏览器中不能运行。
原因:各浏览器规范不统一,没有被标准化。
解决方案:使各浏览器的功能符合通用标准。
**文档结构不够明确:**HTML4中元素不能把文档结构表示清楚。
解决方案:增加与结构相关的元素。
Web应用程序的功能受到限制:HTMLL4对Web应用程序的贡献很小,比如:不允许同时上传多个文件。
解决方案:提供供Web应用程序使用的API。
内容类型不变
HTML5的文件扩展符(html或.htm)与内容类型(text/html)保持不变。
DOCTYPE声明变化
HTML4中需要指明是HTML的哪个版本,HTML5不需要,只使用即可。
指定字符编码变化
HTML4:
HTML5:
可以省略元素的标记
HTML5中很多元素标记可以省略
具有boolean值的属性调整
不指定属性值、属性名设定为属性值、字符串设为空时表示属性值为true;
不写该属性表示属性值为false。
例如:
表示checked值为true
表示checked值为true
表示checked值为true
表示checked值为false
可省略引号
HTML5可省略指定属性值时的引号。
新增元素
新增的结构元素
section:表示页面中内容块,比如章节、页眉、页脚或页面中的其他部分
article:表示页面中一块与上下文不相关的独立内容,比如博客中的一篇文章或报纸中的一篇文章。
aside:表示article内容之外,与article内容相关的辅助信息。
header:表示页面中的区域块,通常用它表示标题。
hgroup:用于对整个页面或页面中标题进行整合。
footer:表示页面中的区域块,通常表示区域快的脚部或底部,用于承载作者姓名、创作日期等与作者的元素。
nav:表示页面中导航部分。
figure:表示一段独立的流内容,一般表示主体流内容的一个独立单元。
新增的其他元素
video:定义电影片段、视频流等视频。
audio:定义音乐或音频流。
canvas:画布,本身没有行为,仅提供一块画布,但它的API展现给JavaScript及脚本,能够把想绘制的东西绘制在canvas上。
embed mark progress meter time ruby rt rp wbr command details detalist
datagrid keygen output source menu
新增的input元素的类型
email:表示必须输的email地址
url:表示文本框输入的一个地址
number:表示数字
range:表示数字范围值
DataPickers:表示日历的日期、时间
废除的元素
能使用css代替的元素
basefont big center font s tt u等
不再使用frame框架
由于frame框架对网页可用性存在负面影响,HTML5中已不支持frame框架,只支持iframe框架或者用服务器方式创建的由多个页面组成的复合页面的形式,同时将frameset元素、frame元素、noframes元素废除。
只有部分浏览器支持的元素
其他被废除的元素
新增的属性
表单相关的属性
链接相关的属性
其他属性
废除的属性
HTML5中新增全局属性的概念,全局属性指可以对任何元素都使用的属性。
contentEditable属性
允许用户编辑元素中内容,使用该属性的元素必须为可以获得鼠标焦点的元素,而且在点击鼠标后向用户提供一个插入符号,提示用户该元素允许进行编辑。
是boolean值类型,可以设为true、false或继承状态。其中,true代表可编辑,false代表不可编辑,当未指定true或false时与父元素的继承状态相同。
designMode属性
用来指定整个页面是否可编辑,当页面可编辑时,页面中所有支持contentEditable属性的元素都变为可编辑状况。designMode属性只能在JavaScript脚本中被修改、编辑。属性值可取on(可编辑)或off(不可编辑)。
hidden属性
HTML5中所有元素都允许使用hidden属性,该属性类似于input元素中hidden元素,boolean值,可设为true(不可见)、false(可见)。当某元素的hidden属性值为true时,浏览器不渲染该元素,使该元素处于不可见状态,但浏览器创建该元素内容,即页面加载后允许使用JavaScript脚本将该属性值取消,使该元素可见。
spellcheck属性
针对input(type=text)与textarea这两个文本输入框提供的一个新属性,主要对用户输入内容进行拼写与语法检查。属性值为boolean值,可取true或false。
tableindex属性
当点击Tab键时,让窗口或页面中可获得焦点的链接元素或表单元素进行遍历,tableindex表示该元素第几个被访问到。
若tableindex值为"-1"时表示无法获取该元素.
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
CSS描述一个网页的表现与展示效果,CSS的目的是为了网页丰富展示效果,和动态没关系,所有动态改变样式靠的是JS。
CSS1提供有关字体、颜色、位置和文本属性的基本信息,该版本已经得到了目前解析HTML和XML的浏览器的广泛支持。
但自从CSS1的版本之后,又在1998年5月发布了CSS2版本,样式单得到了更多的充实。
CSS2.0提供给我们了一个机制,让程序员开发时可以不考虑显示和界面就可以制作表单和界面,显示问题可由美工或是程序员后期再来编写相应的 CSS2.0样式来解决。
CSS2.0是一套全新的样式表结构,是由W3C推行的,同以往的CSS1.0或CSS1.2完全不一样,CSS2.0推荐的是一套内容和表现效果分离的方式,HTML元素可以通过CSS2.0的样式控制显示效果,可完全不使用以往HTML中的table和td来定位表单的外观和样式,只需使用div和 Li此类HTML标签来分割元素,之后即可通过CSS2.0样式来定义表单界面的外观。
CSS3语言开发是朝着模块化发展的。以前的规范作为一个模块实在是太庞大而且比较复杂,所以,把它分解为一些小的模块,更多新的模块也被加入进来。
简单来说就是css2有的属性css3都有,但是css3有的属性css2不一定有。 CSS3是最新的版本,效果上CSS2是比不了的,css3可以说是css2的进阶,因为css3是在css2的基础上增加了一些新的属性。比如定义圆角、背景颜色渐变、背景图片大小控制和定义多个背景图片等很多,这个是CSS2上没有的效果,现在新版本的浏览器基本都支持CSS3,比如IE9、FF4+、chrome11+,但是要用CSS3开发网站的话,要考虑的是还在用低版本浏览器的用户。
JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
JavaScript描述功能与行为,他主要赋予了动态改变网页的能力,Html本身并不能动态改变结构。由于原生JS实现某些功能或者界面效果过于复杂等一系列原因,所以后来出现了一大堆JS框架,比较有名的例如早先的JQUERY、DOJO等,现在的react、Vue、Angular。
ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。
ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念。
JavaScript 是大家所了解的语言名称,但是这个语言名称是商标( Oracle 公司注册的商标)。因此,JavaScript 的正式名称是 ECMAScript 。1996年11月,JavaScript 的创造者网景公司将 JS 提交给国际化标准组织 ECMA(European computer manufactures association,欧洲计算机制造联合会),希望这种语言能够成为国际标准,随后 ECMA 发布了规定浏览器脚本语言的标准,即 ECMAScript。这也有利于这门语言的开放和中立。
如果你打算构建一个大型应用程序,请选择React
如果你想要***的生态系统,请选择React
更适合大型应用和更好的可测试性Web端和移动端原生APP通吃更大的生态系统,更多的支持和好用的工具。
如果你喜欢用模板搭建应用(或者有这个想法),请选择Vue
如果你喜欢简单和“能用就行”的东西,请选择Vue
模板和渲染函数的弹性选择简单的语法和项目配置更快的渲染速度和更小的体积
现在的编程语言比较多,其实从基本功能角度讲,使用何种语言的区别只是语法区别,但是既然出现了多种语言,那么肯定有多种语言的出现的原因,下面就讲讲语言时如何发展的。
程序的出现主要是因为基础科学的发展,早期的操作人员是通过带有孔的纸带将程序输入电脑进行编译(对纸条打点),但是由于打点是一个比较痛苦的工作,而且效率低下,所以需要一种其他方式来解决这个问题。
二进制语言:
0000,0000,000000010000 代表 LOAD A, 16
0000,0001,000000000001 代表 LOAD B, 1
0001,0001,000000010000 代表 STORE B, 16
所以汇编语言出现了,汇编语言可以算是第一种编程语言。
了解和使用汇编语言有以下一些优点:
使用汇编语言的理由是:
汇编语言的缺点
汇编理论上是一种最应该学习的语言,因为只要汇编好没有什么写不了,但是由于汇编的开发难度与开发周期是明显不能满足现在工业化的应用,所以现有的软件基本都是采用更高级的语言进行开发。
其实编译器的主要思路就是高级语言编译出低级语言能识别的语法,然后运行。譬如C编译完成之后就是汇编的代码,JAVA是在C语言基础上进行开发,编程语言的逐层升高的主要目的,是减少一些通用的重复性工作,并提供一些可以通用的实现。
JAVA是现在很主流的一个编程语言,大部分项目都可以用JAVA来实现。
角度一:
优点:简单、安全、稳定、跨平台
缺点:需要运行环境、不适合开发桌面应用程序
应用:BS结构的ERP系统、金融系统、电子商务系统、网站等
几乎所有的银行系统和银行网站都是基于Java平台的,你可以访问看看。
角度二:
优势:
(1)一次编写,到处运行。
(2)系统的多平台支持。
(3)强大的可伸缩性。
(4)多样化和功能强大的开发工具支持。
劣势:
(1) 与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的增加了产品的复杂性。
(2) Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的。java文件和.class文件,以及对应的版本文件。
角度三:
1、跨平台性,虽然是很好的优势,可以让JAVA在任何的系统中运行,但是前提是该系统要安装JAVA虚拟机,这样导致一些JAVA编写的桌面程序无法在一般的用户(没有安装JAVA虚拟机的用户)上使用
2、JAVA的身后是SUN公司,提供及时的API更新,但是过多的版本导致JAVA的向下兼容性很差。而SUN公司在J2EE上的标准定义的并不是完美,导致在J2EE的开发中多数使用开源框架,开源框架是好东西,但是更新速度并不快。
3、都说面向对象的语言先进与面向过程,JAVA是OOP语言,但是它适合的是BS系统,在WEB项目中JAVA的实力毋庸置疑,但是转到了底层的程序却无法同C++抗衡。
4、个人认为JAVA的最大优点是开源,但是这往往也成了最大的缺陷了,无法定义一个好的标准使得开发时使用了框架,在新的程序员来到公司时必须先了解框架,延缓了开发的时间。
在实际使用的python入门简单,但要学会用python干活,需要再学习python各种库,pyhton的强大在于库,为什么python的库强大,原因是python的库可以用python,c语言,c++等设计,再提供给python使用,所以无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库在等着你用。而java没有python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码。python虚拟机因为编译性没有java的支持的好(或者说故意这么设计的),一般直接使用源码(linux),或源码简单打个包(如pyexe)。
python用途最多的是脚本,java用途最多的是web,pyhotn是胶水,可以把各类不相关的东西粘在一起用,java是基佬,可以通过软件工程组成几百个人的团队和你pk,商业化气息重。不过我认为还是python强大,因为可以方便调用c或c++的库,但软件工程和商业化运作没有java好,适合快捷开发。
如果你想写程序卖软件用java,可用上ibm服务器,上oracle数据库,上EMC存储,价格高,商业采购公司喜欢这种高大上。如果你要直接用程序生成金钱用python,python可以实现宽客金融,数据回测,炒股,炒期权,炒黄金,炒比特币,对冲套利,统计套利,有很多开源库,数据分析库,机器学习库可以参考。
对于移动互联网,python只能通过运行库运行于安卓或ios,java原生支持安卓开发,但不能用ios中。
对于大数据,hadoop用java开的, spark用Scala开发,用python调用spark再分析更方便。
Python的应用领域主要在游戏开发、搜索引擎、图形图像处理、脚本开发等。Java的应用领域主要是服务器开发,Web开发和安卓开发等。
Java 是高级语言(High-level programming language),Python 是非常高级语言(very-high-level language )。
一个完整的Python HelloWorld程序只要一行代码:
print(“Hello World”)
一个完整的Java HelloWorld需要几行代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World")
}
}
Python比Java简单,学习成本低,开发效率高
Java运行效率高于Python,尤其是纯Python开发的程序,效率极低
Java相关资料多,尤其是中文资料,Python国内的资料大多数情况无法满足需求,需要查找
Java版本比较稳定,Python2和3不兼容导致大量类库失效
Java开发偏向于软件工程,团队协同,Python更适合小型开发
Java偏向于商业开发,Python适合于数据分析
如果你把Java作为你的人生的第一门用心学习的语言,那么你只需要花极短的时间,就可以基本学会C++,JavaScript,PHP, Python,R,C#,Objective-C,Swift,Go(是的,每一门语言都可以在极短的时间学会,只是具体的问题解决和一些坑需要多积累一些实战经验而已)。但是反过来,如果你把Python作为你的第一门语言,问题就回到外国人使用筷子这件事情上了,答案不言而喻。
编程模型
函数式编程关心数据的映射,命令式编程关心解决问题的步骤
https://www.zhihu.com/question/28292740?sort=created
详细看看这个
相比较与Java,在下觉得Scala最主要的有以下两点优势:
FP泛型支持
如果用多了Spring中大量的template接口,你就会觉得FP其实还是蛮好用的。
而这仅仅是FP好处的冰山一角。
函数其实就是一个input -> output(scala也是这么表示一个函数的),没有任何副作用,与状态无关,由于这种特性,所以函数式的编程范式在分布式领域有很多好处
对于函数式编程,我的知识实在是皮毛,但可以这么说,FP相对与OO有哪些优势,Scala对于Java差不多就有哪些优势。
正因为FP有如此多的优势,所以Java8才引入了FP.从某种程度上来说,Java认可了Scala的做法。
类型系统支持
如果说Java是一种类型安全的语言,那么毫无疑问,Scala的类型更加安全,从某种程度上说,Scala的类型是图灵完备的,而Java不是。我的一位好朋友在这方面研究的比较深(http://hongjiang.info/scala/),而我对与Scala的类型系统的理解,也还是皮毛。
正是以上这两点大优势,造成了Scala比Java更加安全,同时又具备灵活性,想象力。
其他语言层面上的优势
在Java中,你是否有时很想继承多个AbstractClass呢?对不起,Java只支持单继承
在Scala中,你可以进行mixin(Java8也开始引入defaultmethod了呢)
在Java中,想要一个singleton?要么在staticblock中做,要么利用Enum的单例特性完成,或者其他更纠结的方法。
在Scala中,只要声明为object,即为单例。
在Java中,想要延迟加载一个单例?doublecheck吧
在Scala中,只要在object中将变量修饰为lazy即可
在Java中,想要对集合进行一些操作?使用一层一层的for循环吧
在Scala中,使用collection的一些集合操作,即可获得如写SQL般的享受。
在Java中,在并发中想对Future进行回调?对不起,Future不是Listenable(无法支持回调),除非你使用额外的工具(如guava,spring)
在Scala中,本来就主张异步编程,future和promise的配合让人非常愉快。
在Java中,要透明扩展一个第三方库的类怎么办?包装,再加一层。
在Scala中,有强大的implicit机制让你更优雅的做到这一点,同时还能保证类型安全(比起Ruby的monkeypatch,要安全得多)
Scala的表达力很强,相同功能的代码,用Java和Scala的行数不可同日而语。
这些单单是语言层面上的优势,除此之外,Scala还能无缝结合Java
尽管罗列了如此多的好处,但Scala有如下劣势:
语法复杂,学习曲线非常高
特点:
优点:
缺点:
不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;
只支持单核CPU,不能充分利用CPU
可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
原因:单进程,单线程
解决方案:
(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;
(2)开多个进程监听同一个端口,使用cluster模块;
开源组件库质量参差不齐,更新快,向下不兼容
Debug不方便,错误没有stack trace
高并发模型
我们所看到的node.js单线程只是一个js主线程,本质上的异步操作还是由线程池完成的,node将所有的阻塞操作都交给了内部的线程池去实现,本身只负责不断的往返调度,并没有进行真正的I/O操作,从而实现异步非阻塞I/O,这便是node单线程和事件驱动的精髓之处了。
GO语言的关键特性主要包括以下几方面:
其实我觉得主要是并发量确实高,性能有优势。
SOA(Service Oriented Architecture)“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。
微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。
微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想
微服务主要优势
SpringBoot和SpringCloud不是一个东西
1、SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化XML配置,内置HTTP服务器(Tomcat,Jetty),最终以Java应用程序进行执行。
2、SpringCloud: 是一套目前完整的微服务框架,它是是一系列框架的有序集合。它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。
Spring Cloud 使用 HTTP 协议的 REST API。
服务提供方和服务消费方通过 Json 方式交互,因此只需要定义好相关 Json 字段即可,消费方和提供方无接口依赖。通过注解方式来实现服务配置,对于程序有一定入侵。
Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件,服务治理只是其中的一个方面。
Dubbo 提供了各种 Filter,对于上述中“无”的要素,可以通过扩展 Filter 来完善。例如:
Dubbo 支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜 Spring Cloud,如果对于系统的响应时间有严格要求,长链接更合适。
服务提供方与消费方通过接口的方式依赖,服务调用设计如下:
通过 maven 的 install & deploy 命令把 Interface 和 Model 层发布到仓库中,服务调用方只需要依赖 Interface 和 Model 层即可。
在开发调试阶段只发布 Snapshot 版本,等到服务调试完成再发布 Release 版本,通过版本号来区分每次迭代的版本。通过 xml 配置方式即可接入 Dubbo,对程序无入侵。
点评:Dubbo 服务依赖略重,需要有完善的版本管理机制,但是程序入侵少。
而 Spring Cloud 通过 Json 交互,省略了版本管理的问题,但是具体字段含义需要统一管理,自身 Rest API 方式交互,为跨平台调用奠定了基础。
Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。 [1]
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
数据库选型的基本原则是,没有最好的只有最合适的。每种数据库都有其自身的优势,也都有其天然的劣势,大多数时候我们应该选择用的人比较多的数据库,这样碰见一些意外问题的时候可以有办法解决。其次可以参考以下几个因素。
大部分的用户基数大的数据库应该都能满足,所以这个
优点:
缺点:
优点:
缺点:
何时使用 ?
分布式操作:
当你需要的比SQLite可以提供的更多时,把MySQL包括进你的部署栈,就像任何一个独立的数据库服务器,会带来大量的操作自由和一些先进的功能。
高安全性:
MySQL的安全功能,用一种简单的方式为数据访问(和使用)提供了可靠的保护。
Web网站 和 Web应用:
绝大多数的网站(和Web应用程序)可以忽视约束性地简单工作在MySQL上。这种灵活的和可扩展的工具是易于使用和易于管理的——这被证明非常有助于长期运行。
定制解决方案:
如果你工作在一个高度量身定制的解决方案上,MySQL能够很容易地尾随和执行你的规则,这要感谢其丰富的配置设置和操作模式。
何时不用 ?
SQL 服从性:
因为 MySQL 没有[想要]实现 SQL 的全部标准,所以这个工具不完全符合SQL。如果你需要对这样的关系数据库管理系统进行整合,从MySQL进行切换是不容易的。
并发:
即使MySQL和一些存储引擎能够真地很好执行读取操作,但并发读写还是有问题的。
缺乏特色:
再次提及,根据数据库引擎的选择标准,MySQL会缺乏一定的特性,如全文搜索。
PostgreSQL是一个自由的对象-关系数据库服务器(数据库管理系统),支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL。
优点
PostgreSQL 是一个开源的,免费的,同时非常强大的关系型数据管理系统。
PostgreSQL 背后有热忱而经验丰富的社区,可以通过知识库和问答网站获取支持,全天候免费。
即使其本身功能十分强大,PostgreSQL 仍附带有许多强大的开源第三方工具来辅助系统的设计、管理和使用。
可以用预先存储的流程来程序性扩展 PostgreSQL ,一个高级的关系型数据库理应如此。
PostgreSQL 不只是一个关系型数据库,还是一个面向对象数据库——支持嵌套,及一些其他功能。
缺点
对于简单而繁重的读取操作, 超过了 PostgreSQL 的杀伤力,可能会出现比同行(如MySQL)更低的性能。
按给出的该工具的性质,从普及度来说它还缺乏足够后台支撑,尽管有大量的部署——这可能会影响能够获得支持的容易程度。
何时使用?
数据完整性:
当可靠性和数据完整性是绝对必要而无需理由时,PostgreSQL是更好的选择。
复杂的自定义过程:
如果你需要你的数据库执行自定义过程,可扩展的PostgreSQL是更好的选择。
整合:
在将来,如果可能要把整个数据库系统迁移到另一个适当的解决方案(例如Oracle)中,PostgreSQL对于这种切换将是最兼容和易于操作的。
复杂的设计:
相比其他的开源和免费的 RDBMS(关系数据库管理系统)实现来说,对于复杂的数据库设计,PostgreSQL提供了大部分的功能和可能性,同时并没放弃其他有价值的地方。
何时不用?
速度:
如果你需要的只是快速的读取操作, PostgreSQL 不是为此而准备的工具。
简化体制:
除非你需要绝对的数据完整性,原子性,一致性,隔离性,耐久性,或复杂的设计,PostgreSQL 对简化体制来说是杀手。
复制:
除非你愿意花不少时间,精力和资源,否则对于那些缺乏数据库和系统管理经验的人来说,实现与MySQL的(主从)复制可能不容易。
Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
命名服务
这个似乎最简单,在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现,不见不散了。
配置管理
程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。好吧,现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。
集群管理
所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。新机器加入 也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了。
分布式锁
有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
队列管理
两种类型的队列:
1、 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
2、队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。
Hadoop是适合于大数据的分布式存储和处理平台,是一种开源的框架。这里加黑的字我认为是很重要的部分,Hadoop提供了两种功能,一个存储、一个计算。很多组件与hadoop整合其实是利用hadoop的一部分特性或者是替换hadoop的一部分特性,又或者是优化了其中一部分特性。
Hadoop实现MapReduce的缺点是因为他暴力的实现了MapReduce的设计思路,是一种面向过程的设计,我想得到结果,应该怎么做的思路。
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
由上文可以看书,Spark是个计算模型,他只实现了Hadoop的部分功能,即计算功能。为什么要替换Hadoop的计算功能呢,就是因为Hadoop的MapReduce模型效率太低,他每一步都需要将结果落地放到磁盘上,虽然这样是有优势的,例如容错性,稳定性等等,但是对于现在时效性要求越来越高的系统来说,显然是不达标的。
其实除了Spark对一些算法本身进行的优化之外,他的最大优势就是所有数据在没有必要的情况下,完全都是基于内存进行计算的,除了明确指示,不会有任何基于磁盘的操作,而我们都知道,磁盘的效率是远远低于内存的,这个是我们使用Spark的根本原因。
Apache Hive™数据仓库软件便于读取、写入和管理存储在分布式存储中的大型数据集,并使用SQL语法进行查询。
Hive 构建于Apache Hadoop™之上,提供以下功能:
Hive将外部的任务解析成一个MapReduce可执行计划,而启动MapReduce是一个高延迟的一件事,每次提交任务和执行任务都需要消耗很多时间,这也就决定Hive只能处理一些高延迟的应用(如果你想处理低延迟的应用,可以考虑一下Hbase)。
SparkSQL的前身是Shark,给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,hive应运而生,它是当时唯一运行在Hadoop上的SQL-on-hadoop工具。但是MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率,为了提高SQL-on-Hadoop的效率,Shark应运而生,但又因为Shark对于Hive的太多依赖(如采用Hive的语法解析器、查询优化器等等),2014年spark团队停止对Shark的开发,将所有资源放SparkSQL项目上
apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。
比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图. 这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析.而Flume正是帮我们做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于次,不过不一定是使用FLume,毕竟优秀的产品很多,比如facebook的Scribe,还有Apache新出的另一个明星项目chukwa,还有淘宝Time Tunnel。
Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。
对于像 Hadoop 一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka 的目的是通过 Hadoop 的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
kafka 和 flume 都是日志系统,kafka 是分布式消息中间件,自带存储,提供 push 和 pull 存取数据功能。flume 分为 agent(数据采集器),collector(数据简单处理和写入),storage(存储器)三部分,每一部分都是可以定制的。比如 agent 采用 RPC(Thrift-RPC)、text(文件)等,storage 指定用 hdfs 做。
kafka 做日志缓存应该是更为合适的,但是 flume 的数据采集部分做的很好,可以定制很多数据源,减少开发量。所以比较流行 flume+kafka 模式,如果为了利用 flume 写 hdfs 的能力,也可以采用 kafka+flume 的方式。
采集层 主要可以使用 Flume, Kafka 两种技术。
Flume:Flume 是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展 API.
Kafka:Kafka 是一个可持久化的分布式的消息队列。
Kafka 是一个非常通用的系统。你可以有许多生产者和很多的消费者共享多个主题 Topics。相比之下,Flume 是一个专用工具被设计为旨在往 HDFS,HBase 发送数据。它对 HDFS 有特殊的优化,并且集成了 Hadoop 的安全特性。所以,Cloudera 建议如果数据被多个系统消费的话,使用 kafka;如果数据被设计给 Hadoop 使用,使用 Flume。
正如你们所知 Flume 内置很多的 source 和 sink 组件。然而,Kafka 明显有一个更小的生产消费者生态系统,并且 Kafka 的社区支持不好。希望将来这种情况会得到改善,但是目前:使用 Kafka 意味着你准备好了编写你自己的生产者和消费者代码。如果已经存在的 Flume Sources 和 Sinks 满足你的需求,并且你更喜欢不需要任何开发的系统,请使用 Flume。
Flume 可以使用拦截器实时处理数据。这些对数据屏蔽或者过量是很有用的。Kafka 需要外部的流处理系统才能做到。
Kafka 和 Flume 都是可靠的系统,通过适当的配置能保证零数据丢失。然而,Flume 不支持副本事件。于是,如果 Flume 代理的一个节点崩溃了,即使使用了可靠的文件管道方式,你也将丢失这些事件直到你恢复这些磁盘。如果你需要一个高可靠行的管道,那么使用 Kafka 是个更好的选择。
Flume 和 Kafka 可以很好地结合起来使用。如果你的设计需要从 Kafka 到 Hadoop 的流数据,使用 Flume 代理并配置 Kafka 的 Source 读取数据也是可行的:你没有必要实现自己的消费者。你可以直接利用 Flume 与 HDFS 及 HBase 的结合的所有好处。你可以使用 Cloudera Manager 对消费者的监控,并且你甚至可以添加拦截器进行一些流处理。
Flume 和 Kafka 可以结合起来使用。通常会使用 Flume + Kafka 的方式。其实如果为了利用 Flume 已有的写 HDFS 功能,也可以使用 Kafka + Flume 的方式。
Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务:
DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。
从这里可以看出flink只提供了Spark中的SparkStreaming的类似功能,但是flink的性能更好
我们当时的目标就是要设计一款低延迟、exactly once、流和批统一的,能够支撑足够大体量的复杂计算的引擎。
Spark streaming: 的本质还是一款基于 microbatch 计算的引擎。这种引擎一个天生的缺点就是每个 microbatch 的调度开销比较大,当我们要求越低的延迟时,额外的开销就越大。这就导致了 spark streaming 实际上不是特别适合于做秒级甚至亚秒级的计算。
Kafka streaming: 是从一个日志系统做起来的,它的设计目标是足够轻量,足够简洁易用。这一点很难满足我们对大体量的复杂计算的需求。
Storm: 是一个没有批处理能力的数据流处理器,除此之外 Storm 只提供了非常底层的 API,用户需要自己实现很多复杂的逻辑。另外,Storm 在当时不支持 exactly once。种种原因,Storm 也无法满足我们的需求。
最后,我们发现了 Flink,并且惊喜地发现它几乎完美满足了我们所有的需求:
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。
redis是一个以key-value存储的数据库结构型服务器,它支持的数据结构类型包括:字符串(String)、链表(lists)、哈希表(hash)、集合(set)、有序集合(Zset)等。为了保证读取的效率,redis把数据对象都存储在内存当中,它可以支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。
MongoDB 是一种面向文档的数据库管理系统,用 C++等语言撰写而成,以此来解决应用程序开发社区中的大量现实问题。2007 年 10 月,MongoDB 由 10gen 团队所发展。2009 年 2 月首度推出。
MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。
{
username:'123',
password:'123'
}
使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。
易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。
数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。
内存管理机制
Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
支持的数据结构
Redis 支持的数据结构丰富,包括hash、set、list等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
数据量和性能:
当物理内存够用的时候,redis>mongodb>mysql
当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。
实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。
mongodb还是能够保证性能。
性能
mongodb依赖内存,TPS较高;Redis依赖内存,TPS非常高。性能上Redis优于MongoDB。
可靠性
mongodb从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性;
Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能。
可靠性上MongoDB优于Redis。
数据分析
mongodb内置数据分析功能(mapreduce);而Redis不支持。
事务支持情况
Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;mongodb不支持事务。
集群
MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。
Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 是用 Java 开发的,并在 Apache 许可证下作为开源软件发布。
Elasticsearch 是与名为 Logstash 的数据收集和日志解析引擎以及名为 Kibana 的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
Elasticsearch 可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch 是分布式的,这意味着索引可以被分成分片,每个分片可以有 0 个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
场景和目标
相同点
不同点
总结