作为一名程序员,并发数已经服务器宕机这种,大家肯定都不陌生。
传统的服务提供,已经陆续的被目前的微服务所取代,但是微服务本身也是容易存在某些问题的,例如服务雪崩。
不管是zookeeper或者是Eureka,他们自身都是包含服务注册,也包含心跳机制,来确保服务提供方正确运行。
我在思考,是不是可以进一步在微服务的基础下,对服务进行主题分类。
一、服务限流
针对每个服务提供应用,进行限流。在服务代码前置下增加流量监控,要小于服务器的最大线程数。
例如:每个进入A服务器提供的服务的请求,都会先进入日志监听,然后增加切面进行流量监控。
限流可以分级限流:服务器限流、主题限流、服务限流
二、服务分类
从soap理念开始,大家就已经习惯了服务总线的存在,一方面方便大家统计现存的有哪些服务,一方面可以通过总线进行合理调度。
我们可以在微服务的基础下,每一个微服务再详细的对服务进行分类。按照主题进行拆分。
主题的区分可以按照表之间的相互影响来区分,例如更新和插入类某表,然后增加标志,判断是否有必要进行监控。
三、服务降级
针对已经分好的服务,我们可以根据服务的响应效率,对服务进行降级处理,减少他的并发数,例如服务响应时间超过3min,那么就可以把他标记为降级服务
此类服务会减少并发数,最大并发数设置为5-10。等其平均速度恢复后,在恢复并发数限制。
四、服务熔断
如果服务连续多次没有响应,那么可以考虑,将此服务注销,前提是非应用问题,是代码本身存在的问题。
针对这种统一友好提示为失败,然后通过补偿措施,在服务修复后,重新唤醒服务。
五、代码实现
private static Map<String, FwddFwxxDTO> fwContainer = new ConcurrentHashMap<>(); private static Map<Integer,Integer> lazyContainer = new ConcurrentHashMap<>(); private static Map<String,Map<String,Integer>> breakContainer = new ConcurrentHashMap<>(); public void loadStart(String fwbm, Object ...objects) { final FwddFwxxDTO dto = new FwddFwxxDTO(); final String id = SwordSessionUtils.getSessionID(); dto.setId(id); dto.setStart(new Date()); if(!fwContainer.containsKey(id)) { fwContainer.put(id, dto); } } public void loadEnd(String fwbm, Object ...objects) { final String id = session.getId(); if(fwContainer.containsKey(id)) { final FwddFwxxDTO dto = fwContainer.get(id); final int value = dto.hashCode(); final Date start = dto.getStart(); int time = start.compareTo(new Date()); if(time > 5000) { //先记录懒的 int num = lazyContainer.getOrDefault(value, 0); num++; lazyContainer.put(value, num); //再记录坏的 Map<String,Integer> map_break = breakContainer.getOrDefault(fwbm, null); if(isNull(map_break)) { } } } }