This is similar to the approach used with our (and many others) ITCH protocol, but with one significant exception. We don't sync using a full replay of historic data, instead from a snapshot that represents the current state of the market at a current point in time (using some form of transaction identifier). The customer attaches to the real-time feed and start buffering the data, then collects a snapshot from a separate server. This is generally much cheaper to ship to the customer than a full replay. The customer takes the snapshot and its associated transaction id, dumps any buffered real-time updates that have occurred prior to the snapshot and continues from their.
Historical data is then handled as a separate service and pulled on demand as most UIs only need the historic data to handle charting. For the historical data we have pre-processed CSV files that we ship from the file system to the customer using HTTP.