TCP 交付和处理保证以及基于事件/流的系统中的 exactly once 保证

TCP delivery and processing gurantees and exactly once guarantee in event / streaming based systems

据我所知,TCP 提供至少一次传送(重传直到收到 ACK),在接收方仅处理一次(重复的数据包将被忽略,只有一个副本将被传送到应用程序。),如果这是真的,为什么应用层消息系统(例如,Kafka)和流系统(例如,Spark,)需要他们的自己的应用程序级协议来提供一次处理保证,为什么不只依靠 TCP 进行一次性交付 and/or 处理?

TCP的可靠性保证只包括系统间的数据传递,不包括应用程序间的数据传递。如果 OS 接收到数据并将其放入套接字的接收缓冲区,则接收方系统会发回一个 ACK​​。这意味着 ACK 可能会在应用程序读取和处理数据之前发送。因此,为了保证应用程序读取和处理数据,在应用程序协议中需要某种 ACK。