Hi Thierry,

I know this an old thread but I'm having a similar issue where HA Proxy
doesn't allow me to use Redis (not allowed to use socket in fetches). My
scenario is as below:

one frontend and multiple backends (proxies). (the frontend is just one IP
and always sends requests to the same url)
I use Lua script SmartRouting to:
A. Look at the body of the body of the message and decide which back end to
use
B. If the backend servers being used are too busy (active sessions >
threshold) then it will choose to send the requests to the offlineAgent

frontend http-in
    bind *:80
    use_backend %[lua.SmartRouting(txn)]
    default_backend OnlineChargers

backend Onlineagent
    server testServer1 ${Server_1_IP}:${Server_1_Port} check
backend ServersForRequestTypeX
    server testServer1 ${Server_2_IP}:${Server_2_Port} check
backend offlineAgents
    server testServer1 ${Server_3_IP}:${Server_3_Port} check
    http-response lua.add_DegradedSession

Straight forward up to this point and no need for Redis, however if a
message is sent to offlineAgent proxy, then I want all the rest of the
requests to be sent to the offline agent. (each message can have a
sessionID
inside the payload). I tried to add the sessionID for the messages inside
my SmartRouting to Redis as it was explained in your blogpost but HAProxy
throws an error and doesn't allow use of a socket in sample fetch.
below is my Lua script:

-- if number of active sessions goes higher than below then degraded
mode is detected
DEGRADED_THRESHOLD = 10
-- global object which will be used for routing of requests based on
request type xml tag
-- if the request type is not found then HA proxy's default backend will be used
routingTable = {
    ["</AccountingReq>"] = "Onlineagent",
    ["</TestReq>"] = "ServersForRequestTypeX"
}

local function SmartRouting(txn)
    --print_r(txn)
    local payload = txn.sf:req_body()
    -- extract request tag (final occurence of </)
    local requestTag = string.match(payload, "</[^</]*$")
    local selectedBackend = routingTable[requestTag]
    -- check if there's enough capacity (degraded mode)
    -- this check is only neccessary if the
    if (selectedBackend == "Onlineagent") then
        local sessionCount = getTotalSessions()
        if (sessionCount > DEGRADED_THRESHOLD) then
            core.Debug(
"shit is hiting the fan! Sending requests to degraded agent")

--TODO:  Add the sessionID to Redis and check for future requests if
it's in Redis then redirect to Offline Agent
            return "offlineAgents"
        end
    end
    return selectedBackend
end

function getTotalSessions()
    local total_sessions = 0
    for _, backend in pairs(core.backends) do
        if backend.name == "Onlineagent" then
            for _, server in pairs(backend.servers) do
                -- Get server's stats
                local stats = server:get_stats()

                -- Get the backend's total number of current sessions
                if stats["status"] == "UP" then
                    total_sessions = total_sessions + stats["scur"]
                end
            end
        end
    end
    return total_sessions
end

-- register HAProxy "fetch"
core.register_fetches("SmartRouting", dreSmartRouting)

Reply via email to