使用Hystrix实现延迟消费
背景: 一分钟内要消费100万条数据,大量并发使服务器CPU、内存、网络等 在短时间内存急剧上升,如果这100万条数据,每条有都需要落库,或者操作数据库,对数据库影响比较大,所以要进行延迟消费。
表现: 处理100万条数据时,都要调后端的每个接口或者某个方法,或者 出现跨系统调用,对别的系统也有影响。
目的: 原本1–2分钟内消费完100万条数据;调整30分钟或者1小时内消费完;
步骤:
1.依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
- 启动类
@EnableHystrix
@EnableHystrixDashboard - 方法增加配置 hystrix 注解配置
可以调节线程池大小、队列长度、线程存活时间
@HystrixCommand(commandKey ="getUserBaseInfoByUserName",groupKey="getUserBaseInfoByUserNameGroup",
threadPoolKey="getUserBaseInfoByUserName",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "2"),//线程池大小
@HystrixProperty(name = "maxQueueSize", value = "1000000"),//最大队列长度
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2") },//线程存活时间
commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"),//执行策略: 多线程
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "60000" )//超时时间
})
@Override
public ResponseBody getUserBaseInfoByUserName(String userName) throws Exception{
try{
if(checkParams() && StringUtils.isNotBlank(userUrl) && StringUtils.isNotBlank(userName)){
// 组装参数
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.FFF");
String requestTimestamp = sdf.format(new Date());
String sign = MD5Util.getSign(appCode, businessId, requestTimestamp, safetyKey, userName);
String url = userUrl.concat("/" + userName);
...........................................................................................................................................