ElasticSearch面试题
1 为什么要使用ElasticSearch? 系统中的数据,随着业务的发展,时间的推移,将会非常多,而业务中往往采用模糊查询进行数据的搜索,而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描,在百万级别的数据库中,查询效率是非常低下的,而我们使用ES做一个全文索引,将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有id这些字段我们放入ES索引库里,可以提高查询速度。
2 ElasticSearch的master选举流程? ElasticSearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分
对所有可以成为master的节点(node.master: true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自 ...
RocketMQ消费者负载均衡
消费者负载均衡消费者从 Apache RocketMQ 获取消息消费时,通过消费者负载均衡策略,可将主题内的消息分配给指定消费者分组中的多个消费者共同分担,提高消费并发能力和消费者的水平扩展能力。本文介绍 Apache RocketMQ 消费者的负载均衡策略。
背景信息了解消费者负载均衡策略,可以帮助您解决以下问题:
消息消费处理的容灾策略:您可以根据消费者负载均衡策略,明确当局部节点出现故障时,消息如何进行消费重试和容灾切换。
消息消费的顺序性机制:通过消费者负载均衡策略,您可以进一步了解消息消费时,如何保证同一消息组内消息的先后顺序。
消息分配的水平拆分策略:了解消费者负载均衡策略,您可以明确消息消费压力如何被分配到不同节点,有针对性地进行流量迁移和水平扩缩容。
广播消费和共享消费在 Apache RocketMQ 领域模型中,同一条消息支持被多个消费者分组订阅,同时,对于每个消费者分组可以初始化多个消费者。您可以根据消费者分组和消费者的不同组合,实现以下两种不同的消费效果:
消费组间广播消费 :如上图所示,每个消费者分组只初始化唯一一个消费者,每个消费者可消费到消费者分组内 ...
OAuth 2.0 的四种授权方式
客户端凭证模式(Client Credentials)客户端凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。
第一步,A 应用在命令行向 B 发出请求。
https://oauth.b.com/token?
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
上面 URL 中,grant_type参数等于client_credentials表示采用凭证式,client_id和client_secret用来让 B 确认 A 的身份。
第二步,B 网站验证通过以后,直接返回令牌。
这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
这是最简单的一种模式,我们可以直接向验证服务器请求一个Token(这里可能有些小伙伴对Token的概念不是很熟悉,Token相当于是一个令牌,我们需要在验证服务器(User Account And Authentication)服务拿 ...
G1垃圾回收流程
G1垃圾回收流程
G1的垃圾回收流程主要是从新生代回收开始,新生代回收与并发标记再到混合回收,接下来我们就先来说第一个新生代回收。
G1 Yong Collection当我们的程序启动刚开始的时候会默认分配新生代5%的空间,这里我们假设分配了8个Region给Eden,1个Region给Survior(只是为了画图方便,实际可能Eden对应了有好几十甚至上百个Region),那么对应的初始内存分配如下:
那么当我们的Eden区域装满,还是会触发新生代的GC,那么新生代的GC还是会通过复制算法来进行垃圾回收,同时系统进入“Stop the World”状态,然后把Eden区中的对应的Region里存活的对象拷贝到S1对应的Region中,接着回收掉Eden对应的Region中的垃圾对象。
那么新生代对象什么时候进入老年代呢?跟之前一样,还是这么几个条件: 1)对象在新生代躲过了多次的垃圾回收,达到了一定的年龄,就会进入老年代。可以通过参数“-XX:MaxTenuringThreshold”进行年龄的设置
**2)动态年龄规则判断,如果一旦发现某个新生代GC过后,同年龄的存活对象超过了 ...
ES数据聚合+自动补全查询+数据同步+集群
1.数据聚合**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:
什么品牌的手机最受欢迎?
这些手机的平均价格、最高价格、最低价格?
这些手机每月的销售情况如何?
实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近实时搜索效果。
1.1.聚合的种类聚合常见的有三类:
桶(Bucket)聚合:用来对文档做分组
TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
Avg:求平均值
Max:求最大值
Min:求最小值
Stats:同时求max、min、avg、sum等
管道(pipeline)聚合:其它聚合的结果为基础做聚合
注意:参加聚合的字段必须是keyword、日期、数值、布尔类型
1.2.DSL实现聚合现在,我们要统计所有数据中的酒店品牌有几种,其实就是按照品牌对数据分组。此时可以根据酒店品牌的名称做聚合 ...
常见的Server的并发模型
本文主要介绍常见的Server的并发模型,这些模型与编程语言本身无关,有的编程语言可能在语法上直接透明了模型本质,所以开发者没必要一定要基于模型去编写,只是需要知道和了解并发模型的构成和特点即可。
那么在了解并发模型之前,我们需要两个必备的前置知识:
socket网络编程
多路IO复用机制
多线程/多进程等并发编程理论
模型一、单线程Accept(无IO复用)(1) 模型结构图
(2) 模型分析① 主线程main thread执行阻塞Accept,每次客户端Connect链接过来,main thread中accept响应并建立连接
② 创建链接成功,得到Connfd1套接字后, 依然在main thread串行处理套接字读写,并处理业务。
③ 在②处理业务中,如果有新客户端Connect过来,Server无响应,直到当前套接字全部业务处理完毕。
④ 当前客户端处理完后,完毕链接,处理下一个客户端请求。
(3) 优缺点优点:
socket编程流程清晰且简单,适合学习使用,了解socket基本编程流程。
缺点:
该模型并非并发模型,是串行的服务器,同一时刻,监听并响应最 ...
RocketMQ高级功能+源码分析
1. 高级功能1.1 消息存储分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。
消息生成者发送消息
MQ收到消息,将消息进行持久化,在存储中新增一条记录
返回ACK给生产者
MQ push 消息给对应的消费者,然后等待消费者返回ACK
如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤
MQ删除消息
1.1.1 存储介质
关系型数据库DB
Apache下开源的另外一款MQ—ActiveMQ(默认采用的KahaDB做消息存储)可选用JDBC的方式来做消息持久化,通过简单的xml配置信息即可实现JDBC消息存储。由于,普通关系型数据库(如Mysql)在单表数据量达到千万级别的情况下,其IO读写性能往往会出现瓶颈。在可靠性方面,该种方案非常依赖DB,如果一旦DB出现故障,则MQ的消息就无法落盘存储会导致线上故障
文件系统
目前业界较为常用的几款产品(RocketMQ/Kafka/RabbitMQ)均采 ...
内存屏障
初识volatileJava语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。这个概念听起来有些抽象,我们先看下面一个示例:
package com.zwx.concurrent;
public class VolatileDemo {
public static boolean finishFlag = false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
int i = 0;
while (!finishFlag){
i++; } },"t1").start();
Thread.sleep(100 ...
MyBatis的动态SQL实现原理
前言MyBatis提供了强大的动态SQL语句生成功能,以应对复杂的业务场景,本篇文章将结合MyBatis解析SQL语句的过程对MyBatis中对<if**>,<**where**>,<**foreach**>等动态SQL**标签的支持进行分析。
MyBatis版本:3.5.6
正文一. XML文档中的节点概念在分析MyBatis如何支持SQL语句之前,本小节先分析XML文档中的节点概念。XML文档中的每个成分都是一个节点,DOM对XML节点的规定如下所示。
整个文档是一个文档节点;
每个XML标签是一个元素节点;
包含在元素节点中的文本是文本节点。
以一个XML文档进行说明,如下所示。
xml复制代码<provinces>
<province name="四川">
<capital>成都</capital>
</province>
<province name="湖北">
< ...
Tomcat类加载机制
JVM 的类加载机制以及双亲委派模型,双亲委派模型的类加载过程主要分为以下几个步骤:
(1)初始化 ClassLoader 时需要指定自己的 parent 是谁(2)先检查类是否已经被加载过,如果类已经被加载了,直接返回(3)若没有加载则调用父加载器 parent 的 loadClass() 方法进行加载(4)若父加载器为空则默认使用启动类加载器 bootstrap ClassLoader 进行加载(5)如果父类加载失败,抛出 ClassNotFoundException 异常后,再调用自己的 findClass() 方法进行加载。 前面文章也提到,如果想要破坏这种机制,那么就自定义一个类加载器(继承自 ClassLoader),并重写其中的 loadClass() 方法,使其不进行双亲委派即可。最经典例子就是 Tomcat 容器的类加载机制了,它实现了自己的类加载器 WebApp ClassLoader,并且打破了双亲委派模型,在每个应用在部署后,都会创建一个唯一的类加载器。
1、Tomcat 的类加载器结构图:
(1)Common ClassLoader:加载 com ...