职场面试题总结(14)---关注量和粉丝使用redis那个数据、数据库查询语句、Hsrtix熔断、扇入与扇出

90 阅读4分钟

1、关注量和粉丝使用redis那个数据合适?为什么用set?如何实现?

采用 Redis 的 Set 类型 ,这是一种 string 类型的无序集合,成员具有唯一性,哈希表实现,复杂度为 O(1) ,成员的最大数量是 ,大约是40亿。

关注Key:followUID

粉丝Key:fansStaffID

2、数据库查询语句,在Like在索引列上进行查询会走索引吗?

(1)like '%1212%'; 不会触发。

(2)like '%1212'; 不会触发。

(3)like '1212%'; 会触发。

3、Hsrtix熔断的两种策略是什么?

线程池

(1)coresize

比如这个coresize,默认是10,平常看起来是ok的,但一旦面临高并发,就会爆掉 用户请求都会被包装成一个hytrix请求,hytrix使用ThreadPoolExecutor来管理线程池,一旦超限,就会爆掉比如有30个rps,平均每个请求响应时间为0.2s,那么需要的线程数就是300.2=6,然后加上一个附加值,比如说4,6+4=10如果是100rqs,每个响应时间0.2, 1000.2=20,那就是至少20个线程。当然,此时请求平均响应时间应该会延长,应该根据实际情况计算。

(2)maximumSize

有了coresize当然有maximumsize了,一般coresize = maximumsize,只有当你设置allowMaximumSizeToDivergeFromCoreSize=true时才起作用。

(3)maxQueueSize

线程池的队列配置,如果线程超过线程池大小coresize,会进入该队列排队。默认是-1,就是SynchronousQueue,如果设置为正值,会使用LinkedBlockingQueue。该配置不可修改,如果修改,必须要重启应用才会生效。

(4)queueSizeRejectionThreshold

队列的拒绝门槛。即使在队列中排队的线程未达到最大值,只要超过了这个阀值,请求线程都会被丢弃掉,所以maxQueueSize某种意义是没用的。

(5)keepAliveTimeMinutes

线程在队列中的存活事件,默认值是1(应该是1s),需要allowMaximumSizeToDivergeFromCoreSize=true。

(6)allowMaximumSizeToDivergeFromCoreSize

设置maximumSize和keepAliveTimeMinutes是否起作用,默认是false,就是不起作用

滑动窗口与阀值微调

Hystrix遇到服务错误时,会开启一个10s的窗口,如果在该窗口内错误调用未达到阀值,那么程序继续。如果达到阀值,那么断路器会跳闸,跳闸的同时,会启动一个新的活动窗口5s,在5s的窗口期间会尝试将一个请求发到对方服务。如果失败,继续保持断路状态。如果成功,重启10s的滑动窗口。

参数说明:

(1)circuitBreaker.requestVolumeThreshold

表示在10s中必须发生的连续调用次数阀值。比如这个值是20,那么及时在10s的时间窗口中全部19个请求失败了,也不会触发熔断。

(2)circuitBreaker.errorThresholdPercentage

错误阀值,超过这个阀值会触发熔断,所有的请求都会打到fallback上。

(3)circuitBreaker.sleepWindowInMilliseconds

发生熔断后,熔断器会睡眠多长时间后,才会再次尝试访问对方服务。

(4)metrics.rollingStats.timeInMilliseconds

窗口大小,默认10s。

(5)metrics.rollingStats.numBuckets

桶的个数,必须被timeInMilliseconds整除。比如numBuckets=2,那么 timeInMilliseconds/numBuckets = 5,就是在5秒内Hystrix展开监控。

线程池隔离

优点:

1)支持排队和超时。

2)支持异步调用。

缺点:线程调用会产生额外的开销。

适用:

1)不受信客户。

2)有限扇出。

信号量隔离

优点:

1)轻量。

2)无额外开销。

缺点:

1)不支持任务排队和主动超时。

2)不支持异步调用。

适用:

受信客户。

高扇出(网关)。

高频高速调用(cache)。

4、扇入与扇出

扇入: 扇入是指直接调用该模块的上级模块的个数。扇入大表示模块的复用程序高。

扇出: 扇出是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,需要控制和协调过多的下级模块;但扇出过小(例如总是1)也不好。扇出过 大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。