请将已备案网站接入访问,北京开公司一年费用,建站外贸企业官网推广,手机 网站开发软件在分布式环境中#xff0c;故障是很常见的情况#xff0c;可以随时发生。 在Kafka环境中#xff0c;代理可能会崩溃#xff0c;网络故障#xff0c;处理故障#xff0c;发布消息时失败或无法使用消息等。这些不同的场景引入了不同类型的数据丢失和重复。 失败场景 A故障是很常见的情况可以随时发生。 在Kafka环境中代理可能会崩溃网络故障处理故障发布消息时失败或无法使用消息等。这些不同的场景引入了不同类型的数据丢失和重复。 失败场景 A确认失败生产者成功发布了消息重试 1但由于失败而未收到确认。 在这种情况下生产者将重试相同的消息可能会引入重复消息。 B生产者进程在批处理消息中失败生产者发送了一批失败的消息但发布的成功很少。 在这种情况下一旦生产者重新启动它将再次批量重新发布所有消息这将在Kafka中引入重复消息。 C触发并忘记失败生产者发布的消息重试 0触发并忘记。 如果失败发布的消息将不知道并发送下一条消息这将导致消息丢失。 D批处理消息中的消费者失败消费者从Kafka接收到一批消息并手动提交其偏移量enable.auto.commit false。 如果消费者在提交给Kafka之前失败则下次消费者将再次使用相同的记录这些记录将在消费者端复制副本。 精确一次语义 在这种情况下即使生产者尝试重新发送消息它也导致消息将被消费者发布和消费一次。 为了在Kafka中实现Exactly-Once语义它使用以下3个属性 enable.idempotence true地址ab和c MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION 5生产者每次连接总是有一个飞行中请求 isolated.level read_committed地址d 启用幂等enable.idempotence true 幂等传递使生产者可以在单个生产者的生命周期内将消息仅一次写入Kafka到主题的特定分区而不会造成数据丢失和每个分区的订单。 “请注意启用幂等性要求MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION小于或等于5RETRIES_CONFIG大于0且ACKS_CONFIG为all。 如果用户未明确设置这些值则将选择合适的值。 如果设置了不兼容的值将抛出ConfigException” 为了实现幂等性Kafka在生成消息时使用唯一的ID称为产品ID或PID和序列号。 生产者在发布的每个消息上保持递增的序列号这些消息具有唯一的PID。 代理始终将当前序列号与前一个序列号进行比较如果新序列号不比上一个序列号大1则它会拒绝这会避免重复如果消息中丢失了更大的序列号则会拒绝同时显示 在失败的情况下代理将序列号与先前的序列号进行比较如果序列不增加 1将拒绝该消息。 交易隔离级别 事务使我们能够自动更新多个主题分区中的数据。 事务中包含的所有记录都将被成功保存或者没有保存成功它允许您将同一个事务中的消费者补偿与已处理的数据一起提交从而允许端到端的一次精确语义。 生产者不等待将消息写到kafka上生产者使用beginTransactioncommitTransaction和abortTransaction如果发生故障消费者使用isolate.level级别无论是read_committed还是read_uncommitted read_committed使用者将始终仅读取已提交的数据。 read_uncommitted以偏移顺序读取所有消息而无需等待事务提交 如果具有Isolation.level read_committed的使用者到达尚未完成的事务的控制消息它将不会再从该分区传递任何消息直到生产者提交或中止该事务或发生事务超时。 事务超时由生产者使用配置transaction.timeout.ms默认为1分钟确定。 生产者和消费者中的确切时间 在正常情况下生产者和消费者是分开的。 生产者必须具有幂等性并同时管理事务以便消费者可以使用isolation.level读取read_committed以使整个过程成为原子操作。 这样可以确保生产者将始终与源系统同步。 即使生产者崩溃或事务中止它也始终是一致的并且一次将消息或一批消息发布为一个单元。 同一用户一次将收到消息或一批消息。 在Exactly-Once中语义生产者与消费者一起将作为原子操作出现它将作为一个单元进行操作。 要么发布一次就被消耗掉要么中止。 在Kafka Stream中恰好一次 Kafka Stream消耗来自主题A的消息处理消息并将其发布到主题B并在发布后使用commitcommit主要在后台运行将所有状态存储数据刷新到磁盘。 Kafka Stream中的“一次”是“读取-处理-写入”模式可确保将这些操作视为原子操作。 由于Kafka Stream可以满足生产者消费者和交易的需求因此Kafka Stream带有特殊的参数processing.guarantee它可以完全地_once或at_least_once使得不单独处理所有参数变得容易。 Kafka Streams原子地更新使用者偏移量本地状态存储状态存储changelog主题和生产以一起输出所有主题。 如果这些步骤中的任何一个失败则所有更改都将回滚。 processing.guarantee确切地提供一次以下参数您无需明确设置 isolated.level read_committed enable.idempotence true MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION 5 翻译自: https://www.javacodegeeks.com/2020/05/kafka-exactly-once-semantics.html