I do think we can learn this part from OpenResty Edge, also I like the idea that take a Chash key from Header ,which is pretty meaningful for us.
[image: image.png] Ming Wen <[email protected]> 于2019年12月23日周一 下午9:04写道: > yuansheng, what do you think? > > Thanks, > Ming Wen, Apache APISIX > Twitter: _WenMing > > > Ming Wen <[email protected]> 于2019年12月23日周一 下午9:03写道: > > > hi, codjust, > > I prefer your design than the existing one[1]. > > > > These categories "vars", "header", "cookie", "consumer" are friendly for > > developer. > > > > [1] > > > https://github.com/apache/incubator-apisix/blob/master/lua/apisix/schema_def.lua#L261 > > > > Thanks, > > Ming Wen, Apache APISIX > > Twitter: _WenMing > > > > > > codjust <[email protected]> 于2019年12月23日周一 下午8:58写道: > > > >> Now chash key only support fetch from nginx variable. We need to be more > >> flexible approach, > >> eg: cookie, custom header and so on. > >> Here is an example to achieve: > >> upstream json schema: > >> hash_on = { > >> type = "string", > >> default = "vars", > >> enum = { > >> "vars", > >> "header", > >> "cookie", > >> "consumer" > >> }, > >> }, > >> key = { > >> description = "the key of > chash > >> for dynamic load balancing", > >> type = "string" > >> }, > >> > >> > >> eg: > >> local function create_chash_hash_key(ctx, upstream) > >> local key = upstream.key > >> local hash_on = upstream.hash_on > >> local chash_key > >> -- from nginx variable > >> if hash_on == "vars" then > >> chash_key = ctx.var[key] > >> elseif hash_on == "header" then > >> chash_key = ngx.req.get_headers()[key] > >> elseif hash_on == "cookie" then > >> chash_key = ctx.var["cookie_" .. key] > >> -- TODO chash_key doesn't exist, set-cookie > >> end > >> if not chash_key then > >> chash_key = ctx.var["remote_addr"] > >> end > >> return chash_key > >> end > >> > >> > >> hash_on type desc: > >> 1 vars: fetchs nginx variable > >> 2 header: custom headers or standard http headers > >> 3 cookie: fetch chash key from cookie. It can be used to sticky session > >> 4 consumer: hash by consumer_id > >> If the specified chash key is not present, use default key: > >> remote_addr(it can also provide default settings). > >> > >> > >> everybody have a better idea? > >> > >> github issue: > >> https://github.com/apache/incubator-apisix/issues/992 > > > > >
