- object ProducerControllerImpl
The producer will start the flow by sending a ProducerController.Start message to the
ProducerControllerwith message adapter reference to convert ProducerController.RequestNext message. The
RequestNextto the producer, which is then allowed to send one message to the
The producer and
ProducerControllerare supposed to be local so that these messages are fast and not lost.
ProducerControllersends the first message to the
ConsumerControllerwithout waiting for a
ConsumerController. The main reason for this is that when used with Cluster Sharding the first message will typically create the
ConsumerController. 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 initial
Request, with demand of how many messages it can accept.
Apart from the first message the
ProducerControllerwill not send more messages than requested by the
When there is demand from the consumer side the
RequestNextto 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
ConsumerControllerit's window of messages in flight.
Requestmessage also contains a
confirmedSeqNrthat is the acknowledgement from the consumer that it has received and processed all messages up to that sequence number.
ConsumerControllerwill send ProducerControllerImpl.Resend if a lost message is detected and then the
ProducerControllerwill 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 with
resendLost=falseto ignore lost messages, and then the
ProducerControllerwill not buffer unconfirmed messages. In that mode it provides only flow control but no reliable delivery.