一轮
-
限流有哪几种底层算法
常用4种限流算法介绍及比较
面试官:你知道的限流算法有哪些?
-
计数器(固定窗口)算法
每个时间周期只允许固定次数的请求,超出拒绝,容易产生的问题是临界问题,
比如3s内允许的最大请求量为1000,那么会出现2个极端:
极端情况1:
第1s请流量为10,
第2s请流量为10,
第3s请流量突然激增到980.这意味着在这一刻,有大量的请求蜂拥而至,假设服务每秒能处理的上线为800/1s,但是此刻却有超过这个量级的请求量,那么后果是不堪设想的.
极端情况2:
第1s请流量突然就达到990,
留给后续第2s,3s的可请求数量就非常少了,可能会出现大量的拒绝请求 -
滑动窗口算法
滑动窗口算法是将时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动删除过期的小周期。
滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。
此算法可以很好的解决固定窗口算法的临界问题。 -
漏桶算法
漏桶算法是访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。
实现:用队列保存请求,用ScheduledThreadPoolExecutor(支持定时任务的线程池)来定时从队列中取请求来执行 -
令牌桶算法
令牌桶算法可以说是对漏桶算法的改进。漏桶算法能限制请求的速率。而令牌桶算法在限制请求速率的同时还允许一定程度的突发调用
算法过程:- 一直放令牌,如果令牌桶达到上限则丢弃令牌,假设每秒放10个
- 可以应对一定程度的流量激增,如此时令牌桶有100个令牌,突然发生200次调用,则此时最开始的100次请求可以正常调用,后续的请求才会以10个/s的速率来调用
实现:用队列保存令牌,用ScheduledThreadPoolExecutor来定时放令牌
-
Redis缓存的数据量大概有多少
-
Kafka使用过程中有没有遇到什么问题
-
Kafka 轮询删除日志,对高性能的读写有影响吗 零拷贝
-
Kafka 使用ZK 选举,写入主broker,副本怎样同步,同步机制有哪些
ZK在Kafka中的作用
Zookeeper 在 Kafka 中的作用- broker注册
- topic注册
- 生产者负载均衡
- 消费者负载均衡
5.消费者注册
ZK数据同步方式
在初始化阶段,zk 的 learner会优先初始化以全量同步方式来同步数据
learner先向leader注册,上报peerLastZxid
-
ZK 很多机器都往zk写入数据的话 会有什么问题
-
NG 负载均衡的配置 NG会开发一些脚本吗
-
CAP有了解吗 ZK 是哪种
zk是CP系统
不能保证可用性 也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果
-
ZK主从选举保证的什么
2
-
Java的多线程用过吗
-
定时的线程池,线程是一开始初始化好的,还是新来任务之后陆续初始化的?
-
如果想new出现线程池之后直接初始化好所有的核心线程数,怎么实现
-
用过ThreadLocal 吗 什么场景?内存泄漏的风险
-
强引用,弱引用,虚引用
在Java中,我们的垃圾回收机制回收垃圾的时候就会根据对象的引用,判断对象是否可以被垃圾回收,这里有两种:
- 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加一,当引用失效时,计数器减一,当计数器为0时,则认为该对象可以被回收。
- 可达性分析算法(GC roots)从一个被称为GC roots的对象开始往下搜索,如果一个对象到GC roots没有任何引用链相连,则说明此对象不可用。
对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
-
k8s有了解吗
二轮
-
sonar会开发规则吗
-
代码扫描有什么收获
-
快排的思路 是稳定的吗?
-
堆排序
-
链表怎么判断有环
-
二叉树的镜像
-
ThreadLocal的原理 key是什么
key是ThreadLocal类的实例对象,value为用户的值
-
stream group是什么意思
-
多线程中 join yeild
wait()方法的作用是将当前运行的线程挂起(即让其进入阻塞状态),直到notify或notifyAll方法来唤醒线程.
有了对wait方法原理的理解,notify方法和notifyAll方法就很容易理解了。既然wait方式是通过对象的monitor对象来实现的,所以只要在同一对象上去调用notify/notifyAll方法,就可以唤醒对应对象monitor上等待的线程了。notify和notifyAll的区别在于前者只能唤醒monitor上的一个线程,对其他线程没有影响,而notifyAll则唤醒所有的线程
sleep方法的作用是让当前线程暂停指定的时间(毫秒),sleep方法是最简单的方法,在上述的例子中也用到过,比较容易理解。唯一需要注意的是其与wait方法的区别。最简单的区别是,wait方法依赖于同步,而sleep方法可以直接调用。而更深层次的区别在于sleep方法只是暂时让出CPU的执行权,并不释放锁。而wait方法则需要释放锁。
yield方法的作用是暂停当前线程,以便其他线程有机会执行,不过不能指定暂停的时间,并且也不能保证当前线程马上停止。yield方法只是将Running状态转变为Runnable状态。
join方法的作用是父线程等待子线程执行完成后再执行,换句话说就是将异步执行的线程合并为同步的线程。
-
volitile 内存可见性的底层原理
-
Kafka看过源码吗?
三轮
-
研发效能平台为什么能提高效率?
-
kafka 为什么快
零拷贝技术,
两种零拷贝方案 MMap sendfile
MMap三次拷贝 sendfile两次拷贝,多出的一次是CPU拷贝 从内核拷贝到用户进程
rocketMQ使用MMAP Kafka使用sendfile 所以rocketmq能达到十万级别,kafka能达到百万级别
但为什么rocketmq不适用sendfile 因为rocketmq可以处理消息的顺序,消息的过滤
Kafka不能完成,因为sendfile压根就没有到达数据应用层,内核中无法处理这些操作。
-
消息队列怎么保证不丢消息
-
filebeat如果采集过,怎么再采集一次 配置在哪里
-
list里学生对象,根据学生年龄排序
-
HashMap与hashtable的区别
-
synchronize修饰一个方法,这个方法如果是静态的和非静态的有什么区别
使用synchronized修饰静态方法和非静态方法有什么区别 -
Java默认有哪些线程池,
-
spring中事务底层是怎样实现的,
-
如果让你实现一个事务,该怎么来做
网友评论