  Wide-area network traffic engineering enables network operators to reduce
congestion and improve utilization by balancing load across multiple paths.
Current approaches to traffic engineering can be modeled in terms of a routing
component that computes forwarding paths, and a load balancing component that
maps incoming flows onto those paths dynamically, adjusting sending rates to
fit current conditions. Unfortunately, existing systems rely on simple
strategies for one or both of these components, which leads to poor performance
or requires making frequent updates to forwarding paths, significantly
increasing management complexity. This paper explores a different approach
based on semi-oblivious routing, a natural extension of oblivious routing in
which the system computes a diverse set of paths independent of demands, but
also dynamically adapts sending rates as conditions change. Semi-oblivious
routing has a number of important advantages over competing approaches
including low overhead, nearly optimal performance, and built-in protection
against unexpected bursts of traffic and failures. Through in-depth simulations
and a deployment on SDN hardware, we show that these benefits are robust, and
hold across a wide range of topologies, demands, resource budgets, and failure
scenarios.
