面试专题
Mr'JunA
这个作者很懒,什么都没留下…
展开
-
如何保证消息队列消息的顺序性
如何保证消息队列消息的顺序性?举个例子:有一个mysql binlog 同步系统,压力是非常大的,日同步数据达到了上亿级别,就是将数据从一个 mysql 库当中原封不动的同步到另一个 mysql 库当中去(比较常见的就是大数据组需要干的事情)。假设在 mysql 当中增删改了一条数据,对应的生产了三条 增删改的 binlog 日志,接着这三条 binlog 发送到 MQ 里面去,然后进行消费。这时候就得保证消息队列的顺序性了。不然本来是:增加、修改、删除;你愣是换了顺序给执行成删除、修改、增加,原创 2020-08-19 10:33:35 · 2078 阅读 · 1 评论 -
如何保证消息队列的消息可靠性传输/如何处理消息丢失问题
MQ 有一个基本原则,就是数据不能多一条,也不能少一条。不能多就是重复消费跟幂等性问题。不能少就是说这个数据不能丢失了。如果MQ是用来传递非常核心的消息,比如说计费、扣费的一些消息,那么得必须确保这个MQ传递得过程当中不能把计费得消息给丢失掉。eg: RabbitMQ生产者丢失了数据生产者将数据发送到 Rabbit MQ 的时候,数据可能在发送的途中丢失了(网络原因、其他不可控原因)Rabbit MQ 提供了事务功能,就是发送数据之前开启事务 channel.txSelect,然后发原创 2020-08-07 11:21:40 · 464 阅读 · 0 评论 -
如何保证消息队列消息不被重复消费/幂等性
RabbitMQ、RocketMQ、Kafka等消息队列如果不做任何的防护措施都是有可能出现消息重复消费的情况的。保证消息的不可重复消费一般都是需要开发人员来进行相对于的设置。Kafka 实际上有个 offset 的概念,每个写入的消息都会有一个 offset ,代表的是消息的序号,在 consumer 消费之后,每隔一段时间(定时定期),都会将自己消费过的 offset 进行提交,标识一下哪些数据是自己已经消费了的。下次重启或者其他情况需要继续消费的时候就从该位置继续消费。理想是美好的,现实确实很原创 2020-08-07 09:45:46 · 1038 阅读 · 0 评论 -
消息队列-为什么要使用消息队列(面试)
为什么要用消息队列?面试官的主要目的就是为了想问问你消息队列的运用场景,在你的项目里面是怎么运用消息队列的,用来解决了什么问题。面试官期待的回答就是:你们公司的某一个业务场景遇到了技术挑战,如果不用MQ就会很麻烦,但是用了MQ的话就会带来什么样的好处。消息队列的运用场景:解耦、异步、削峰。解耦:如果一个A系统发送数据到BCD三个系统,通过接口发送。如果现在有个E系统也要接收数据,然后C系统不需要再接收数据了,这样A系统的负责人就会崩溃(大改)。具体如下图:在上面的场景当中,A系统原创 2020-07-31 11:23:23 · 904 阅读 · 0 评论 -
Redis分布式锁的实现原理(面试)
如果聊到了分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了,非常的简便易用。可以去看看Redisson的官网,看看如何在项目中引入Redisson的依赖,然后基于Redis实现分布式锁的加锁与释放锁。下面是一个简单得Redisson分布式锁的实现伪代码:...原创 2020-07-17 11:11:38 · 13610 阅读 · 3 评论 -
系统的TPS不达标,此时如何优化(面试)
系统的TPS不达标,此时如何优化对系统进行压测,比如每秒压个几百请求到几千请求,甚至上万请求,此时发现死活压不上去,压来压去,你的系统最多每秒就处理几百个请求,根本到不了几千个请求,此时就发现系统的TPS不达标。这个时候,如果发现TPS不达标,通常是说明你系统肯定是每个请求处理时间太长了,所以就导致你单位时间内,在有限的线程数量下,能处理的TPS就少了,这个时候往往要先优化性能,再提TPS。假设你一共有200个线程,结果你每个请求要耗费500ms,每个线程每秒就只能处理2个请求,200个线程每秒原创 2020-07-14 17:13:54 · 1484 阅读 · 0 评论 -
高并发场景下的数据库连接池应该如何进行优化(面试)
高并发场景下的数据库连接池应该如何进行优化以druid来举例:(1)maxWait表示从池里获取连接的等待时间,万一你暂时没有可用的连接,就可能要等待别的连接用完释放,你再去使用,通常建议设置在1000以上,就是等待1s以上,比如你可以设置1200,因为有的时候要等待建立新的TCP连接,最多在1s内,那你就得等一会儿。如果这个参数默认设置为0,意思就是无限的等待获取连接,在高并发场景下,可能瞬间连接池耗尽,大量的请求都卡死在这里等待获取连接,进而导致你tomcat里没有可用的线程,服务就是一原创 2020-07-14 17:04:54 · 3201 阅读 · 0 评论 -
snowflake算法的时钟回拨问题如何解决(面试)
snowflake算法的时钟回拨问题如何解决snowflake算法:一串数字,用很多的二进制里的bit位,去代表不同的东西;40多位都是当前机器上的时间,中间有几位是代表的是机器id,自增长的id;分布式业务系统,分布在很多台机器上,这很多台机器都要生成唯一的id,不能重复,此时可以调用某台机器上的snowflake算法生成的唯一id;12:00:00 500 28 1~2012:00:04 300 28 1~2012:00:05 308,当前你的snowflake算法部署的机器发生了本原创 2020-07-11 22:58:36 · 9459 阅读 · 7 评论 -
链路追踪的时候,链路id是怎么管理的(面试)
链路追踪的时候,链路id是怎么管理的每一个请求入口,traceid,每一次服务调用,spanid,上游服务id,parenetid,调用时间,timestamp,有正向的,还有反向的,把请求发出,请求接收,业务处理,各种时间都记录下来,计算网络耗时和业务处理耗时。底层的服务框架,接收到每一层请求调用的时候都要交给链路追踪系统的客户端框架来处理一下,traceid,代表了一次请求。链路追踪数据:traceid=1,spanid=1,parentid=0,received_timestamp=1原创 2020-07-11 22:55:10 · 1394 阅读 · 1 评论 -
分布式系统是如何进行链路监控的(面试)
分布式系统是如何进行链路监控的追踪了有什么用?调用链路,链路性能监控,链路故障排查;Google的Dapper,阿里的鹰眼,大众点评的CAT,Twitter的Zipkin,LINE的pinpoint,国产的skywalking,很多,国内一般用CAT和zipkin比较多。核心架构就是做一个框架,然后每一次服务调用都要经过这个框架,框架采集调用链路的数据存储起来,然后有可视化界面展示出来每个调用链路,性能,故障,这些东西。下订单之后,直到返回,需要几秒钟。订单服务收到这个请求是12:00:原创 2020-07-11 22:53:50 · 343 阅读 · 1 评论 -
零拷贝技术到底是什么(面试)
零拷贝技术到底是什么inux提供了sendfile,也就是零拷贝技术。零拷贝技术,就是先从用户态切换到内核态,在内核态的状态下,把磁盘上的数据拷贝到内核缓冲区,同时从内核缓冲区拷贝一些offset和length到Socket缓冲区;接着从内核态切换到用户态,从内核缓冲区直接把数据拷贝到网络协议引擎里去;同时从Socket缓冲区里拷贝一些offset和length到网络协议引擎里去,但是这个offset和length的量很少,几乎可以忽略。只要2次切换,2次拷贝,就可以了。kafka、tomc原创 2020-07-11 22:51:28 · 472 阅读 · 1 评论 -
了解mmap吗?内存映射技术为什么可以提升IO性能(面试)
了解mmap吗有一种mmap技术,也就是内存映射,直接将磁盘文件数据映射到内核缓冲区,这个映射的过程是基于DMA引擎拷贝的,同时用户缓冲区是跟内核缓冲区共享一块映射数据的,建立共享映射之后,就不需要从内核缓冲区拷贝到用户缓冲区了。光是这一点,就可以避免一次拷贝了,但是这个过程中还是会用户态切换到内核态去进行映射拷贝,接着再次从内核态切换到用户态,建立用户缓冲区和内核缓冲区的映射。接着把数据通过Socket发送出去,还是要再次切换到内核态。接着直接把内核缓冲区里的数据拷贝到Socket缓冲区里去,原创 2020-07-11 22:49:24 · 732 阅读 · 2 评论 -
JDK是如何对堆外内存进行分配和回收的(面试)
-XX:MaxDirectMemorySize:通过JVM参数是可以设置你最大可以使用的堆外内存的大小的,比如说设置堆外内存最大可以使用1GB,此时已经使用了950MB空间了,然后呢,你此时要申请一块80MB的堆外内存。会发现说,堆外内存已经不够了,此时不能直接分配堆外内存了。DirectByteBuffer,这个对象是JVM堆内存里的一个对象,但是这个DirectByteBuffer里面包含指针,引用了一块堆外的内存如果堆外内存足够,就直接预留一部分内存。 如果堆外内存不足,则将已经被.原创 2020-07-08 17:36:15 · 523 阅读 · 0 评论 -
堆外内存的理解(面试)
堆内和堆外的概念:堆内内存,heap,off-heap硬件层面的内存,其实就是一根内存条而已,自己去购买内存条,在笔记本电脑里是可以装更多的内存条的,习惯于用32GB内存的笔记本电脑,买16GB内存,装在里面。如何用堆外内存?ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // 传入的是你要申请的堆外内存的大小// 你可以直接把你的数据写入到内外内存DirectByteBuffer里去// 把这块数据通过Socket发送,就是直接原创 2020-07-08 17:30:39 · 478 阅读 · 0 评论 -
XSS网络攻击与的原理是什么(面试)
XSS网络攻击的原理是什么XSS是大部分的黑客进行网络攻击的手段,XSS的全称是Cross Site Script,就是跨站点脚本攻击,意思就是说,黑客恶意篡改你的网页的前端代码,在里面注入一些他自己的html+javascript的脚本和代码,然后你比如在访问那个网站的网页的时候,他注入的那些恶意脚本就会运行了。恶意脚本运行的时候就会控制你的浏览器,这个时候他的脚本就可以做很多很多的事情了。第一种XSS攻击是反射型攻击,他主要是想办法让你点击一个URL链接,在这个URL链接里就嵌入他自己的恶意原创 2020-07-07 16:24:42 · 410 阅读 · 0 评论 -
Java虚拟机对锁的优化(面试)
Java虚拟机对锁的优化从JDk 1.6开始,JVM就对synchronized锁进行了很多的优化。synchronized说是锁,但是他的底层加锁的方式可能不同,偏向锁的方式来加锁,自旋锁的方式来加锁,轻量级锁的方式来加锁。这些东西本身你只要了解一个概念就可以了。synchronized(this) { //代码}锁消除:锁消除是JIT编译器对synchronized锁做的优化,在编译的时候,JIT会通过逃逸分析技术,来分析synchronized锁对象,是不是只可能被一个...原创 2020-07-07 16:07:49 · 190 阅读 · 0 评论 -
volatile关键字对原子性、可见性以及有序性的保证(面试)
volatile关键字对原子性、可见性以及有序性的保证volatile对原子性的保证真的是非常的有限,其实主要就是32位jvm中的long/double类型变量的赋值操作是不具备原子性的,加上volatile就可以保证原子性了。eg:volatile boolean isRunning = true;线程1:Release屏障isRunning = false;Store屏障=> 原理,没有过多的牵扯到内存屏障的一些东西,可见性和有序性,主要都是基于各种内存屏障来实现的。.原创 2020-07-07 15:37:32 · 637 阅读 · 0 评论 -
HTTPS的工作原理(面试)
HTTPS的工作原理是什么?浏览器把自己支持的加密规则发送给网站。 网站从这套加密规则里选出来一套加密算法和hash算法,然后把自己的身份信息用证书的方式发回给浏览器,证书里有网站地址、加密公钥、证书颁发机构。 浏览器验证证书的合法性,然后浏览器地址栏上会出现一把小锁;浏览器接着生成一串随机数密码,然后用证书里的公钥进行加密,这块走的非对称加密;用约定好的hash算法生成握手消息的hash值,然后用密码对消息进行加密,然后把所有东西都发给网站,这块走的是对称加密。 网站,从消息里面可以取出来公钥加原创 2020-07-07 15:14:46 · 899 阅读 · 0 评论 -
深入分析synchronized是如何通过加锁保证原子性的(面试)
synchronized底层的原理,monitor,没有特别细化,这里说明一下synchronized实现原子性的核心原理。简单的synchronized加锁的原理,说白了,就是在进入加锁代码块的时候加一个monitorenter的指令,然后针对锁对象关联的monitor累加加锁计数器,同时标识自己这个线程加了锁,通过monitor里的加锁计数器可以实现可重入的加锁,在出锁代码块的时候,加一个monitorexit的指令,然后递减锁计数器,如果锁计数为0,就会标志当前线程不持有锁,释放锁然后wait和n原创 2020-07-05 14:50:19 · 2523 阅读 · 0 评论 -
高速缓存和写缓冲器的内存重排序造成的假象(面试)
处理器会将数据写入写缓冲器,这个过程是store;从高速缓存里读数据,这个过程是load。写缓冲器和高速缓存执行load和store的过程,都是按照处理器指示的顺序来的,处理器的重排处理器也是按照程序顺序来load和store的。但是有个问题,就是在其他的处理器看到的一个视觉假象而言,有可能会出现看到的load和store是重排序的,也就是内存重排序。处理器的乱序执行和推测执行,都是指令重排序,这次的是内存重排序,因为都是发生在内存层面的写缓冲器和高速缓存中的。这个内存重排序,有4种可能性:原创 2020-07-05 14:29:49 · 583 阅读 · 0 评论 -
JIT编译器对创建对象的指令重排(面试)
JIT动态编译的时候,有可能会造成一个非常经典的指令重排public class MyObject { private Resource resource; public MyObject() { // 从配置文件里加载数据构造Resource对象 this.resource = loadResource(); } public void execute() { this.resource.execute();原创 2020-07-05 14:21:36 · 603 阅读 · 0 评论 -
Java程序运行过程中可能会发生指令重排的地方(面试)
写好的代码在实际执行的时候那个顺序可能在很多环节都会被人给重排序,一旦重排序之后,在多线程并发的场景下,就有可能会出现一些问题。自己写的源代码中的执行顺序:这个是我们自己写的代码,一般来说就是按照我们自己脑子里想的样子来写。 编译后的代码的执行顺序:java里有两种编译器,一个是静态编译器(javac),一个是动态编译器(JIT)。javac负责把.java文件中的源代码编译为.class文件中的字节码,这个一般是程序写好之后进行编译的。JIT负责把.class文件中的字节码编译为JVM所在操作系统支原创 2020-07-05 14:17:04 · 1074 阅读 · 1 评论 -
从硬件的级别来考虑一下可见性的问题(面试)
每个处理器都有自己的寄存器(register),所以多个处理器各自运行一个线程的时候,可能导致某个变量给放到寄存器里去,接着就会导致各个线程没法看到其他处理器寄存器里的变量的值修改了。可见性的第一个问题,首先,就有可能在寄存器的级别,导致变量副本的更新,无法让其他处理器看到。然后一个是处理器运行的线程对变量的写操作都是针对写缓冲来的(store buffer)并不是直接更新主内存,所以很可能导致一个线程更新了变量,但是仅仅是在写缓冲区里罢了,没有更新到主内存里去。这个时候,其他处理器的线程是没法原创 2020-07-05 14:11:23 · 298 阅读 · 0 评论 -
BIO、NIO、AIO分别都是啥(面试)
BIO这个其实就是最传统的网络通信模型,就是BIO,同步阻塞式IO。就是服务端创建一个ServerSocket,然后客户端用一个Socket去连接那个ServerSocket,然后ServerSocket接收到一个Socket的连接请求就创建一个Socket和一个线程去跟那个Socket进行通信。然后客户端和服务端的socket,就进行同步阻塞式的通信,客户端socket发送一个请求,服务端socket进行处理后返回响应,响应必须是等处理完后才会返回,在这之前啥事儿也干不了,这可不就是同步么。.原创 2020-07-04 14:50:24 · 334 阅读 · 0 评论 -
进程间是如何通信的(面试)
进程间的通信有很多种方式,比如说:管道(pipe)、命名管道(fifo)、消息队列,共享内存(System V)管道(pipe)unix操作系统里面,有一个fork操作,可以创建进程的子进程,或者说是复制一个进程完全一样的子进程,共享代码空间,但是各自有独立的数据空间,不过子进程的数据空间是拷贝父进程的数据空间的。管道机制要求的是两个进程之间是有血缘关系的,就比如fork出来的父子进程。linux操作系统里,管道用来缓存要在进程间传输的数据,管道是一个固定大小的缓冲区,是4kb。管道中的数据一旦原创 2020-07-04 14:40:40 · 592 阅读 · 0 评论 -
MySQL数据库锁的实现原理(面试)
mysql的锁类型,一般其实就是表锁、行锁和页锁。一般myisam会加表锁,就是myisam引擎下,执行查询的时候,会默认加个表共享锁,也就是表读锁,这个时候别人只能来查,不能写数据的;然后myisam写的时候,也会加个表独占锁,也就是表写锁,别人不能读也不能写。这个myisam引擎很少用了,所以细节问题就不需要深入的去了解了,面试的时候来这么一句就ok了。myisam其实在实际生产中,就是在报表系统里用的是最多的,当年es和kylin没出来的时候,大数据系统计算好的报表数据,都是放mysql的原创 2020-07-04 14:33:57 · 1878 阅读 · 3 评论