@@ -23,9 +23,11 @@ var targetsMutex sync.RWMutex
2323var currentTargets map [string ]registration.NodeRegistration
2424
2525func newPolicy () policy {
26- policyName := config .GetString (config .LOAD_BALANCER_POLICY , "round-robin " )
26+ policyName := config .GetString (config .LOAD_BALANCER_POLICY , "const-hash " )
2727 if policyName == "random" {
2828 return & randomPolicy {}
29+ } else if policyName == "const-hash" {
30+ return newConstHashBalancer ()
2931 } else {
3032 panic ("unknown policy: " + policyName )
3133 }
@@ -35,10 +37,19 @@ func handleInvoke(c echo.Context) error {
3537
3638 funcName := c .Param ("fun" )
3739 // Select backend
38- targetURL , err := lbPolicy .Route (funcName )
40+ targetKey , err := lbPolicy .Route (funcName )
41+ if err != nil {
42+ return c .JSON (http .StatusTooManyRequests , map [string ]string {"error" : err .Error ()})
43+ }
44+ targetsMutex .RLock ()
45+ targetNode , ok := currentTargets [targetKey ]
46+ if ! ok {
47+ return c .JSON (http .StatusTooManyRequests , map [string ]string {"error" : "missing target" })
48+ }
49+ targetsMutex .RUnlock ()
3950
4051 // Create a new HTTP request to forward to the selected backend
41- newURL , _ := url .JoinPath (targetURL , c .Request ().RequestURI )
52+ newURL , _ := url .JoinPath (targetNode . APIUrl () , c .Request ().RequestURI )
4253 req , err := http .NewRequest (c .Request ().Method , newURL , c .Request ().Body )
4354 if err != nil {
4455 return err
@@ -55,7 +66,7 @@ func handleInvoke(c echo.Context) error {
5566
5667 if resp .StatusCode == http .StatusOK {
5768 // function has been actually executed
58- // TODO: update info?
69+ lbPolicy . OnRequestComplete ( funcName , targetKey )
5970 }
6071
6172 res := c .Response ()
@@ -126,7 +137,7 @@ func StartReverseProxy(e *echo.Echo, region string) {
126137 log .Printf ("Initializing with %d targets.\n " , len (currentTargets ))
127138 lbPolicy = newPolicy ()
128139
129- go updateTargets (region )
140+ updateTargets (region )
130141
131142 tr := & http.Transport {
132143 MaxIdleConns : 2500 ,
@@ -151,30 +162,49 @@ func StartReverseProxy(e *echo.Echo, region string) {
151162}
152163
153164func updateTargets (region string ) {
154- for {
155- time .Sleep (10 * time .Second ) // TODO: configure
156-
157- newTargets , err := registration .GetNodesInArea (region , false , 0 )
158- if err != nil || newTargets == nil {
159- log .Printf ("Cannot update targets: %v\n " , err )
160- }
161165
162- targetsMutex .Lock ()
163- for k , _ := range currentTargets {
164- if _ , ok := newTargets [k ]; ! ok {
165- // this target is not present any more
166- log .Printf ("Removing target: %s\n " , k )
166+ interval := config .GetInt (config .LOAD_BALANCER_TARGET_UPDATE_INTERVAL , 30 )
167+ ticker := time .NewTicker (time .Duration (interval ) * time .Second )
168+
169+ go func () {
170+ for {
171+ select {
172+ case <- ticker .C :
173+ // retrieve new targets
174+ newTargets , err := registration .GetNodesInArea (region , false , 0 )
175+ if err != nil || newTargets == nil {
176+ log .Printf ("Cannot update targets: %v\n " , err )
177+ }
178+
179+ targetsMutex .Lock ()
180+ for k , v := range currentTargets {
181+ if _ , ok := newTargets [k ]; ! ok {
182+ // this target is not present any more
183+ log .Printf ("Removing target: %s\n " , k )
184+ lbPolicy .OnNodeDeletion (& v )
185+ }
186+ }
187+
188+ for k , v := range newTargets {
189+ if _ , ok := currentTargets [k ]; ! ok {
190+ // this target was not present
191+ log .Printf ("Adding new target: %s\n " , k )
192+ lbPolicy .OnNodeArrival (& v )
193+ }
194+ }
195+
196+ currentTargets = newTargets
197+ targetsMutex .Unlock ()
198+
199+ // query status of each target
200+ for _ , v := range currentTargets {
201+ status , err := getTargetStatus (v .APIUrl ())
202+ if err == nil {
203+ lbPolicy .OnStatusUpdate (& v , status )
204+ }
205+ }
167206 }
168207 }
208+ }()
169209
170- for k , _ := range newTargets {
171- if _ , ok := currentTargets [k ]; ! ok {
172- // this target was not present
173- log .Printf ("Adding new target: %s\n " , k )
174- }
175- }
176-
177- currentTargets = newTargets
178- targetsMutex .Unlock ()
179- }
180210}
0 commit comments