常用技术总结与选型

谁都会走 提交于 2019-12-24 18:04:13

本文的目的是列举一些常用的技术,然后讲解一下不同技术的特点,进而延展出来如何选型

前端

界面展示

HTML

HTML称为超文本标记语言,是一种标识性的语言,他主要的功能是定义文件的结构,通常和CSS以及JS一起使用。HTML定义了网页内容的含义和结构,这里需要强调一点,HTML、CSS和JS本身的目的并不相同,CSS描述一个网页的表现与展示效果,JavaScript描述功能与行为。

HTML5

1 HTML5推出的理由

解决Web上存在的问题:

**Web浏览器间的兼容性低:**在一个浏览器中可以运行的HTML、Css、Javascript,在另一个浏览器中不能运行。

原因:各浏览器规范不统一,没有被标准化。

解决方案:使各浏览器的功能符合通用标准。

**文档结构不够明确:**HTML4中元素不能把文档结构表示清楚。

解决方案:增加与结构相关的元素。

Web应用程序的功能受到限制:HTMLL4对Web应用程序的贡献很小,比如:不允许同时上传多个文件。

解决方案:提供供Web应用程序使用的API。

2 HTML5语法的改变

内容类型不变

HTML5的文件扩展符(html或.htm)与内容类型(text/html)保持不变。

DOCTYPE声明变化

HTML4中需要指明是HTML的哪个版本,HTML5不需要,只使用即可。

指定字符编码变化

HTML4:<meta http-equiv="content-type" content="text/html; charset=UTF-8">
HTML5:<meta charset="UTF-8">

可以省略元素的标记

HTML5中很多元素标记可以省略

具有boolean值的属性调整

不指定属性值、属性名设定为属性值、字符串设为空时表示属性值为true;

不写该属性表示属性值为false。

例如:

<input type=‶checkbox″ checked>                          表示checked值为true
<input type=‶checkbox″ checked=‶checked″>          表示checked值为true
<input type=‶checkbox″ checked=‶″>                      表示checked值为true
<input type=‶checkbox″>                                       表示checked值为false

可省略引号

HTML5可省略指定属性值时的引号。

3 新增的元素和废除的元素

新增元素

新增的结构元素

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元素废除。

只有部分浏览器支持的元素

其他被废除的元素

4 新增的属性和废除的属性

新增的属性

表单相关的属性

链接相关的属性

其他属性

废除的属性

5 全局属性

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"时表示无法获取该元素.

CSS

层叠样式表(英文全称: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

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
JavaScript描述功能与行为,他主要赋予了动态改变网页的能力,Html本身并不能动态改变结构。由于原生JS实现某些功能或者界面效果过于复杂等一系列原因,所以后来出现了一大堆JS框架,比较有名的例如早先的JQUERY、DOJO等,现在的react、Vue、Angular。

es等相关知识

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
如果你想要***的生态系统,请选择React
更适合大型应用和更好的可测试性Web端和移动端原生APP通吃更大的生态系统,更多的支持和好用的工具。

Vue

如果你喜欢用模板搭建应用(或者有这个想法),请选择Vue
如果你喜欢简单和“能用就行”的东西,请选择Vue
模板和渲染函数的弹性选择简单的语法和项目配置更快的渲染速度和更小的体积

Angular

服务端

语言

现在的编程语言比较多,其实从基本功能角度讲,使用何种语言的区别只是语法区别,但是既然出现了多种语言,那么肯定有多种语言的出现的原因,下面就讲讲语言时如何发展的。
程序的出现主要是因为基础科学的发展,早期的操作人员是通过带有孔的纸带将程序输入电脑进行编译(对纸条打点),但是由于打点是一个比较痛苦的工作,而且效率低下,所以需要一种其他方式来解决这个问题。
二进制语言:

0000,0000,000000010000 代表 LOAD A, 16

0000,0001,000000000001 代表 LOAD B, 1

0001,0001,000000010000 代表 STORE B, 16

所以汇编语言出现了,汇编语言可以算是第一种编程语言。

汇编语言

了解和使用汇编语言有以下一些优点:

  • 说明程序是如何与操作系统、处理器和BIOS接口的;
  • 说明数据是如何表示并存储在存储器与外部设备上的;
  • 阐述处理器是如何访问与执行指令的,以及指令是如何访问与处理数据的;
  • 阐述程序是如何访问外部设备的。

使用汇编语言的理由是:

  • 能够直接访问与硬件相关的存储器或I/O端口;
  • 能够不受编译器的限制,对生成的二进制代码进行完全的控制;
  • 能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
  • 能够根据特定的应用对代码做最佳的优化,提高运行速度;
  • 能够最大限度地发挥硬件的功能;
  • 用汇编语言编写的程序比用高级语言编写的程序所要求的存储空间与执行时间将显著减少;
  • 汇编语言使程序员可以完成技术性非常强的任务;而使用高级语言,即使可能做到,恐怕也会非常困难;
  • 虽然大多数软件专家是用高级语言开发新的应用软件的(那样做,程序会比较容易编写的维护),但是对于执行时间要求比较苛刻的部分,常常还要用汇编语言来重新编写;
  • 常驻程序(当其他程序运行的时候,常驻在存储器中的程序)和中断服务例行程序(处理输入与输出的程序)几乎都是用汇编语言开发的。

汇编语言的缺点

  • 编写的代码非常难懂,不好维护;
  • 很容易产生Bug,难于调试;
  • 只能针对特定的体系结构和处理器进行优化;
  • 开发效率很低,时间长且单调。
  • 我认为最重要的一点,无法编写大型程序

汇编理论上是一种最应该学习的语言,因为只要汇编好没有什么写不了,但是由于汇编的开发难度与开发周期是明显不能满足现在工业化的应用,所以现有的软件基本都是采用更高级的语言进行开发。

编译原理

其实编译器的主要思路就是高级语言编译出低级语言能识别的语法,然后运行。譬如C编译完成之后就是汇编的代码,JAVA是在C语言基础上进行开发,编程语言的逐层升高的主要目的,是减少一些通用的重复性工作,并提供一些可以通用的实现。

JAVA

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

  1. 在实际使用的python入门简单,但要学会用python干活,需要再学习python各种库,pyhton的强大在于库,为什么python的库强大,原因是python的库可以用python,c语言,c++等设计,再提供给python使用,所以无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库在等着你用。而java没有python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码。python虚拟机因为编译性没有java的支持的好(或者说故意这么设计的),一般直接使用源码(linux),或源码简单打个包(如pyexe)。

  2. python用途最多的是脚本,java用途最多的是web,pyhotn是胶水,可以把各类不相关的东西粘在一起用,java是基佬,可以通过软件工程组成几百个人的团队和你pk,商业化气息重。不过我认为还是python强大,因为可以方便调用c或c++的库,但软件工程和商业化运作没有java好,适合快捷开发。

  3. 如果你想写程序卖软件用java,可用上ibm服务器,上oracle数据库,上EMC存储,价格高,商业采购公司喜欢这种高大上。如果你要直接用程序生成金钱用python,python可以实现宽客金融,数据回测,炒股,炒期权,炒黄金,炒比特币,对冲套利,统计套利,有很多开源库,数据分析库,机器学习库可以参考。

  4. 对于移动互联网,python只能通过运行库运行于安卓或ios,java原生支持安卓开发,但不能用ios中。

  5. 对于大数据,hadoop用java开的, spark用Scala开发,用python调用spark再分析更方便。

  6. Python的应用领域主要在游戏开发、搜索引擎、图形图像处理、脚本开发等。Java的应用领域主要是服务器开发,Web开发和安卓开发等。

  7. Java 是高级语言(High-level programming language),Python 是非常高级语言(very-high-level language )。

  8. 一个完整的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适合于数据分析

  9. 如果你把Java作为你的人生的第一门用心学习的语言,那么你只需要花极短的时间,就可以基本学会C++,JavaScript,PHP, Python,R,C#,Objective-C,Swift,Go(是的,每一门语言都可以在极短的时间学会,只是具体的问题解决和一些坑需要多积累一些实战经验而已)。但是反过来,如果你把Python作为你的第一门语言,问题就回到外国人使用筷子这件事情上了,答案不言而喻。

scala

编程模型

函数式编程关心数据的映射,命令式编程关心解决问题的步骤
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有如下劣势:

语法复杂,学习曲线非常高

NodeJS

特点:

  1. 它是一个Javascript运行环境
  2. 依赖于Chrome V8引擎进行代码解释
  3. 事件驱动
  4. 非阻塞I/O
  5. 轻量、可伸缩,适于实时数据交互应用
  6. 单进程,单线程

优点:

  1. 高并发(最重要的优点)
  2. 适合I/O密集型应用

缺点:

  1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;

    解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;

  2. 只支持单核CPU,不能充分利用CPU

  3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

    原因:单进程,单线程

    解决方案:
    (1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;

    (2)开多个进程监听同一个端口,使用cluster模块;

  4. 开源组件库质量参差不齐,更新快,向下不兼容

  5. Debug不方便,错误没有stack trace

高并发模型

我们所看到的node.js单线程只是一个js主线程,本质上的异步操作还是由线程池完成的,node将所有的阻塞操作都交给了内部的线程池去实现,本身只负责不断的往返调度,并没有进行真正的I/O操作,从而实现异步非阻塞I/O,这便是node单线程和事件驱动的精髓之处了。

  1. 每个Node.js进程只有一个主线程在执行程序代码,形成一个执行栈(execution context stack)。
  2. 主线程之外,还维护了一个"事件队列"(Event queue)。当用户的网络请求或者其它的异步操作到来时,node都会把它放到Event Queue之中,此时并不会立即执行它,代码也不会被阻塞,继续往下走,直到主线程代码执行完毕。
  3. 主线程代码执行完毕完成后,然后通过Event Loop,也就是事件循环机制,开始到Event Queue的开头取出第一个事件,从线程池中分配一个线程去执行这个事件,接下来继续取出第二个事件,再从线程池中分配一个线程去执行,然后第三个,第四个。主线程不断的检查事件队列中是否有未执行的事件,直到事件队列中所有事件都执行完了,此后每当有新的事件加入到事件队列中,都会通知主线程按顺序取出交EventLoop处理。当有事件执行完毕后,会通知主线程,主线程执行回调,线程归还给线程池。
  4. 主线程不断重复上面的第三步。

GO

GO语言的关键特性主要包括以下几方面:

  • 并发与协程
  • 基于消息传递的通信方式
  • 丰富实用的内置数据类型
  • 函数多返回值
  • defer机制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 编程规范

其实我觉得主要是并发量确实高,性能有优势。

Ruby

Perl

常用技术

SOA

  1. SOA(Service Oriented Architecture)“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。

  2. 微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。

    微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想

微服务主要优势

  • 降低复杂度
  • 可独立部署
  • 容错
  • 扩展
  • 核心部件

SpringBoot和SpringCloud

SpringBoot和SpringCloud不是一个东西

1、SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化XML配置,内置HTTP服务器(Tomcat,Jetty),最终以Java应用程序进行执行。

2、SpringCloud: 是一套目前完整的微服务框架,它是是一系列框架的有序集合。它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。

SpringCloud 核心部件

  • Service Provider: 暴露服务的提供方。
  • Service Consumer:调用远程服务的服务消费方。
  • EureKa Server: 服务注册中心和服务发现中心。

SpringCloud 通讯协议

Spring Cloud 使用 HTTP 协议的 REST API。

SpringCloud 服务依赖方式

服务提供方和服务消费方通过 Json 方式交互,因此只需要定义好相关 Json 字段即可,消费方和提供方无接口依赖。通过注解方式来实现服务配置,对于程序有一定入侵。

Dubbo

Dubbo 核心部件

  • Provider:暴露服务的提供方,可以通过 jar 或者容器的方式启动服务。
  • Consumer:调用远程服务的服务消费方。
  • Registry:服务注册中心和发现中心。
  • Monitor:统计服务和调用次数,调用时间监控中心。(Dubbo 的控制台页面中可以显示,目前只有一个简单版本。)
  • Container:服务运行的容器。

Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件,服务治理只是其中的一个方面。

Dubbo 提供了各种 Filter,对于上述中“无”的要素,可以通过扩展 Filter 来完善。例如:

  • 分布式配置:可以使用淘宝的 diamond、百度的 disconf 来实现分布式配置管理。
  • 服务跟踪:可以使用京东开源的 Hydra,或者扩展 Filter 用 Zippin 来做服务跟踪。
  • 批量任务:可以使用当当开源的 Elastic-Job、tbschedule。
    点评:从核心要素来看,Spring Cloud 更胜一筹,在开发过程中只要整合 Spring Cloud 的子项目就可以顺利的完成各种组件的融合,而 Dubbo 却需要通过实现各种 Filter 来做定制,开发成本以及技术难度略高。

Dubbo 通讯协议

  • Dubbo:Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
  • RMI:RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。
  • Hessian:Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
  • HTTP:采用 Spring 的 Http Invoker 实现。
  • Webservice:基于 CXF 的 frontend-simple 和 transports-http 实现。

性能

Dubbo 支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜 Spring Cloud,如果对于系统的响应时间有严格要求,长链接更合适。

Dubbo 服务依赖方式

服务提供方与消费方通过接口的方式依赖,服务调用设计如下:

  • Interface 层:服务接口层,定义了服务对外提供的所有接口。
  • Molel 层:服务的 DTO 对象层。
  • Business层:业务实现层,实现 Interface 接口并且和 DB 交互。
    因此需要为每个微服务定义各自的 Interface 接口,并通过持续集成发布到私有仓库中。调用方应用对微服务提供的抽象接口存在强依赖关系,开发、测试、集成环境都需要严格的管理版本依赖。

通过 maven 的 install & deploy 命令把 Interface 和 Model 层发布到仓库中,服务调用方只需要依赖 Interface 和 Model 层即可。

在开发调试阶段只发布 Snapshot 版本,等到服务调试完成再发布 Release 版本,通过版本号来区分每次迭代的版本。通过 xml 配置方式即可接入 Dubbo,对程序无入侵。

点评:Dubbo 服务依赖略重,需要有完善的版本管理机制,但是程序入侵少。

而 Spring Cloud 通过 Json 交互,省略了版本管理的问题,但是具体字段含义需要统一管理,自身 Rest API 方式交互,为跨平台调用奠定了基础。

WebService

Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。 [1]
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

数据库

数据库选型的基本原则是,没有最好的只有最合适的。每种数据库都有其自身的优势,也都有其天然的劣势,大多数时候我们应该选择用的人比较多的数据库,这样碰见一些意外问题的时候可以有办法解决。其次可以参考以下几个因素。

  1. 稳定可靠(High-Availability)
  2. 可扩展(High-Scalability)
  3. 安全性(Security)
  4. 丰富的开发工具
  5. 服务质量

大部分的用户基数大的数据库应该都能满足,所以这个

关系型数据库

Mysql

优点:

  • 体积小、速度快、总体拥有成本低,开源;
  • 支持多种操作系统;
  • 是开源数据库,提供的接口支持多种语言连接操作
  • mysql的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的MySql能很容易充分利用CPU;
  • MySql有一个非常灵活而且安全的权限和口令系统。当客户与MySql服务器连接时,他们之间所有的口令传送被加密,而且MySql支持主机认证;
  • 支持ODBC for Windows, 支持所有的ODBC 2.5函数和其他许多函数, 可以用Access连接MySql服务器, 使得应用被扩展;
  • 支持大型的数据库, 可以方便地支持上千万条记录的数据库。作为一个开放源代码的数据库,可以针对不同的应用进行相应的修改。
  • 拥有一个非常快速而且稳定的基于线程的内存分配系统,可以持续使用面不必担心其稳定性;
  • MySQL同时提供高度多样性,能够提供很多不同的使用者介面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言介面,例如C+,Perl,Java,PHP,以及Python。你可以使用事先包装好的客户端,或者干脆自己写一个合适的应用程序。MySQL可用于Unix,Windows,以及OS/2等平台,因此它可以用在个人电脑或者是服务器上;

缺点:

  • 不支持热备份;
  • MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变;
  • MySQL的价格随平台和安装方式变化。Linux的MySQL如果由用户自己或系统管理员而不是第三方安装则是免费的,第三方案则必须付许可费。Unix或linux 自行安装 免费 、Unix或Linux 第三方安装 收费;

Oracle

优点:

  • 体积小、速度快、总体拥有成本低,开源,提供的接口支持多种语言连接操作。
  • 支持多种操作系统。
  • MySQL 的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的MySQL 能很容易充分利用CPU。
  • MySQL 有一个非常灵活而且安全的权限和口令系统。当客户与MySQL 服务器连接时,他们之间所有的口令传送被加密,而且MySQL 支持主机认证。
  • MySQL 能够提供很多不同的使用者界面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言界面,例如 C++,Perl,Java,PHP,以及Python。你可以使用事先包装好的客户端,或者干脆自己写一个合适的应用程序。MySQL可用于 Unix,Windows,以及OS/2等平台,因此它可以用在个人电脑或者是服务器上。

缺点:

  • 不支持热备份。
  • MySQL不支持自定义数据类型
  • MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变。
  • MySQL对存储过程和触发器支持不够良好。
  • 尽管 MySQL 理论上仍是开源产品,也有人抱怨它诞生之后更新缓慢。然而,应该注意到有一些基于 MySQL 并完整集成的数据库(如 MariaDB),在标准的 MySQL 基础上带来了额外价值。
  • MySQL对XML支持不够良好

何时使用 ?

  1. 分布式操作:

    当你需要的比SQLite可以提供的更多时,把MySQL包括进你的部署栈,就像任何一个独立的数据库服务器,会带来大量的操作自由和一些先进的功能。

  2. 高安全性:

    MySQL的安全功能,用一种简单的方式为数据访问(和使用)提供了可靠的保护。

  3. Web网站 和 Web应用:

    绝大多数的网站(和Web应用程序)可以忽视约束性地简单工作在MySQL上。这种灵活的和可扩展的工具是易于使用和易于管理的——这被证明非常有助于长期运行。

  4. 定制解决方案:

    如果你工作在一个高度量身定制的解决方案上,MySQL能够很容易地尾随和执行你的规则,这要感谢其丰富的配置设置和操作模式。

何时不用 ?

  1. SQL 服从性:

    因为 MySQL 没有[想要]实现 SQL 的全部标准,所以这个工具不完全符合SQL。如果你需要对这样的关系数据库管理系统进行整合,从MySQL进行切换是不容易的。

  2. 并发:

    即使MySQL和一些存储引擎能够真地很好执行读取操作,但并发读写还是有问题的。

  3. 缺乏特色:

    再次提及,根据数据库引擎的选择标准,MySQL会缺乏一定的特性,如全文搜索。

PostgreSQL

PostgreSQL是一个自由的对象-关系数据库服务器(数据库管理系统),支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL。

优点

  1. PostgreSQL 是一个开源的,免费的,同时非常强大的关系型数据管理系统。

  2. PostgreSQL 背后有热忱而经验丰富的社区,可以通过知识库和问答网站获取支持,全天候免费。

  3. 即使其本身功能十分强大,PostgreSQL 仍附带有许多强大的开源第三方工具来辅助系统的设计、管理和使用。

  4. 可以用预先存储的流程来程序性扩展 PostgreSQL ,一个高级的关系型数据库理应如此。

  5. PostgreSQL 不只是一个关系型数据库,还是一个面向对象数据库——支持嵌套,及一些其他功能。

缺点

  1. 对于简单而繁重的读取操作, 超过了 PostgreSQL 的杀伤力,可能会出现比同行(如MySQL)更低的性能。

  2. 按给出的该工具的性质,从普及度来说它还缺乏足够后台支撑,尽管有大量的部署——这可能会影响能够获得支持的容易程度。

何时使用?

  1. 数据完整性:

    当可靠性和数据完整性是绝对必要而无需理由时,PostgreSQL是更好的选择。

  2. 复杂的自定义过程:

    如果你需要你的数据库执行自定义过程,可扩展的PostgreSQL是更好的选择。

  3. 整合:

    在将来,如果可能要把整个数据库系统迁移到另一个适当的解决方案(例如Oracle)中,PostgreSQL对于这种切换将是最兼容和易于操作的。

  4. 复杂的设计:

    相比其他的开源和免费的 RDBMS(关系数据库管理系统)实现来说,对于复杂的数据库设计,PostgreSQL提供了大部分的功能和可能性,同时并没放弃其他有价值的地方。

何时不用?

  1. 速度:

    如果你需要的只是快速的读取操作, PostgreSQL 不是为此而准备的工具。

  2. 简化体制:

    除非你需要绝对的数据完整性,原子性,一致性,隔离性,耐久性,或复杂的设计,PostgreSQL 对简化体制来说是杀手。

  3. 复制:

    除非你愿意花不少时间,精力和资源,否则对于那些缺乏数据库和系统管理经验的人来说,实现与MySQL的(主从)复制可能不容易。

大数据处理相关技术

zookeeper

Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

  1. 命名服务
    这个似乎最简单,在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现,不见不散了。

  2. 配置管理
    程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。好吧,现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。

  3. 集群管理
    所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
    对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。新机器加入 也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了。

  4. 分布式锁
    有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

  5. 队列管理
    两种类型的队列:
    1、 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
    2、队列按照 FIFO 方式进行入队和出队操作。
    第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
    第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。

hadoop

Hadoop是适合于大数据的分布式存储处理平台,是一种开源的框架。这里加黑的字我认为是很重要的部分,Hadoop提供了两种功能,一个存储、一个计算。很多组件与hadoop整合其实是利用hadoop的一部分特性或者是替换hadoop的一部分特性,又或者是优化了其中一部分特性。
Hadoop实现MapReduce的缺点是因为他暴力的实现了MapReduce的设计思路,是一种面向过程的设计,我想得到结果,应该怎么做的思路。

spark

Spark是什么?

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

为什么要用Spark?

由上文可以看书,Spark是个计算模型,他只实现了Hadoop的部分功能,即计算功能。为什么要替换Hadoop的计算功能呢,就是因为Hadoop的MapReduce模型效率太低,他每一步都需要将结果落地放到磁盘上,虽然这样是有优势的,例如容错性,稳定性等等,但是对于现在时效性要求越来越高的系统来说,显然是不达标的。
其实除了Spark对一些算法本身进行的优化之外,他的最大优势就是所有数据在没有必要的情况下,完全都是基于内存进行计算的,除了明确指示,不会有任何基于磁盘的操作,而我们都知道,磁盘的效率是远远低于内存的,这个是我们使用Spark的根本原因。

hive

Apache Hive™数据仓库软件便于读取、写入和管理存储在分布式存储中的大型数据集,并使用SQL语法进行查询。
Hive 构建于Apache Hadoop™之上,提供以下功能:

  1. 用于通过SQL轻松访问数据的工具,从而支持数据仓库任务,如提取/转换/加载(ETL)、报告和数据分析。
  2. 一种在各种数据格式上强加结构的机制。
  3. 访问直接存储在Apache HDFS ™或其他数据存储系统(如Apache HBase ™)中的文件 。
  4. 通过Apache Tez ™,Apache Spark ™或 MapReduce执行查询。
  5. 使用HPL-SQL的过程语言。
  6. 通过Hive LLAP,Apache YARN和Apache Slider进行亚秒级查询检索。

Hive将外部的任务解析成一个MapReduce可执行计划,而启动MapReduce是一个高延迟的一件事,每次提交任务和执行任务都需要消耗很多时间,这也就决定Hive只能处理一些高延迟的应用(如果你想处理低延迟的应用,可以考虑一下Hbase)。

spark-sql

SparkSQL的前身是Shark,给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,hive应运而生,它是当时唯一运行在Hadoop上的SQL-on-hadoop工具。但是MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率,为了提高SQL-on-Hadoop的效率,Shark应运而生,但又因为Shark对于Hive的太多依赖(如采用Hive的语法解析器、查询优化器等等),2014年spark团队停止对Shark的开发,将所有资源放SparkSQL项目上

flume

什么是flume?

apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。

应用场景

比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图. 这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析.而Flume正是帮我们做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于次,不过不一定是使用FLume,毕竟优秀的产品很多,比如facebook的Scribe,还有Apache新出的另一个明星项目chukwa,还有淘宝Time Tunnel。

Flume的优势

  1. Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase
  2. 当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一共平稳的数据.
  3. 提供上下文路由特征
  4. Flume的管道是基于事务,保证了数据在传送和接收时的一致性.
  5. Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。

Flume具有的特征

  1. Flume可以高效率的将多个网站服务器中收集的日志信息存入HDFS/HBase中
  2. 使用Flume,我们可以将从多个服务器中获取的数据迅速的移交给Hadoop中
  3. 除了日志信息,Flume同时也可以用来接入收集规模宏大的社交网络节点事件数据,比如facebook,twitter,电商网站如亚马逊,flipkart等
  4. 支持各种接入资源数据的类型以及接出数据类型
  5. 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等
  6. 可以被水平扩展

kafka

Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

对于像 Hadoop 一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka 的目的是通过 Hadoop 的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

flume和kafka区别

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核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务:

DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。

DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。

Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。

从这里可以看出flink只提供了Spark中的SparkStreaming的类似功能,但是flink的性能更好

flink和spark stream等框架的对比

我们当时的目标就是要设计一款低延迟、exactly once、流和批统一的,能够支撑足够大体量的复杂计算的引擎。

Spark streaming: 的本质还是一款基于 microbatch 计算的引擎。这种引擎一个天生的缺点就是每个 microbatch 的调度开销比较大,当我们要求越低的延迟时,额外的开销就越大。这就导致了 spark streaming 实际上不是特别适合于做秒级甚至亚秒级的计算。

Kafka streaming: 是从一个日志系统做起来的,它的设计目标是足够轻量,足够简洁易用。这一点很难满足我们对大体量的复杂计算的需求。

Storm: 是一个没有批处理能力的数据流处理器,除此之外 Storm 只提供了非常底层的 API,用户需要自己实现很多复杂的逻辑。另外,Storm 在当时不支持 exactly once。种种原因,Storm 也无法满足我们的需求。

最后,我们发现了 Flink,并且惊喜地发现它几乎完美满足了我们所有的需求:

  1. 不同于 Spark,Flink 是一个真正意义上的流计算引擎,和 Storm 类似,Flink 是通过流水线数据传输实现低延迟的流处理;
  2. Flink 使用了经典的 Chandy-Lamport 算法,能够在满足低延迟和低 failover 开销的基础之上,完美地解决 exactly once 的目标;
  3. 如果要用一套引擎来统一流处理和批处理,那就必须以流处理引擎为基础。Flink 还提供了 SQL/tableAPI 这两个 API,为批和流在 query 层的统一又铺平了道路。因此 Flink 是最合适的批和流统一的引擎;
  4. 最后,Flink 在设计之初就非常在意性能相关的任务状态 state 和流控等关键技术的设计,这些都使得用 Flink 执行复杂的大规模任务时性能更胜一筹。

nosql相关技术

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

Redis

redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。

redis是一个以key-value存储的数据库结构型服务器,它支持的数据结构类型包括:字符串(String)、链表(lists)、哈希表(hash)、集合(set)、有序集合(Zset)等。为了保证读取的效率,redis把数据对象都存储在内存当中,它可以支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。

Redis的优势和特点

  1. redis数据读写速度非常快,因为它把数据都读取到内存当中操作,而且redis是用C语言编写的,是最“接近“”操作系统的语言,所以执行速度相对较快。
  2. redis虽然数据的读取都存在内存当中,但是最终它是支持数据持久化到磁盘当中。
  3. redis提供了丰富的数据结构。
  4. redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
  5. redis支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

MongoDB

MongoDB 是一种面向文档的数据库管理系统,用 C++等语言撰写而成,以此来解决应用程序开发社区中的大量现实问题。2007 年 10 月,MongoDB 由 10gen 团队所发展。2009 年 2 月首度推出。

MongoDB的优势和特点

  1. MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。

     {
     	username:'123',
     	password:'123'
     }
    

使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。

  1. 易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。

  2. 数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。

MongoDB和Redis的区别是什么

  1. 内存管理机制

    Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。

    MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。

  2. 支持的数据结构

    Redis 支持的数据结构丰富,包括hash、set、list等。

    MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

  3. 数据量和性能:

    当物理内存够用的时候,redis>mongodb>mysql

    当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。

    实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。

    但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。

    mongodb还是能够保证性能。

  4. 性能

    mongodb依赖内存,TPS较高;Redis依赖内存,TPS非常高。性能上Redis优于MongoDB。

  5. 可靠性

    mongodb从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性;

    Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能。

    可靠性上MongoDB优于Redis。

  6. 数据分析

    mongodb内置数据分析功能(mapreduce);而Redis不支持。

  7. 事务支持情况

    Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;mongodb不支持事务。

  8. 集群

    MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。

ElasticeSearch

Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 是用 Java 开发的,并在 Apache 许可证下作为开源软件发布。

Elasticsearch 是与名为 Logstash 的数据收集和日志解析引擎以及名为 Kibana 的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。

Elasticsearch 可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch 是分布式的,这意味着索引可以被分成分片,每个分片可以有 0 个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。

Elasticsearch和MongoDB简要对比

场景和目标

  1. mongodb的目标是:“取代oracle和db2”(财务总监时上市说的)。和RDBMS是竞争关系。
  2. es的大部分场景是:“一个常见的设置是使用其它数据库作为主要的数据存储,使用 Elasticsearch 做数据检索”(2.X官方文档里说的)。和RDBMS是辅助关系。

相同点

  1. 都是以json格式管理数据的nosql数据库。
  2. 都支持CRUD操作。
  3. 都支持聚合和全文检索。
  4. 都支持分片和复制。
  5. 都支持阉割版的join操作。
  6. 都支持处理超大规模数据。
  7. 目前都不支持事务或者叫支持阉割版的事务。

不同点

  1. es是java编写,通过RESTFul接口操作数据。mongodb是C++编写,通过driver操作数据。(es对java开发更有好,利于排查理解)
  2. mongodb的分片有hash和range两种方式,es只有hash一种。
  3. es是天生分布式,主副分片自动分配和复制,开箱即用。mongodb的分布式是由“前置查询路由+配置服务+shard集合”,需要手动配置集群服务。
  4. 内部存储ES是到排索引+docvalues+fielddata。mongodb暂时未知。
  5. es全文检索有强大的分析器且可以灵活组合,查询时智能匹配。mongodb的全文检索字段个数有限制。
  6. es所有字段自动索引,mongodb的字段需要手动索引。
  7. es非实时有数据丢失窗口。mongodb实时理论上无数据丢失风险。

总结

  1. es偏向于检索、查询、数据分析,适用于OLAP系统。mongodb偏向于大数据规模下的CRUD,适用于对事务要求不强的OLTP系统。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!