浏览代码

fix:wind服务器地址获取调整,顺序获取url

Roc 2 年之前
父节点
当前提交
b4237100dc
共有 2 个文件被更改,包括 66 次插入9 次删除
  1. 55 8
      services/base_from_wind.go
  2. 11 1
      utils/constants.go

+ 55 - 8
services/base_from_wind.go

@@ -2,11 +2,11 @@ package services
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/http"
 	"hongze/hongze_edb_lib/services/alarm_msg"
 	"hongze/hongze_edb_lib/utils"
-	"math/rand"
 	"time"
 )
 
@@ -19,7 +19,11 @@ type EdbDataFromWind struct {
 
 // GetEdbDataFromWind 获取wind数据
 func GetEdbDataFromWind(edbCode, startDate, endDate string) (item *EdbDataFromWind, err error) {
-	windUrl := getRandWindUrl()
+	windUrl, err := GetWindUrl(edbCode)
+	if err != nil {
+		go alarm_msg.SendAlarmMsg(fmt.Sprintf("获取wind服务器地址失败,err:%s", err.Error()), 3)
+		return
+	}
 	thsUrl := windUrl + `edbInfo/wind?EdbCode=%s&StartDate=%s&EndDate=%s`
 	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
 	utils.FileLog.Info(fmt.Sprintf("windUrl:%s", thsUrl))
@@ -43,10 +47,53 @@ func GetEdbDataFromWind(edbCode, startDate, endDate string) (item *EdbDataFromWi
 	return
 }
 
-// getRandWindUrl 获取wind的url
-func getRandWindUrl() string {
-	windUrlLen := len(utils.Hz_Wind_Data_Url_LIST)
-	rand.Seed(time.Now().UnixNano())
-	i := rand.Intn(windUrlLen) //生成随机整数(不包含最右边的整数,所以不需要将域名的长度-1)
-	return utils.Hz_Wind_Data_Url_LIST[i]
+// GetWindUrl 获取wind的url
+func GetWindUrl(edbCode string) (windUrl string, err error) {
+	defer func() {
+		if err == nil && windUrl == "" {
+			err = errors.New("获取wind服务器地址失败,指标超限了")
+		}
+	}()
+	//从缓存中获取
+	cacheKey := utils.CACHE_WIND_URL + ":" + edbCode
+	windUrl, _ = utils.Rc.RedisString(cacheKey)
+	if windUrl != "" {
+		return
+	}
+	//如果缓存中没有的话,那么从配置中获取
+	for _, windUrlMap := range utils.Hz_Wind_Data_Url_LIST {
+		//判断该url是否被占满了
+		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
+		}
+	}
+	return
+}
+
+// GetCountEdbCodeInWindUrl 从缓存key中获取已经插入入的指标数
+func GetCountEdbCodeInWindUrl(windUrl string) (num int, err error) {
+	cacheKey := utils.CACHE_WIND_URL + time.Now().Format(utils.FormatDateUnSpace) + ":" + utils.MD5(windUrl)
+	num, err = utils.Rc.RedisInt(cacheKey)
+	if err != nil && err.Error() == "redigo: nil returned" {
+		err = nil
+	}
+	return
+}
+
+// AddEdbCodeInWindUrl 将指标插入到缓存key中
+// @return isInsert bool 是否插入数据,true时为插入数据,false表示数据已存在
+func AddEdbCodeInWindUrl(windUrl, edbCode string) (isInsert bool) {
+	cacheKey := utils.CACHE_WIND_URL + ":" + edbCode
+	isInsert = utils.Rc.SetNX(cacheKey, windUrl, utils.GetTodayLastSecond())
+
+	cacheKey2 := utils.CACHE_WIND_URL + time.Now().Format(utils.FormatDateUnSpace) + ":" + utils.MD5(windUrl)
+	utils.Rc.Incrby(cacheKey2, 1)
+	return
 }

+ 11 - 1
utils/constants.go

@@ -65,13 +65,22 @@ var (
 	BASE_END_DATE_UnSpace   = time.Now().AddDate(4, 0, 0).Format(FormatDateUnSpace)   //基础数据结束日期
 )
 
+type WindUrlMap struct {
+	Url string
+	Num int
+}
+
 var (
 	Hz_Ths_Data_Url       string                                   //同花顺,万得接口服务地址(阿里云windows服务器地址)
 	Hz_Wind_Data_Url      = "http://datawind.hzinsights.com:8040/" //万得接口服务地址
 	Hz_Pb_Data_Url        = "http://datapb.hzinsights.com:8040/"   //彭博接口地址
 	Hz_LT_Data_Url        = "http://dataek.hzinsights.com:8040/"   //路透社接口地址
 	EDB_DATA_LIMIT        = 10
-	Hz_Wind_Data_Url_LIST = []string{"http://datawind.hzinsights.com:8040/", "http://datawind2.hzinsights.com:8040/", "http://datawind3.hzinsights.com:8040/"}
+	Hz_Wind_Data_Url_LIST = []WindUrlMap{
+		{Url: "http://datawind.hzinsights.com:8040/", Num: 2000},
+		{Url: "http://datawind2.hzinsights.com:8040/", Num: 100},
+		{Url: "http://datawind3.hzinsights.com:8040/", Num: 100},
+	}
 )
 
 const (
@@ -88,4 +97,5 @@ const (
 const (
 	CACHE_EDB_DATA_ADD     = "CACHE_EDB_DATA_ADD_"
 	CACHE_EDB_DATA_REFRESH = "CACHE_EDB_DATA_REFRESH_"
+	CACHE_WIND_URL         = "CACHE_WIND_URL"
 )