亿级流量电商详情页系统实战-39.基于hystrix的信号量技术

1.线程池隔离技术与信号量隔离技术的区别

在这里插入图片描述
在这里插入图片描述

2.线程池隔离技术与信号量隔离技术使用场景

  • 线程池:适合绝大多数的场景,99%的,线程池,对依赖服务的网络请求的调用和访问,timeout这种问题

  • 信号量:适合你的访问不是对外部依赖的访问,而是对内部的一些比较复杂的业务逻辑的访问。但是像这种访问,系统内部的代码,其实不涉及任何的网络请求,那么只要做信号量的普通限流就可以了,因为不需要去捕获timeout类似的问题,算法+数据结构的效率不是太高,并发量突然太高,因为这里稍微耗时一些,导致很多线程卡在这里的话,不太好,所以进行一个基本的资源隔离和访问,避免内部复杂的低效率的代码,导致大量的线程被hang住。

3.信号量使用

@RequestMapping("/getProductInfo")
@ResponseBody
public String getProductInfo(Long productId) {
	// 拿到一个商品id
	// 调用商品服务的接口,获取商品id对应的商品的最新数据
	// 用HttpClient去调用商品服务的http接口
	HystrixCommand<ProductInfo> getProductInfoCommand = new GetProductInfoCommand(productId);
	ProductInfo productInfo = getProductInfoCommand.execute();
	
	Long cityId = productInfo.getCityId();
	GetCityNameCommand getCityNameCommand = new GetCityNameCommand(cityId);
	String cityName = getCityNameCommand.execute();
	productInfo.setCityName(cityName); 

	System.out.println(productInfo);  
	return "success";
}


public class GetCityNameCommand extends HystrixCommand<String> {

	private Long cityId;
	
	public GetCityNameCommand(Long cityId) {
		super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GetCityNameGroup"))
		        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
		               .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)));
		this.cityId = cityId;
	}
	
	@Override
	protected String run() throws Exception {
		return LocationCache.getCityName(cityId);
	}
	
}

public class LocationCache {

	private static Map<Long, String> cityMap = new HashMap<Long, String>();
	
	static {
		cityMap.put(1L, "北京"); 
	}
	
	public static String getCityName(Long cityId) {
		return cityMap.get(cityId);
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值