Apache kafka 在基于事件/流的系统中,TCP交付和处理保证以及精确一次保证

Apache kafka 在基于事件/流的系统中,TCP交付和处理保证以及精确一次保证,apache-kafka,tcp,streaming,publish-subscribe,Apache Kafka,Tcp,Streaming,Publish Subscribe,据我所知,TCP至少提供一次传送(重传直到确认),并且在接收器处提供一次处理(重复的数据包将被忽略,只有一个副本将被传送到应用程序)。如果这是真的,为什么应用层消息传递系统(如Kafka)而流媒体系统(如Spark)将需要自己的应用程序级协议来提供一次处理保证,为什么不只依赖TCP进行一次交付和/或处理?TCP的可靠性保证仅包括系统之间的数据交付,而不包括应用程序之间的数据交付。如果操作系统接收到数据并将其放入套接字的接收缓冲区,则接收方系统将发送回ACK。这意味着ACK可能在应用程序读取和处理

据我所知,TCP至少提供一次传送(重传直到确认),并且在接收器处提供一次处理(重复的数据包将被忽略,只有一个副本将被传送到应用程序)。如果这是真的,为什么应用层消息传递系统(如Kafka)而流媒体系统(如Spark)将需要自己的应用程序级协议来提供一次处理保证,为什么不只依赖TCP进行一次交付和/或处理?

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

因此,需要应用程序级别的ACK来保证消息已由应用程序处理,这是应用程序处理后的一种例外。另一方面,TCP是否保证只向应用程序的套接字缓冲区发送一次数据,而不需要在应用程序级别进行额外的工作来确保向应用程序发送一次数据?@mazenezzedine:TCP保证以与发送相同的顺序接收字节,并且不存在其他数据(如重复数据)。但是TCP不知道数据的含义,也就是说,如果同一个应用程序级消息实际上发送了两次,那么TCP将尽职尽责地发送两次。现在假设服务器在处理数据之后但在发送应用程序级别的确认之前崩溃或断开连接。客户端不知道当前的处理状态,可能会再次传递相同的消息数据。因此,在应用程序中控制这种再交付也是有用的。