MutableSharedFlow - replay 和 extraBufferCapacity 之间的区别

MutableSharedFlow - difference between replay and extraBufferCapacity

Mu​​tableSharedFlow 有 3 个参数:replay、extraBufferCapacity 和 onBufferOverflow。 replay 和 extraBufferCapacity 有什么区别?

文档中提到了以下内容:

replay - the number of values replayed to new subscribers (cannot be negative, defaults to zero).

extraBufferCapacity - the number of values buffered in addition to replay. emit does not suspend while there is a buffer space remaining (optional, cannot be negative, defaults to zero).

我不明白 2 和我们何时需要 extraBufferCapacity > 0 之间的区别。extraBufferCapacity 只是发射器的额外重播容量吗?

Is extraBufferCapacity just an additional replay capacity for emitters?

“重播”术语只对订阅者有意义,对发射者没有意义。 replay 参数定义新订阅者在订阅时将收到多少过去的值。这显然意味着需要存储这些值,因此整个缓冲区至少需要这么大。

但是,缓冲区大小(作为一个整体)会影响发射器。满缓冲区的确切结果取决于 onBufferOverflow,但此缓冲区大小可用于控制发射器的背压(减慢它们的速度)或我们如何丢弃消息。使用更大的缓冲区,您可以允许发射器在不减慢发射速度的情况下突发发射,就像任何常规缓冲区一样。

现在,选择更大的缓冲区不应强迫您向新订阅者重播这些缓冲值,因此 extraBufferCapacity。使用 extraBufferCapacity > 0,您可以定义任何所需大小的缓冲区,而无需强制重播尽可能多的值,只需使用以下公式:

bufferSize = replay + extraBufferCapacity

例如,您可以决定不向新订阅者重播任何值,但仍然允许通过 some (non-replayed) 缓冲区从发射器突发。