可伸缩服务架构-框架与中间件(读书笔记二)

个人经营的读书打卡群,一众志同道合的人,聚在一个群里,每天至少阅读15分钟,然后拍照或截屏在群里打卡,同时,简短的分享一下自己的心得,日复一日,月复一月,我们终将发现阅读的力量。欢迎喜欢阅读的你加入(加入时需要推荐2本自己阅读的书才能入群,以表示你确实在阅读)

限100人以内,群二维码:

以下为正文:

第五章 大数据利器之Elasticsearch

 

5.1、Lucene介绍

Lucent采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使他在读写时几乎完全避免了锁的出现,大大提升了读写性能。

5.1.1、核心模块

— analysis模块:分词

— index模块:建索引

— store模块:负责索引读写

— queryParser:语法分析

— search模块:对索引的搜索

— similarity模块:负责相关性打分和排序的实现

 

5.1.2、核心术语

— Term:单词,索引里最小的存储和查询单元

— 词典:Term的集合,词典的数据结构有HashMap(性能高,浪费空间),fst(finite-state transducer)有更好的数据压缩和查询效率

— 倒排表:记录的是某个词在哪些文章出现过

— 正向信息:原始的文档信息,可以用来做排序、聚合、展示

— 段:索引中最小的存储单元,只读不能写

 

5.1.3、检索方式

1、单词查询

2、AND

3、OR

4、NOT

 

5.1.4、分段存储

段不变性的有点:

— 不需要锁

— 可以常驻内存

— 缓存友好

— 增量创建

段不变性的缺点:

— 删除时,旧数据不会立即被删除,而是标记为.del,等到段更新时才真正的删除

— 更新由删除和新增组成

— 由于索引具有不变性,每次新增数据时,都需要新增一个段来存储数据

— 查询出来的数据需要对已删除的数据进行过滤

 

为了提升写的性能,Lucene采用了延迟写的策略。先写内存,然后批量写入磁盘,若有一个段被写到磁盘,则生成一个提交点。

 

5.1.5、段合并策略

为了控制所有里段的数量,我们必须定期进行段的合并操作

 

5.1.6、Lucene相似度打分

1、文本相似度的主要影响因子

— tf:词频,其值越大,这篇文章描述的内容与该词越接近

— idf:(inverse document frequency),表示整个文档包含某个词的文档数量越少,这个便越重要

— length:同等条件下,搜索词所在的文档长度越长,搜索词和文档的相似度就越低;文档长度越短,相似度就越高

 

— term boost:查询在语句中每个词的权重

— document boost:文档权重

— field boost:域的权重,就是字段权重

— query boost:查询条件的权重

 

2、基于向量空间模型

向量空间模型的主要思路是把文本信息映射到空间向量中,形成文本信息和向量数据的映射关系,然后通过计算几个或者多个不同的向量的差异,来计算文本的相似度

3、基于概率的模型

BM25算法是根据BIM算法改进而来的,目前为止,是优秀的排名算法

 

5.2、Elastisearch简介

5.2.1、核心概念

— Cluster:集群

— Node

— Shards:分片

— Replicas:副本

— Index:索引

— Type:类别

— Document:文档

— Settings:集群中索引的定义

— Mapping,类似关系数据库的表结构信息

— Analyzer:字段的分词方式的定义

 

Elastic search的节点分类如下:

— 主节点,负责创建索引、删除索引、分配分片、追踪集群中的节点状态

— 数据节点,负责数据的存储和相关具体操作,如索引的创建、修改、删除、搜索、聚合

— 客户端节点,既不是候选主节点也不是数据节点的节点

— 部落节点,跨越多个集群

— 协调节点,任何节点都可以成为协调节点

 

集群的状态有红黄绿三种。

 

5.2.2、3C和脑裂

1、共识性(Consensus),分布式系统中所有节点必须对给定的数据或者节点的状态达成共识(zen discovery)

2、并发(Concurrency),

— 乐观并发控制(OCC),解决写-写冲突的无锁并发控制

— 多版本并发控制:使用版本号控制

3、一致性(Consistency)

三种允许写操作的判断

— One:只要主分片可用,就写

— All:只有当主分片和所有副本都可用时,才允许写操作

— Quorum:默认选项,一半以上节点可用就写

 

4、脑裂

集群中出现多个主节点时,可能会丢失数据,这种现象称为脑裂

 

5.2.3、事务日志

内存里的日志不可搜索,文件系统里的日志可以搜索

 

第六章 全面揭秘分布式定时任务

 

6.1、什么是定时任务

常用定时任务

1、crontab命令

Linux下的任务调度分为两类,系统任务调度和用户任务调度

— 系统任务调度:操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc的子目录下面

— 用户任务调度:每个用户都有自己的crontab文件,所有用户定义的文件都存放于/var/spool/cron目录中,文件名与用户名一致

crontab配置文件格式说明:

# *  *  *  *  *  command

# |  |   |  |   |   |

# |  |   |  |   |   --要执行的命令

# |  |   |  |   —星期(0-7,星期日为0或7)

# |  |   |  —月(1-12)

# |  |   —日(1-31)

# |  —小时(0-23)

# —分钟(0-59)

 

— 以逗号隔开表示一个列表范围

— 连字符,指定值得范围

— 星号,代表任何的值

— 正斜线,指定时间的频率

 

— -u 设定某个用户的crontab文件

— file,命令文件的名称

— -e 编辑某个用户的crontab文件

— -l 用于显示某个用户的crontab文件

— -r 用于删除某个用户的crontab文件

— -i  用于在删除用户crontab文件时给出提示

 

2、JDKTimer

是一个单线程,定时调度所有TimerTask任务

Timer类的主要函数:Timer,schedule,然后重新run方法

 

Timer类的缺陷:

— 时间不准确延迟

— 异常终止

— 执行周期任务时依赖系统时间

 

3、ScheduleExecutor

每个调度任务都会有线程池中的一个线程去执行,因此任务是并发执行的。

ScheduleExecutor与Timer相比:

— 可以解决Timer不准时延迟的问题

— 多线程并发,能做到线程隔离

— 不依赖系统时间的变化而发生执行上的变化

— 执行过程中抛出异常,就会停止

 

4、Spring Schedule

主要包括TaskExecutor、TaskSchedule、Trigger三个抽象接口

 

 

5、Quartz,开源项目

框架的核心对象如下:

— Job,表示一个工作,为要执行的具体内容

— JobDetail,任务调度细节

— Trigger,执行任务的规则

— Schedule,代表一个任务调度容器

 

6、cron表达式

在线表达式工具(http://www.pppet.net)

 

6.2、分布式定时任务

6.2.1、定时任务使用场景

— 业务需求

— 产品运营

— 运维管理

 

6.2.2、传统定时任务存在的问题

1、只在一台服务器上运行

2、通过配置参数分散运行

3、通过全局锁互斥执行

 

6.2.3、分布式定时任务及其原理

分布式定时任务特点:

— 高可用性

— 可伸缩性

— 负载均衡

— 失效转移

 

分布式锁有3种实现方式

— 基于数据库的实现方式,依靠数据库的全局索引实现

— 基于Redis的实现方式

— 基于zookeeper的实现方式

1、永久节点

2、临时节点

3、顺序节点

 

6.3、开源分布式定时任务的用法

6.3.1、Quartz的分布式模式

6.3.2、TBSchedule(阿里巴巴开源的分布式调度框架)

6.3.3、Elastic-Job

当当网开源的分布式调度解决方案

第七章 RPC服务的发展历程和对比分析

7.1、什么是RPC服务

RPC协议是一种通过网络向远程计算机请求服务,而不需要了解底层网络技术的协议。

RPC有以下优势:

— 简单

— 高效

— 通用

 

7.2、RPC的服务原理

7.2.1、Socket套接字

双向通信

7.2.2、RPC的调用过程

step1 客户端调用本地的客户端存根方法

step2 客户端存根通过系统调用,使用操作系统内核套接字向远程服务发送编码的网络消息

step3 网络消息由内核通过TCP/UDP传输到远程服务器

step4 服务端存根接收客户端消息,并对消息进行解码

step5 服务端存根调用服务端方法,并将从客户端接收到的参数传递给该方法

step6 服务端执行完成后,把返回结果存入服务端存根代码中

step7 服务端存根将返回值编码并序列化后,通过一个或多个网络消息返回给客户端

step8 消息通过网络传输给客户端

step9 客户端从本地存根读取本地套接字消息

step10 客户端存根将消息返回给客户端函数,并将消息从网络二进制转换为本地语言格式

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxhyxwwu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值