When we think about exactly-once semantics, it’s useful to distinguish between the notions of delivery and processing.
In the context of the above discussion, let’s consider delivery to be the arrival of the message at the destination node, at the hardware level.
Then, we consider processing to be the handling of this message from the software application layer of the node.
In most cases, we care more about how many times a node processes a message, than about how many times it delivers it. For instance, in our previous email example, we were mainly interested in whether the application would display the same email twice, and not whether it would receive it twice.
As the previous examples demonstrated, it’s impossible to have exactly-once delivery in a distributed system. However, it’s still sometimes possible to have exactly-once processing.
In the end, it’s important for us to understand the difference between these two notions, and clarify what we refer to when we talk about exactly-once semantics.