Good article, but I have a quibble about Kafka and Replayability. Last I used it, Kafka discarded messages from its queues based on an elapsed time parameter. This enables each subscriber to traverse a queue at its own pace and with its own position pointer.
The trade off is that the longer the time parameter is, the larger the queues grow. Setting the time parameter, of necessity, balances storage and reliability.
An example might be 5 subscribers connect to the same queue. If subscriber B goes offline for longer than the time parameter, some messages may be automatically purged and lost, so subscriber B cannot safely be restarted, i.e., its missed messages cannot be replayed.