Browse Source

fix:wind指标超限调整,由wind方返回数据做校验

Roc 2 years ago
parent
commit
b7ecc45bef
1 changed files with 57 additions and 9 deletions
  1. 57 9
      services/base_from_wind.go

+ 57 - 9
services/base_from_wind.go

@@ -42,7 +42,17 @@ func GetEdbDataFromWind(edbCode, startDate, endDate string) (item *EdbDataFromWi
 	//异常的话,需要邮件通知
 	if len(item.ErrorCode) > 0 {
 		if item.ErrorCode["0"] != 0 {
-			go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind数据服务异常,edbCode:%s,ErrorCode:%d", edbCode, item.ErrorCode["0"]), 3)
+			if item.ErrorCode["0"] == -40520005 {
+				// 设置服务器已超限
+				SetIsLimitEdbCodeInWindUrl(windUrl)
+				err = DeleteEdbCodeInWindUrl(edbCode)
+				if err != nil {
+					return
+				}
+				return GetEdbDataFromWind(edbCode, startDate, endDate)
+			} else {
+				go alarm_msg.SendAlarmMsg(fmt.Sprintf("wind数据服务异常,edbCode:%s,ErrorCode:%d", edbCode, item.ErrorCode["0"]), 3)
+			}
 		}
 	}
 	return
@@ -64,16 +74,26 @@ func GetWindUrl(edbCode string) (windUrl string, err error) {
 	//如果缓存中没有的话,那么从配置中获取
 	for _, windUrlMap := range utils.Hz_Wind_Data_Url_LIST {
 		//判断该url是否被占满了
-		count, tmpErr := GetCountEdbCodeInWindUrl(windUrlMap.Url)
-		if tmpErr != nil && tmpErr.Error() != "nil returned" {
+		//count, tmpErr := GetCountEdbCodeInWindUrl(windUrlMap.Url)
+		//if tmpErr != nil && tmpErr.Error() != "nil returned" {
+		//	err = tmpErr
+		//	return
+		//}
+		//if count < windUrlMap.Num {
+		//	windUrl = windUrlMap.Url
+		//	AddEdbCodeInWindUrl(windUrlMap.Url, edbCode)
+		//	return
+		//}
+		//如果超限了,那么进入下一循环
+		isLimit, tmpErr := GetIsLimitEdbCodeInWindUrl(windUrlMap.Url)
+		if isLimit {
 			err = tmpErr
-			return
-		}
-		if count < windUrlMap.Num {
-			windUrl = windUrlMap.Url
-			AddEdbCodeInWindUrl(windUrlMap.Url, edbCode)
-			return
+			continue
 		}
+
+		windUrl = windUrlMap.Url
+		AddEdbCodeInWindUrl(windUrlMap.Url, edbCode)
+		return
 	}
 	return
 }
@@ -88,6 +108,27 @@ func GetCountEdbCodeInWindUrl(windUrl string) (num int, err error) {
 	return
 }
 
+// GetIsLimitEdbCodeInWindUrl 从缓存key中获取是否超限
+func GetIsLimitEdbCodeInWindUrl(windUrl string) (isLimit bool, err error) {
+	cacheKey := utils.CACHE_WIND_URL + ":limit:" + time.Now().Format(utils.FormatDateUnSpace) + ":" + utils.MD5(windUrl)
+
+	num, err := utils.Rc.RedisInt(cacheKey)
+	if err != nil && err.Error() == "redigo: nil returned" {
+		err = nil
+	}
+	if num > 0 {
+		isLimit = true
+	}
+	return
+}
+
+// SetIsLimitEdbCodeInWindUrl 设置服务器已超限
+func SetIsLimitEdbCodeInWindUrl(windUrl string) {
+	cacheKey := utils.CACHE_WIND_URL + ":limit:" + time.Now().Format(utils.FormatDateUnSpace) + ":" + utils.MD5(windUrl)
+	_ = utils.Rc.SetNX(cacheKey, 1, utils.GetTodayLastSecond())
+	return
+}
+
 // AddEdbCodeInWindUrl 将指标插入到缓存key中
 // @return isInsert bool 是否插入数据,true时为插入数据,false表示数据已存在
 func AddEdbCodeInWindUrl(windUrl, edbCode string) (isInsert bool) {
@@ -98,3 +139,10 @@ func AddEdbCodeInWindUrl(windUrl, edbCode string) (isInsert bool) {
 	utils.Rc.Incrby(cacheKey2, 1)
 	return
 }
+
+// DeleteEdbCodeInWindUrl 删除指标编码 服务器归属 缓存
+func DeleteEdbCodeInWindUrl(edbCode string) (err error) {
+	cacheKey := utils.CACHE_WIND_URL + ":" + edbCode
+	err = utils.Rc.Delete(cacheKey)
+	return
+}