package internal
- Alphabetic
- Public
- Protected
Value Members
- object ProducerControllerImpl
INTERNAL API
INTERNAL API
Design notes
The producer will start the flow by sending a ProducerController.Start message to the
ProducerController
with message adapter reference to convert ProducerController.RequestNext message. TheProducerController
sendsRequestNext
to the producer, which is then allowed to send one message to theProducerController
.The producer and
ProducerController
are supposed to be local so that these messages are fast and not lost.The
ProducerController
sends the first message to theConsumerController
without waiting for aRequest
from theConsumerController
. The main reason for this is that when used with Cluster Sharding the first message will typically create theConsumerController
. It's also a way to connect the ProducerController and ConsumerController in a dynamic way, for example when the ProducerController is replaced.When the first message is received by the
ConsumerController
it sends back the initialRequest
, with demand of how many messages it can accept.Apart from the first message the
ProducerController
will not send more messages than requested by theConsumerController
.When there is demand from the consumer side the
ProducerController
sendsRequestNext
to the actual producer, which is then allowed to send one more message.Each message is wrapped by the
ProducerController
in ConsumerController.SequencedMessage with a monotonically increasing sequence number without gaps, starting at 1.In other words, the "request" protocol to the application producer and consumer is one-by-one, but between the
ProducerController
andConsumerController
it's window of messages in flight.The
Request
message also contains aconfirmedSeqNr
that is the acknowledgement from the consumer that it has received and processed all messages up to that sequence number.The
ConsumerController
will send ProducerControllerImpl.Resend if a lost message is detected and then theProducerController
will resend all messages from that sequence number. The producer keeps unconfirmed messages in a buffer to be able to resend them. The buffer size is limited by the request window size.The resending is optional, and the
ConsumerController
can be started withresendLost=false
to ignore lost messages, and then theProducerController
will not buffer unconfirmed messages. In that mode it provides only flow control but no reliable delivery.