第一个题目:介绍一下最近做的项目
第二个题目:我对你项目有个地方比力感兴趣啊。就是你用的那个二级缓存,你的吞吐量有多大啊,为什么需要使用二级缓存?
答: 在二级缓存策略下,条记详情接口的吞吐量为 9282/s , 匀称相应时间为 10ms, 相比力直接走数据库查询,肯定是快的非常多。
第三个题目:缓存和数据库的一致性是如何包管的呢?
第四个题目:Redis是会合缓存,Caffeine是本地缓存,通常来说MQ的消息是呆板中的一个实例去消费的,那其他实例的缓存如何解决?
第五个题目:我们在生产环境上它一个服务,大概摆设多台呆板。消费不会每台呆板都消费同一个消息吧,所以你的代码应该考虑这种场景。
第六个题目:什么叫缓存穿透?
当用户访问的数据,既不在缓存中,也不在数据库中,导致哀求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库也没有要访问的数据,没办法构建缓存数据,来服务后续的哀求。当有大量如许的哀求到来时,数据库的压力骤增,这就是缓存穿透题目。
第七个题目:解说一下布隆过滤器的原理
布隆过滤器由[初始值都为0的位图数组]和[N个哈希函数]两部门组成。当我们写入数据库时,在布隆过滤器里做个标记,如许在下次查询数据是否存在数据库时,只需要查询布隆过滤器,如果查询到数据没有被标记,阐明不在数据库中。
布隆过滤器会通过3个操作完成标记:
- 第一步,使用N个哈希函数分别对数据进行哈希盘算,得到N个哈希值
- 第二步,将第一步得到的 N 个哈希值队位图数组的长度取模,得到每个哈希值在位图数组的对应位置、
- 第三步,将每个哈希值在位图数组的对应位置设置为1。
第八个题目:讲一下令牌桶和漏桶的区别吧。
令牌桶与漏桶算法对比
8.1. 令牌桶(Token Bucket)
- 工作原理:令牌以固定速率生成并存储在桶中,哀求需要消耗令牌来进行处置惩罚。令牌可以积攒,允许肯定的突发流量。
- 特性:
- 允许突发流量
- 哀求可以等候令牌
- 控制流量的匀称速率
- 适用场景:API 限流、网络流量控制、带宽管理等。
8.2. 漏桶(Leaky Bucket)
- 工作原理:哀求进入桶后,以固定速率处置惩罚,如果桶满了,新的哀求会被丢弃。没有突发流量,输出速率恒定。
- 特性:
- 不允许突发流量
- 固定速率输出
- 超过容量的哀求会丢失
- 适用场景:防止流量洪峰、稳固带宽控制、视频流输出等。
8.3. 令牌桶与漏桶的区别
特性令牌桶(Token Bucket)漏桶(Leaky Bucket)流量控制允许突发流量,流量灵活不允许突发流量,流量平稳哀求处置惩罚哀求可以等候令牌哀求超出容量会被丢弃输出速率可变速率,平滑流量恒定速率输出典型应用API 限流、带宽控制防止流量洪峰、视频流稳固输出 总结:
- 令牌桶得当平滑控制并允许突发流量的场景。
- 漏桶得当对输出速率有严格要求并不允许突发流量的场景。
第九个题目: Ratelimiter令牌桶实现流量削峰防止打垮数据库,那么这个令牌桶是本地限流吗还是全局限流?
本项目采用的是本地API进行的局部限流,没有存到Redis进行全局限流。全局限流是不管加多少呆板,要求整个服务一秒。
第十个题目:能说一下Java中线程池中有哪些参数以及此中的作用。
第十一个题目:如果使用无界队列作为线程池中的阻塞队列会有什么环境。
如果在线程池中使用 无界队列(如 LinkedBlockingQueue)作为阻塞队列,大概会导致以下几个题目:
无界队列没有大小限制,意味着可以无限制地接受任务。当任务被提交到线程池时,任务会被放入队列中,纵然所有线程池中的工作线程都忙碌,队列也会继续吸收新的任务。如许,线程池的核心线程数大概会不停存在,而不会有线程因任务完成而被开释。
效果:线程池的核心线程数不会因为任务列队而减少,大概会导致线程池中的线程始终处于活动状态,浪费体系资源。
如果无界队列不断积存任务且没有适当的控制机制(如监控队列长度或主动扬弃任务等),大概会导致内存被任务堆积消耗,甚至导致 内存溢出。虽然无界队列不会像有界队列那样会阻塞新任务的提交,但无止境的任务积存会占用大量内存。
效果:内存消耗增大,大概导致 OutOfMemoryError 或体系性能下降。
使用无界队列时,线程池的负载大概无法被有效控制。线程池会尽最大本领实行任务,但是队列会无限制增长,从而影响体系的稳固性。没有队列大小的限制,无法包管任务的积存程度,导致任务大概会不停等候而得不到实时实行。
效果:大概出现某些任务长时间没有实行,体系相应时间不可预测,甚至导致任务丢失(如果不处置惩罚好队列)。
在一些极端环境下,如果体系不断提交任务而没有充足的工作线程来实行这些任务,尽管线程池会尝试分配空闲线程实行任务,但由于无界队列的存在,任务会无限制地积存,这就会导致线程池的负载过重,大概导致 资源耗尽(如 CPU 和内存等)。
效果:体系的性能会严重下降,甚至大概瓦解。
无界队列大概导致任务的实行延迟,因为任务会被推入队列中等候实行,而队列的大小没有限制,大概会导致任务在队列中等候很长时间。虽然不会立刻丢失任务,但任务的实行时间变得不可预测,体系的相应性降低。
6. 没有流量控制
有界队列可以或许有效地控制队列中的任务量,防止提交过多任务给线程池。而无界队列则没有这个控制本领,线程池大概会因为吸收过多任务而导致过载,如许无法动态地应对高负载的环境。
解决方法:
使用有界队列:可以为队列设置大小限制,防止任务积存过多。常用的有界队列如 ArrayBlockingQueue。
使用自界说拒绝策略:当队列满时,可以通过 RejectedExecutionHandler 设置拒绝策略,扬弃任务、抛出异常、或者直接将任务提交到外队伍列等。
动态调解线程池大小:可以通过合理的核心线程数和最大线程数来控制线程池的并发本领,避免过度并发。
总的来说,使用无界队列时需要谨慎,合理配置线程池和队列,确保体系的稳固性和性能。如果没有适当的流量控制和任务限制机制,大概导致体系过载、内存消耗过大或者任务积存题目。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |