【Kafka官方文档翻译】5.4.6. 消息传递语义

2017-06-21  本文已影响118人  FlySheep_ly

原文地址:https://kafka.apache.org/0101/documentation.html#semantics
  现在我们对Producer和Consumer已经有了一定的了解,接着我们来讨论Kafka在Producer和Consumer上提供的语义。显然的,在分发消息时是可以有多种语义的:

值得注意的是这分为两个问题:发布消息的可用性和消费消息的可用性。
  许多系统都声称提供“exactly once”语义,仔细阅读会发现,这些声明是误导的(他们没有考虑Producer和Consumer可能Crash的场景,或是数据写入磁盘后丢失的情况)。
  Kafka提供的语义是直接了当的。发送消息的时候我们有一个消息被Commit到Log的概念。一旦消息已经被Commit,它将不会丢失,只要还有一个复制了消息所在Partition的Broker存活着。“存活”的定义以及我们覆盖的失败的情况将在下一节描述。现在假设一个完美的Broker,并且不会丢失,来理解对Producer和Consumer提供的语义保证。如果Producer发送一条消息,并且发生了网络错误,我们是不能确认错误发生在消息Commit之前还是消息Commit之后的。类似于使用自增主键插入数据库,是不能确认写入之后的主键值的。
  Producer没有使用的强制可能的语义。我们无法确认网络是否会发生异常,可以使Producer创建有序的主键使重试发送成为幂等的行为。这个特性对一个复制系统来说不是无价值的,因为服务器在发生故障的情况下依旧需要提供服务。使用这个功能,Producer可以重试,直到收到消息成功commit的响应,在这个点上保证消息发送的exactly once。我们希望把这个特性加到后续的Kafka版本中。
  不是所有的场景都需要这样的保证。对应延迟敏感的场景,我们允许Producer指定其期望的可用性级别。如果Producer期望等待消息Commit,那么这可能消耗10ms。Producer也可以指定以异步的方式发送消息或只等Leader节点写入消息(不能Follower)。
  接着我们从消费者的视角来描述语义。所有的副本都拥有偏移量相同的日志。Consumer控制它在日志中的偏移量。如果Consumer一直正常运行,它可以只把偏移量存储在内存中,但是如果Consumer crash且我们期望另一个新的Consumer接管消费,那么需要选择一个位置来开始消费。假设Consumer读取了一些消息——它有集中处理消息和位置的方式。

上一篇下一篇

猜你喜欢

热点阅读