pairec.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package pairec
  2. import (
  3. "flag"
  4. "io"
  5. "net/http"
  6. "os"
  7. "github.com/prometheus/client_golang/prometheus/promhttp"
  8. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/abtest"
  9. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/algorithm"
  10. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/config"
  11. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/datasource"
  12. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/datasource/datahub"
  13. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/datasource/hbase"
  14. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/filter"
  15. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/persist/holo"
  16. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/persist/mysqldb"
  17. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/persist/redisdb"
  18. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/persist/tablestoredb"
  19. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/recconf"
  20. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/service"
  21. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/service/rank"
  22. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/sort"
  23. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/web"
  24. )
  25. type hookfunc func() error
  26. var (
  27. hooks = make([]hookfunc, 0)
  28. )
  29. var configFile string
  30. func init() {
  31. flag.StringVar(&configFile, "config", "", "config file path")
  32. flag.BoolVar(&config.AppConfig.WarmUpData, "warm-up-data", false, "create eas warm up data flag")
  33. }
  34. func AddStartHook(hf ...hookfunc) {
  35. hooks = append(hooks, hf...)
  36. }
  37. func Run() {
  38. mode := os.Getenv("RUN_MODE")
  39. if mode != "COMMAND" {
  40. flag.Parse()
  41. }
  42. // load config
  43. if len(configFile) == 0 {
  44. configFile = os.Getenv("CONFIG_PATH")
  45. if configFile == "" {
  46. panic("config file path empty")
  47. }
  48. }
  49. err := recconf.Load(configFile)
  50. if err != nil {
  51. panic(err)
  52. }
  53. registerRouteInfo()
  54. runStartHook()
  55. PairecApp.Run()
  56. }
  57. func runBeforeStart() {
  58. mysqldb.Load(recconf.Config)
  59. redisdb.Load(recconf.Config)
  60. tablestoredb.Load(recconf.Config)
  61. datasource.Load(recconf.Config)
  62. datahub.Load(recconf.Config)
  63. hbase.Load(recconf.Config)
  64. holo.Load(recconf.Config)
  65. abtest.Load(recconf.Config)
  66. algorithm.Load(recconf.Config) // holo must be loaded before loading some algorithm
  67. register(recconf.Config)
  68. }
  69. func runStartHook() {
  70. runBeforeStart()
  71. // first register hook
  72. AddStartHook(func() error {
  73. filter.Load(recconf.Config)
  74. sort.Load(recconf.Config)
  75. // gdb.Load(recconf.Config)
  76. service.Load(recconf.Config)
  77. service.LoadFeatureConfig(recconf.Config)
  78. service.LoadWithConfig(recconf.Config)
  79. rank.LoadColdStartRankConfig(recconf.Config)
  80. // clean log dir
  81. ClearDir(recconf.Config.LogConf)
  82. return nil
  83. })
  84. for _, hf := range hooks {
  85. if err := hf(); err != nil {
  86. panic(err)
  87. }
  88. }
  89. }
  90. func registerRouteInfo() {
  91. // use for listen http server state
  92. HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
  93. io.WriteString(w, "success")
  94. })
  95. // register recommend Controller
  96. Route("/api/recommend", &web.RecommendController{})
  97. Route("/api/recall", &web.UserRecallController{})
  98. Route("/api/callback", &web.CallBackController{})
  99. Route("/api/feature_reply", &web.FeatureReplyController{})
  100. HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
  101. promhttp.Handler().ServeHTTP(w, r)
  102. })
  103. }