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
ProducerControllerwith message adapter reference to convert ProducerController.RequestNext message. TheProducerControllersendsRequestNextto the producer, which is then allowed to send one message to theProducerController.The producer and
ProducerControllerare supposed to be local so that these messages are fast and not lost.The
ProducerControllersends the first message to theConsumerControllerwithout waiting for aRequestfrom 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
ConsumerControllerit sends back the initialRequest, with demand of how many messages it can accept.Apart from the first message the
ProducerControllerwill not send more messages than requested by theConsumerController.When there is demand from the consumer side the
ProducerControllersendsRequestNextto the actual producer, which is then allowed to send one more message.Each message is wrapped by the
ProducerControllerin 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
ProducerControllerandConsumerControllerit's window of messages in flight.The
Requestmessage also contains aconfirmedSeqNrthat is the acknowledgement from the consumer that it has received and processed all messages up to that sequence number.The
ConsumerControllerwill send ProducerControllerImpl.Resend if a lost message is detected and then theProducerControllerwill 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
ConsumerControllercan be started withresendLost=falseto ignore lost messages, and then theProducerControllerwill not buffer unconfirmed messages. In that mode it provides only flow control but no reliable delivery.