个人经营的读书打卡群,一众志同道合的人,聚在一个群里,每天至少阅读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 客户端存根将消息返回给客户端函数,并将消息从网络二进制转换为本地语言格式