【问题标题】:TCP delivery and processing gurantees and exactly once guarantee in event / streaming based systemsTCP 交付和处理保证以及在基于事件/流的系统中的一次性保证
【发布时间】:2020-09-26 13:52:33
【问题描述】:

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

【问题讨论】:

    标签: apache-kafka tcp streaming publish-subscribe


    【解决方案1】:

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

    【讨论】:

    • 因此需要应用程序级别的 ack 来保证消息已被应用程序处理,一旦被应用程序处理,它就非常容易处理。另一方面,TCP 是否保证只向应用程序的套接字缓冲区发送一次,无需在应用程序级别进行额外的工作来确保向应用程序发送一次?
    • @MazenEzzeddine:TCP 保证接收的字节顺序与发送的顺序相同,并且没有额外的数据(如重复)。但是 TCP 不知道数据的含义,即如果实际上发送了两次相同的应用程序级消息,那么 TCP 将尽职尽责地发送两次。现在假设服务器在处理数据之后但在发送应用级 ACK 之前崩溃或断开连接。客户端不知道当前的处理状态,可能会再次传递相同的消息数据。因此,在应用程序中控制此类重新交付也是很有用的。
    猜你喜欢
    • 2019-03-05
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多