Like ActionCable, but with persistence and sequencing
channel = Firehose.channel("report:#{report.id}")
# Each publish appends a sequenced message
channel.publish("page 1 done") # sequence 1
channel.publish("page 2 done") # sequence 2
channel.publish("page 3 done") # sequence 3
# Client reconnects: "I last saw sequence 1"
# Firehose replays sequence 2, 3