文章目录
- 1. GateWay:10010
- 2. Docker
- 3. ES:海量数据的存储、搜索、计算
- 3.1 数据搜索
- 3.2 数据同步
- 4. 微服务保护:Sentinel
- 4. 分布式事务:(二阶段提交)
- 5. Redis
- 6. 多级缓存
1. GateWay:10010
2. Docker
镜像:将代码打包成镜像,镜像中就包含程序所依赖的全部东西
容器:其实就是运行的镜像,读到内存运行起来就是容器
镜像操作:
容器操作:
容器数据管理:数据卷
容器与数据分离,数据卷是一个虚拟目录
,指向宿主机文件系统中的某个目录。
Docker-Compose:将多个docker run命令写到一个文件,开启多个容器
3. ES:海量数据的存储、搜索、计算
倒排索引:存词条(因为词条有唯一性,像 Hash这样的结构就可以存储),词条对应的文档 id,根据文档 id 到 数据库找到具体信息。
为什么这么快?
虽然要先查询倒排索引,再查询对应的正排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描
。
基本操作有:索引库操作、文档操作。原理:根据我们要存的东西的结构创建索引库,创建好之和就可以在索引库操作文档,比如新增、删除、修改等。
索引库操作有哪些?
- 创建索引库:PUT /索引库名
- 查询索引库:GET /索引库名
- 删除索引库:DELETE /索引库名
- 添加字段:PUT /索引库名/_mapping
文档操作:
- 创建文档:POST /{索引库名}/_doc/文档id { json文档 }
- 查询文档:GET /{索引库名}/_doc/文档id
- 删除文档:DELETE /{索引库名}/_doc/文档id
- 修改文档:
- 全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
- 增量修改:POST /{索引库名}/_update/文档id { “doc”: {字段}}
使用RestHighLevelClient操作ES:
文档操作的基本步骤:
初始化RestHighLevelClient
创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
准备参数(Index、Update、Bulk时需要)
发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
解析结果(Get时需要)
3.1 数据搜索
- query:查询条件
- from和size:分页条件
- sort:排序条件
- highlight:高亮条件
用ES实现搜索:(用户可以给一些限制搜索的条件、我身边的*********** 、搜出来结果的排序)
用户可以输入想搜索的内容,对用户搜索的用全文检索;当用户对搜索的内容限制时:城市、价格,使用复合查询(布尔查询);用户想实现我身边的**:添加距离排序;酒店竞价排名:有些酒店花钱了做广告,要让这些酒店先展示:给酒店添加一个字段用来标识是不是广告,使用复合查询(得分查询),filter用来选出这些打广告的酒店,选择算分函数和加权方式,让其得分变大。还可以:搜索框自动补齐
3.2 数据同步
同步调用
异步通知 MQ
监听binlog Canal
4. 微服务保护:Sentinel
解决服务雪崩问题的解决办法:
-
流量控制 ---------- 预防措施
- 以下为对资源的限流(接口)
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
- 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
- 使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
- 对热点参数的限流(秒杀商品)
-
隔离和降级 ------将故障控制在一定范围,都是保护的调用方
- 说明:微服务远程调用都是基于Feign来完成的,因此需要将Feign与Sentinel整合,在Feign里面实现线程隔离和服务熔断。
- 隔离:setinel采用的基于信号量的隔离,用计算器来计数,超过时就限流
- 降级:断路器统计服务调用的
异常比例
、慢请求比例
,如果超出阈值则会熔断该服务,走降级逻辑。它是通过断路器实现的(打开、关闭、半开),打开状态就是熔断了,关闭状态就可以正常请求,半开状态是熔断后出现的,之后隔几秒再尝试放行,看看断路器用不用关闭。
4. 分布式事务:(二阶段提交)
TCC空回滚和事务悬挂:
try阶段阻塞时,可能导致全局事务超时而触发二阶段的cancel操作。在未执行try操作时先执行了cancel操作,这时cancel不能做回滚,就是空回滚。
对于已经空回滚的业务,之前被阻塞的try操作恢复,继续执行try,就永远不可能confirm或cancel ,事务一直处于中间状态,这就是业务悬挂。
业务悬挂解决办法:执行try操作时,应当判断cancel是否已经执行过了,如果已经执行,应当阻止此次try操作,避免悬挂
5. Redis
什么时候执行RDB:
- 执行save命令
- 执行bgsave命令
- fork采用的是copy-on-write技术,当主进程执行读操作时,访问共享内存,当主进程执行写操作时,则会拷贝一份数据,执行写操作。
- Redis停机时
- 触发RDB条件时:在 redis.conf 中可以配置
AOF:文件追加的方式,记录的是一个一个命令,可能涉及到Rewrite机制,AOF文件比RDB文件大的多
主从第一次建立连接时,采用RDB持久化进行全量同步,master判断一个节点是否是第一次同步的依据,就是看replid是否一致。
什么时候执行全量同步?
slave节点第一次连接master节点时
slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
故障转移选新的master:其实就是执行slaveof no one ,其他slave执行slaveof 自己
6. 多级缓存
参考多级缓存篇:https://blog.csdn.net/qq_51240148/article/details/133556865
首先用户发一个请求,先经过Nginx(此处Nginx作为静态资源服务器与反向代理服务器)返回一个静态资源,经过浏览器渲染给呈现出来,但是上面的数据都是假的,此时前端会发一些ajax请求后端数据,先吧请求发送给Nginx,因为Nginx中有本地缓存,所以还是将请求路由(这里类似于redis的槽),确保同一个请求路由到同一个Nginx服务器,当Nginx接收到请求时,首先会查看本地缓存有没有,没有的话先在redis缓存中找,当redis中也没有的话才访问Tomcat,此时Tomcat会先在JVM进程缓存中去找,再没有的话才去数据库查,然后针对缓存同步来说的话,用canal监听mysql的binlog日志,其实canal就是伪装成一个slave节点,当监听到binlog变换时,通知给java客户端,然后在程序中进行缓存同步的操作。其实canal在代码中的话就是实现EntryHandler<>这个接口重写里面的insert、update、delete方法,将redis和jvm进程缓存进行更新操作。