As you say, you can switch backends in VCL if a header is set, provided that every backends are pre-declared in VCL:
vcl_recv {
# ...
if ( req.http.X-backend ) {
set req.backend = req.http.X-backend;
}
# ...
}
EDIT: As @Bhaskar has pointed in his comment, an additional if is needed for each backend due to varnish structure assignment restrictions. Something like:
vcl_recv {
# ...
if ( req.http.X-backend ) {
if ( req.http.X-backend == "predefined" ) {
set req.backend = "predefined";
}
}
# ...
}