Skip to content

Commit

Permalink
add ad info reload timer
Browse files Browse the repository at this point in the history
  • Loading branch information
wenweihu86 committed Oct 22, 2017
1 parent 1a26eb6 commit 7fca3a2
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 19 deletions.
2 changes: 2 additions & 0 deletions conf/ad_server.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ GeoLocationFileName = "./data/GeoLiteCity-Location.csv"

# 广告字典
AdFileName = "./data/ad_info.txt"
# 广告文件重加载时间间隔,单位秒
AdFileReloadInterval = 1

# 1:debug 2:info 3:warn 4:error 5:fatal
LogLevel = 1
Expand Down
10 changes: 5 additions & 5 deletions src/adhandler/search_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
// searchId
req.SearchId = uuid.NewV4().String()

adData := adserver.AdDictObject.GetCurrentAdData()
// search by request ip
adDict := adserver.AdDict
var unitIdList1 []uint32
var exist1 bool
locationInfo := adserver.SearchLocationByIp(req.Ip)
Expand All @@ -59,11 +59,11 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
adserver.AdServerLog.Debug(fmt.Sprintf(
"ip=%s country=%s city=%s\n", req.Ip, country, city))
key := strings.ToLower(country) + "_" + strings.ToLower(city)
unitIdList1, exist1 = adDict.LocationUnitMap[key]
unitIdList1, exist1 = adData.LocationUnitMap[key]
}
// search by CN_ALL
key := "cn_all"
unitIdList2, exist2 := adDict.LocationUnitMap[key]
unitIdList2, exist2 := adData.LocationUnitMap[key]
// merge two unit id list
unitNum := 0
if exist1 {
Expand All @@ -87,8 +87,8 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
random := rand.New(rand.NewSource(time.Now().UnixNano()))
randIndex := random.Intn(unitNum)
unitId := unitIdList[randIndex]
unitInfo := adDict.AdUnitMap[unitId]
adCreative := adDict.AdCreativeMap[unitInfo.CreativeId]
unitInfo := adData.AdUnitMap[unitId]
adCreative := adData.AdCreativeMap[unitInfo.CreativeId]

adInfo := adserver.AdInfo{
UnitId: unitInfo.UnitId,
Expand Down
88 changes: 75 additions & 13 deletions src/adserver/ad_dict.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"strings"
"bufio"
"strconv"
"time"
)

type AdUnitInfo struct {
Expand All @@ -24,33 +25,91 @@ type AdCreativeInfo struct {
ClickUrl string
}

type AdDictInfo struct {
type AdDataInfo struct {
AdUnitMap map[uint32]AdUnitInfo
AdCreativeMap map[uint32]AdCreativeInfo
LocationUnitMap map[string][]uint32
}

var AdDict *AdDictInfo

func init() {
AdDict = &AdDictInfo{
func NewAdDataInfo() *AdDataInfo {
return &AdDataInfo{
AdUnitMap: make(map[uint32]AdUnitInfo),
AdCreativeMap: make(map[uint32]AdCreativeInfo),
LocationUnitMap: make(map[string][]uint32),
}
}

func LoadAdDict(dictFileName string) {
dictFile, err := os.Open(dictFileName)
type AdDict struct {
AdDataArray []*AdDataInfo
CurrentIndex uint32
FileName string
LastModifiedTime int64
}

var AdDictObject *AdDict

// 初始化广告对象
func NewAdDict(dictFileName string) *AdDict {
adDictObject := &AdDict{
AdDataArray: make([]*AdDataInfo, 2, 2),
CurrentIndex: 0,
FileName: dictFileName,
LastModifiedTime: 0,
}
for i := 0; i < 2; i++ {
adDictObject.AdDataArray[i] = NewAdDataInfo()
}
return adDictObject
}

// 初始化之后首次加载广告信息
func (ad *AdDict) Load() {
adDataInfo := ad.loadAdDict()
ad.AdDataArray[ad.CurrentIndex] = adDataInfo
fileStat, _ := os.Stat(ad.FileName)
ad.LastModifiedTime = fileStat.ModTime().Unix()
}

// 启动定时器,用于定期重新加载广告信息
func (ad *AdDict) StartReloadTimer() {
duration := int64(time.Second) * GlobalConfObject.AdFileReloadInterval
t := time.NewTicker(time.Duration(duration))
go func() {
for t1 := range t.C {
AdServerLog.Debug("AdDict reload timer execute")
fileStat, _ := os.Stat(ad.FileName)
currentModifiedTime := fileStat.ModTime().Unix()
// 如果文件有更新,则重新加载广告内容
if currentModifiedTime > ad.LastModifiedTime {
AdServerLog.Info(fmt.Sprintf("start reload ad info dict at %s",
t1.Format("2006-01-02 03:04:05")))
adDataInfo := ad.loadAdDict()
nextIndex := 1 - ad.CurrentIndex
ad.AdDataArray[nextIndex] = adDataInfo
ad.CurrentIndex = nextIndex
ad.LastModifiedTime = currentModifiedTime
}
}
}()
}

// 获取当前可用的广告信息
func (ad *AdDict) GetCurrentAdData() *AdDataInfo {
return ad.AdDataArray[ad.CurrentIndex]
}

func (ad *AdDict) loadAdDict() *AdDataInfo {
dictFile, err := os.Open(ad.FileName)
if err != nil {
AdServerLog.Error(fmt.Sprintf(
"open file error, name=%s\n", dictFileName))
"open file error, name=%s\n", ad.FileName))
panic(-1)
}
defer dictFile.Close()

br := bufio.NewReader(dictFile)
adDataInfo := NewAdDataInfo()
lineNum := 0
br := bufio.NewReader(dictFile)
for {
line, _, err := br.ReadLine()
if err == io.EOF {
Expand All @@ -67,7 +126,7 @@ func LoadAdDict(dictFileName string) {
UnitId: uint32(unitId),
CreativeId: uint32(creativeId),
}
AdDict.AdUnitMap[adUnit.UnitId] = adUnit
adDataInfo.AdUnitMap[adUnit.UnitId] = adUnit
lineNum++
AdServerLog.Debug(fmt.Sprintf(
"read ad unit info, unitId=%d creativeId=%d\n",
Expand All @@ -90,7 +149,7 @@ func LoadAdDict(dictFileName string) {
MainImageUrl: mainImageUrl,
ClickUrl: clickUrl,
}
AdDict.AdCreativeMap[adCreative.CreativeId] = adCreative
adDataInfo.AdCreativeMap[adCreative.CreativeId] = adCreative
lineNum++
AdServerLog.Debug(fmt.Sprintf(
"read ad creative info, creativeId=%d " +
Expand All @@ -104,18 +163,21 @@ func LoadAdDict(dictFileName string) {
country := strings.ToLower(lines[2])
city := strings.ToLower(lines[3])
key := country + "_" + city
unitIdList, exist := AdDict.LocationUnitMap[key]
unitIdList, exist := adDataInfo.LocationUnitMap[key]
if !exist {
unitIdList = make([]uint32, 0)
}
unitIdList = append(unitIdList, uint32(unitId))
AdDict.LocationUnitMap[key] = unitIdList
adDataInfo.LocationUnitMap[key] = unitIdList
AdServerLog.Debug(fmt.Sprintf(
"read location target info, unitId=%d country=%s city=%s\n",
unitId, country, city))
lineNum++
} else {
panic(1)
}
}
AdServerLog.Info(fmt.Sprintf(
"read ad info file success, lineNum=%d\n", lineNum))
return adDataInfo
}
2 changes: 2 additions & 0 deletions src/adserver/global_conf.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type GlobalConf struct {
GeoBlockFileName string
GeoLocationFileName string
AdFileName string
AdFileReloadInterval int64
// log config
LogLevel int
AdServerLogFileName string
Expand Down Expand Up @@ -43,6 +44,7 @@ func LoadGlobalConf(configPath, configFileName string) {
fmt.Printf("GeoBlockFileName=%s\n", GlobalConfObject.GeoBlockFileName)
fmt.Printf("GeoLocationFileName=%s\n", GlobalConfObject.GeoLocationFileName)
fmt.Printf("AdFileName=%s\n", GlobalConfObject.AdFileName)
fmt.Printf("AdFileReloadInterval=%d\n", GlobalConfObject.AdFileReloadInterval)
fmt.Printf("LogLevel=%d\n", GlobalConfObject.LogLevel)
fmt.Printf("AdServerLogFileName=%s\n", GlobalConfObject.AdServerLogFileName)
fmt.Printf("SearchLogFileName=%s\n", GlobalConfObject.SearchLogFileName)
Expand Down
7 changes: 6 additions & 1 deletion src/main/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ func main() {
adserver.LoadLocationDict(
adserver.GlobalConfObject.GeoBlockFileName,
adserver.GlobalConfObject.GeoLocationFileName)
adserver.LoadAdDict(adserver.GlobalConfObject.AdFileName)

// 初始化并加载广告信息
adserver.AdDictObject = adserver.NewAdDict(adserver.GlobalConfObject.AdFileName)
adserver.AdDictObject.Load()
adserver.AdDictObject.StartReloadTimer()

http.HandleFunc("/ad/search", adhandler.SearchHandler)
http.HandleFunc("/ad/impression",adhandler.ImpressionHandler)
http.HandleFunc("/ad/click",adhandler.ClickHandler)
Expand Down

0 comments on commit 7fca3a2

Please sign in to comment.