require "common"
local spaceKey = ngx.req.get_headers()['X-Space-Key']
local shardingHeader = ngx.req.get_headers()['X-Sharding-Group']
targetGroup = config.defaultGroup
redisCli = init_redis()
local response = redisCli:ping()
mysqlConn = init_mysql()
if shardingHeader then
targetGroup = shardingHeader
ngx.log(ngx.ALERT, targetGroup, " From Header")
elseif spaceKey ~= nil then
local redisKey = "sharding:"..spaceKey
local shardingGroup, err = redisCli:get(redisKey)
if shardingGroup ~= nil and shardingGroup ~= ngx.null then
targetGroup = shardingGroup
ngx.log(ngx.ALERT, shardingGroup, " From Redis")
else
local sql = "Select T_HOST.F_GROUP shardingGroup "..
"From T_WORKSPACE "..
"Left Join T_HOST on T_HOST.F_ID = T_WORKSPACE.F_HOST_ID "..
"Where T_WORKSPACE.F_SPACE_KEY = "..ngx.quote_sql_str(spaceKey).." LIMIT 1";
res, err, errno, sqlstate = mysqlConn:query(sql)
if not res then
ngx.log(ngx.ERR, err)
ngx.exit(500)
else
shardingGroup = res[1].shardingGroup;
if shardingGroup ~= nil then
ngx.log(ngx.ALERT, shardingGroup, " From Mysql")
redisCli:set(redisKey, shardingGroup)
redisCli:expire(redisKey, 3600*4)
targetGroup = shardingGroup
end
end
end
end
ngx.var.backend_upstream = targetGroup
ngx.log(ngx.ALERT, "Workspace ", spaceKey, " final upstream: ",targetGroup)
close_cosock(mysqlConn)
close_cosock(redisCli)