叮当快药

一轮

  • 限流有哪几种底层算法

常用4种限流算法介绍及比较
面试官:你知道的限流算法有哪些?

  • 计数器(固定窗口)算法
    每个时间周期只允许固定次数的请求,超出拒绝,容易产生的问题是临界问题,
    比如3s内允许的最大请求量为1000,那么会出现2个极端:
    极端情况1:
      第1s请流量为10,
      第2s请流量为10,
      第3s请流量突然激增到980.这意味着在这一刻,有大量的请求蜂拥而至,假设服务每秒能处理的上线为800/1s,但是此刻却有超过这个量级的请求量,那么后果是不堪设想的.
    极端情况2:
      第1s请流量突然就达到990,
      留给后续第2s,3s的可请求数量就非常少了,可能会出现大量的拒绝请求

  • 滑动窗口算法
    滑动窗口算法是将时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动删除过期的小周期。
    滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。
    此算法可以很好的解决固定窗口算法的临界问题。

  • 漏桶算法
    漏桶算法是访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。
    实现:用队列保存请求,用ScheduledThreadPoolExecutor(支持定时任务的线程池)来定时从队列中取请求来执行

  • 令牌桶算法
    令牌桶算法可以说是对漏桶算法的改进。漏桶算法能限制请求的速率。而令牌桶算法在限制请求速率的同时还允许一定程度的突发调用
    算法过程:

    1. 一直放令牌,如果令牌桶达到上限则丢弃令牌,假设每秒放10个
    2. 可以应对一定程度的流量激增,如此时令牌桶有100个令牌,突然发生200次调用,则此时最开始的100次请求可以正常调用,后续的请求才会以10个/s的速率来调用

    实现:用队列保存令牌,用ScheduledThreadPoolExecutor来定时放令牌

拓展:Hystrix的原理和使用

  • Redis缓存的数据量大概有多少

  • Kafka使用过程中有没有遇到什么问题

自动提交可以发生的问题
  • Kafka 轮询删除日志,对高性能的读写有影响吗 零拷贝

  • Kafka 使用ZK 选举,写入主broker,副本怎样同步,同步机制有哪些

    ZK在Kafka中的作用
    Zookeeper 在 Kafka 中的作用

    1. broker注册
    2. topic注册
    3. 生产者负载均衡
    4. 消费者负载均衡
      5.消费者注册

ZK数据同步方式



在初始化阶段,zk 的 learner会优先初始化以全量同步方式来同步数据
learner先向leader注册,上报peerLastZxid

  • ZK 很多机器都往zk写入数据的话 会有什么问题

  • NG 负载均衡的配置 NG会开发一些脚本吗

  • CAP有了解吗 ZK 是哪种

zk是CP系统
不能保证可用性 也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果

  • ZK主从选举保证的什么

zk初始化选举和崩溃选举

2
  • Java的多线程用过吗

  • 定时的线程池,线程是一开始初始化好的,还是新来任务之后陆续初始化的?

  • 如果想new出现线程池之后直接初始化好所有的核心线程数,怎么实现

  • 用过ThreadLocal 吗 什么场景?内存泄漏的风险

  • 强引用,弱引用,虚引用

在Java中,我们的垃圾回收机制回收垃圾的时候就会根据对象的引用,判断对象是否可以被垃圾回收,这里有两种:

  1. 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加一,当引用失效时,计数器减一,当计数器为0时,则认为该对象可以被回收。
  2. 可达性分析算法(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中事务底层是怎样实现的,

  • 如果让你实现一个事务,该怎么来做

你可能感兴趣的:(叮当快药)