pairec.go 2.9 KB

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