这个时候你需要:
RPC && 序列化技术
什么是 RPC 技术?
RPC 全称 Remote Procedure Call,远程过程调用。我们平时编程中,随时都在调用函数,这些函数基本上都位于本地,也就是当前进程某一个位置的代码块。但如果要调用的函数不在本地,而在网络上的某个服务器上呢?这就是远程过程调用的来源。
从图中可以看出,通过网络进行功能调用,涉及参数的打包解包、网络的传输、结果的打包解包等工作。而其中对数据进行打包和解包就需要依赖序列化技术来完成。
什么是序列化技术?
序列化简单来说,是将内存中的对象转换成可以传输和存储的数据,而这个过程的逆向操作就是反序列化。序列化 && 反序列化技术可以实现将内存对象在本地和远程计算机上搬运。好比把大象关进冰箱门分三步:
序列化技术有很多免费开源的框架,衡量一个序列化框架的指标有这么几个:
下面流行的三大序列化框架 protobuf、thrift、avro 的对比:
ProtoBuf:
厂商:Google
支持语言:C++、Java、Python 等
动态性支持:较差,一般需要提前编译。
是否包含RPC:否
简介:ProtoBuf 是谷歌出品的序列化框架,成熟稳定,性能强劲,很多大厂都在使用。自身只是一个序列化框架,不包含 RPC 功能,不过可以与同是 Google 出品的 GPRC 框架一起配套使用,作为后端 RPC 服务开发的黄金搭档。
缺点是对动态性支持较弱,不过在更新版本中这一现象有待改善。总体来说, ProtoBuf 都是一款非常值得推荐的序列化框架。
Thrift
厂商:Facebook
支持语言:C++、Java、Python、PHP、C#、Go、JavaScript 等
动态性支持:差
是否包含RPC:是
简介:这是一个由 Facebook 出品的 RPC 框架,本身内含二进制序列化方案,但 Thrift 本身的 RPC 和数据序列化是解耦的,你甚至可以选择 XML、JSON 等自定义的数据格式。在国内同样有一批大厂在使用,性能方面和 ProtoBuf 不分伯仲。缺点和 ProtoBuf 一样,对动态解析的支持不太友好。
Avro
支持语言:C、C++、Java、Python、C# 等
动态性支持:好
是否包含RPC:是
简介:这是一个源自于Hadoop生态中的序列化框架,自带RPC框架,也可独立使用。相比前两位最大的优势就是支持动态数据解析。
为什么我一直在说这个动态解析功能呢?在之前的一段项目经历中,轩辕就遇到了三种技术的选型,摆在我们面前的就是这三种方案。需要一个 C++ 开发的服务和一个 Java 开发的服务能够进行 RPC。
Protobuf 和 Thrift 都需要通过“编译”将对应的数据协议定义文件编译成对应的 C++/Java 源代码,然后合入项目中一起编译,从而进行解析。
当时,Java 项目组同学非常强硬的拒绝了这一做法,其理由是这样编译出来的强业务型代码融入他们的业务无关的框架服务,而业务是常变的,这样做不够优雅。
最后,经过测试,最终选择了 AVRO 作为我们的方案。Java 一侧只需要动态加载对应的数据格式文件,就能对拿到的数据进行解析,并且性能上还不错。(当然,对于 C++ 一侧还是选择了提前编译的做法)
自从你的网站支持了动态能力,免不了要和数据库打交道,但随着用户的增长,你发现数据库的查询速度越来越慢。
这个时候,你需要:
数据库索引技术
想想你手上有一本数学教材,但是目录被人给撕掉了,现在要你翻到讲三角函数的那一页,你该怎么办?
没有了目录,你只有两种办法,要么一页一页的翻,要么随机翻,直到找到三角函数的那一页。
对于数据库也是一样的道理,如果我们的数据表没有“目录”,那要查询满足条件的记录行,就得全表扫描,那可就恼火了。所以为了加快查询速度,得给数据表也设置目录,在数据库领域中,这就是索引。
一般情况下,数据表都会有多个字段,那根据不同的字段也就可以设立不同的索引。
索引的分类
主键我们都知道,是唯一标识一条数据记录的字段(也存在多个字段一起来唯一标识数据记录的联合主键),那与之对应的就是主键索引了。
聚集索引是指索引的逻辑顺序与表记录的物理存储顺序一致的索引,一般情况下主键索引就符合这个定义,所以一般来说主键索引也是聚集索引。但是,这不是绝对的,在不同的数据库中,或者在同一个数据库下的不同存储引擎中还是有不同。
聚集索引的叶子节点直接存储了数据,也是数据节点,而非聚集索引的叶子节点没有存储实际的数据,需要二次查询。
索引的实现原理
索引的实现主要有三种:
其中,B+树用的最多,其特点是树的节点众多,相较于二叉树,这是一棵多叉树,是一个扁平的胖树,减少树的深度有利于减少磁盘 I/O 次数,适宜数据库的存储特点。
哈希表实现的索引也叫散列索引,通过哈希函数来实现数据的定位。哈希算法的特点是速度快,常数阶的时间复杂度,但缺点是只适合准确匹配,不适合模糊匹配和范围搜索。
位图索引相对就少见了。想象这么一个场景,如果某个字段的取值只有有限的少数几种可能,比如性别、省份、血型等等,针对这样的字段如果用B+树作为索引的话会出现什么情况?会出现大量索引值相同的叶子节点,这实际上是一种存储浪费。
位图索引正是基于这一点进行优化,针对字段取值只有少量有限项,数据表中该列字段出现大量重复时,就是位图索引一展身手的时机。
所谓位图,就是 Bitmap,其基本思想是对该字段每一个取值建立一个二进制位图来标记数据表的每一条记录的该列字段是否是对应取值。
索引虽好,但也不可滥用,一方面索引最终是要存储到磁盘上的,无疑会增加存储开销。另外更重要的是,数据表的增删操作一般会伴随对索引的更新,因此对数据库的写入速度也是会有一定影响。
你的网站现在访问量越来越大了,同时在线人数大大增长。然而,大量用户的请求带来了后端程序对数据库大量的访问。渐渐的,数据库的瓶颈开始出现,无法再支持日益增长的用户量。老板再一次给你下达了性能提升的任务。
缓存技术 && 布隆过滤器
从物理 CPU 对内存数据的缓存到浏览器对网页内容的缓存,缓存技术遍布于计算机世界的每一个角落。
面对当前出现的数据库瓶颈,同样可以用缓存技术来解决。
每次访问数据库都需要数据库进行查表(当然,数据库自身也有优化措施),反映到底层就是进行一次或多次的磁盘I/O,但凡涉及I/O的就会慢下来。如果是一些频繁用到但又不会经常变化的数据,何不将其缓存在内存中,不必每一次都要找数据库要,从而减轻对数据库对压力呢?
有需求就有市场,有市场就会有产品,以 memcached 和Redis为代表的内存对象缓存系统应运而生。
缓存系统有三个著名的问题:
关于这三个问题的更详细阐述,推荐一篇文章:什么是缓存系统的三座大山。
有了缓存系统,我们就可以在向数据库请求之前,先询问缓存系统是否有我们需要的数据,如果有且满足需要c#删除文件,我们就可以省去一次数据库的查询,如果没有,我们再向数据库请求。
注意,这里有一个关键的问题,如何判断我们要的数据是不是在缓存系统中呢?
进一步,我们把这个问题抽象出来:如何快速判断一个数据量很大的集合中是否包含我们指定的数据?
这个时候,就是布隆过滤器大显身手的时候了,它就是为了解决这个问题而诞生的。那布隆过滤器是如何解决这个问题的呢?
先回到上面的问题中来,这其实是一个查找问题,对于查找问题,最常用的解决方案是搜索树和哈希表两种方案。
因为这个问题有两个关键点:快速、数据量很大。树结构首先得排除,哈希表倒是可以做到常数阶的性能,但数据量大了以后,一方面对哈希表的容量要求巨大,另一方面如何设计一个好的哈希算法能够做到如此大量数据的哈希映射也是一个难题。
对于容量的问题,考虑到只需要判断对象是否存在c#删除文件,而并非拿到对象,我们可以将哈希表的表项大小设置为1个 bit,1表示存在,0表示不存在,这样大大缩小哈希表的容量。
而对于哈希算法的问题,如果我们对哈希算法要求低一些,那哈希碰撞的机率就会增加。那一个哈希算法容易冲突,那就多弄几个,多个哈希函数同时冲突的概率就小的多。
布隆过滤器就是基于这样的设计思路:
当设置对应的 key-value 时,按照一组哈希算法的计算,将对应比特位置1。
但当对应的 key-value 删除时,却不能将对应的比特位置0,因为保不准其他某个 key 的某个哈希算法也映射到了同一个位置。
也正是因为这样,引出了布隆过滤器的另外一个重要特点:布隆过滤器判定存在的实际上不一定存在,但判定不存在的则一定不存在。
你们公司网站的内容越来越多了,用户对于快速全站搜索的需求日益强烈。这个时候,你需要:
全文搜索技术
对于一些简单的查询需求,传统的关系型数据库尚且可以应付。但搜索需求一旦变得复杂起来,比如根据文章内容关键字、多个搜索条件的逻辑组合等情况下,数据库就捉襟见肘了,这个时候就需要单独的索引系统来进行支持。
如今行业内广泛使用的 ElasticSearch(简称ES)就是一套强大的搜索引擎。集全文检索、数据分析、分布式部署等优点于一身,成为企业级搜索技术的首选。
ES 使用 RESTful 接口,使用 JSON 作为数据传输格式,支持多种查询匹配,为各主流语言都提供了 SDK,易于上手。
另外,ES 常常和另外两个开源软件 Logstash、Kibana 一起,形成一套日志收集、分析、展示的完整解决方案:ELK 架构。
其中,Logstash 负责数据的收集、解析,ElasticSearch 负责搜索,Kibana 负责可视化交互,成为不少企业级日志分析管理的铁三角。
无论我们怎么优化,一台服务器的力量终究是有限的。公司业务发展迅猛,原来的服务器已经不堪重负,于是公司采购了多台服务器,将原有的服务都部署了多份,以应对日益增长的业务需求。
现在,同一个服务有多个服务器在提供服务了,需要将用户的请求均衡的分摊到各个服务器上,这个时候,你需要:
负载均衡技术
顾名思义,负载均衡意为将负载均匀平衡分配到多个业务节点上去。
和缓存技术一样,负载均衡技术同样存在于计算机世界到各个角落。
按照均衡实现实体,可以分为软件负载均衡(如LVS、Nginx、HAProxy)和硬件负载均衡(如A10、F5)。
按照网络层次,可以分为四层负载均衡(基于网络连接)和七层负载均衡(基于应用内容)。
按照均衡策略算法,可以分为轮询均衡、哈希均衡、权重均衡、随机均衡或者这几种算法相结合的均衡。
而对于现在遇到等问题,可以使用nginx来实现负载均衡,nginx支持轮询、权重、IP哈希、最少连接数目、最短响应时间等多种方式的负载均衡配置。
轮询
upstream web-server {
server 192.168.1.100;
server 192.168.1.101;
}
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。