作为一名程序员,并发数已经服务器宕机这种,大家肯定都不陌生。
传统的服务提供,已经陆续的被目前的微服务所取代,但是微服务本身也是容易存在某些问题的,例如服务雪崩。
不管是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)) {
}
}
}
}