I suggest you post your question on the gitter channel (
gitter.im/akka/akka). There are a lot of knowledgeable people who can answer, and I think it is a much more active space than this (deprecated) list.
But to answer your question: the materialized value of an asynchronous Sink is a Future[T]. The materialized value of a BroadcastHub.sink[T] is a Source[T]. Not every materialized value is a Future[_].
So you have basically three parts:
1) Your original runnable graph into which the BroadcastHub.sink[T] is embedded
2) A single Source[T] materialized when (1) is run -- this is a re-usable "blueprint" which can be used to define multiple new runnable graphs.
3) 0 or more runnable graphs that receive messages through (2)
Each message sent the BroadcastHub.sink[T] during the course of (1)'s run will be queued up and delivered (ie "broadcast") to all of the runnable graphs in (3) when they are run. You can re-use the Source[T] from (2) multiple times, effectively allowing you to dynamically "tap" the flow of messages being sent to the Broadcast.sink[T] from (1).
(To be honest I'm not sure of how messages are handled when there are no active Source[T] instances consuming messages sent to Broadcast.sink[T]... My impression is that they would be thrown away, and the bufferSize parameter to BroadcastHub.sink[T] only comes into play when there are one or more active graphs from (3) consuming messages. Experimentation is probably necessary to confirm that.)
Best regards,
Brian Maso