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)也不好。扇出过 大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。