Apache kafka 在微服务中用作消息总线时,kafka可靠吗
我使用kafka作为微服务体系结构的消息总线,因此多个服务在一个主题上侦听消息。因此,服务高度依赖于要直播的主题 但是,在很多情况下,我会在主题上找到Apache kafka 在微服务中用作消息总线时,kafka可靠吗,apache-kafka,apache-zookeeper,microservices,Apache Kafka,Apache Zookeeper,Microservices,我使用kafka作为微服务体系结构的消息总线,因此多个服务在一个主题上侦听消息。因此,服务高度依赖于要直播的主题 但是,在很多情况下,我会在主题上找到leader不可用,broker不可用和leader=-1 现在,我不确定是否可以依赖卡夫卡主题,因为当平台中的主题出现问题时,服务会中断 有没有人能解释一下这些主题的可靠性和可靠性,如果我们能跨越上述问题,我们能不能恢复。我将通过解释卡夫卡的总体工作原理以及它如何处理故障来回答你的问题 每个主题都是一个特定的数据流(类似于数据库中的表)。主题被分
leader不可用
,broker不可用
和leader=-1
现在,我不确定是否可以依赖卡夫卡主题,因为当平台中的主题出现问题时,服务会中断
有没有人能解释一下这些主题的可靠性和可靠性,如果我们能跨越上述问题,我们能不能恢复。我将通过解释卡夫卡的总体工作原理以及它如何处理故障来回答你的问题 每个主题都是一个特定的数据流(类似于数据库中的表)。主题被分为多个分区(可以任意多个),分区中的每条消息都会获得一个增量id,称为偏移量,如下所示 分区0:
+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
分区1:
+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
现在,卡夫卡集群由多个代理组成。每个代理都用一个ID标识,并且可以包含某些主题分区
2个主题的示例(每个主题分别有3个和2个分区):
经纪人1:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
经纪人2:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
经纪人3:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
请注意,数据是分布式的(Broker 3不保存主题2的任何数据)
主题应该有一个复制因子
>1(通常为2或3),这样当一个代理关闭时,另一个代理可以提供主题的数据。例如,假设一个主题有两个分区,其中复制因子设置为2,如下所示:
经纪人1:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
经纪人2:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
经纪人3:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
| |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 0 |
+-------------------+
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
现在假设Broker 2失败了。代理1和3仍然可以为主题1提供数据。因此,复制因子
为3始终是一个好主意,因为它允许出于维护目的关闭一个代理,也允许意外关闭另一个代理因此,Apache Kafka提供了强大的耐用性和容错保证。
关于领导者的注意事项:
在任何时候,只有一个代理可以是分区的负责人,并且只有该负责人可以接收和服务该分区的数据。其余的代理将只同步数据(同步副本)。还要注意,当复制因子设置为1时,当代理失败时,无法将领导移动到其他位置。通常,当一个分区的所有副本都出现故障或脱机时,leader
将自动设置为-1
卡夫卡非常可靠,但如果您没有正确配置它,它将无法工作(与其他许多事情一样)。例如,如果您将所有Kafka实例放在一个物理服务器中,而该服务器已关闭,则该服务器将不可靠,因为它不能可靠。在某些实例中,我在运行“/bin/Kafka-topics.sh--description--zookeer localhost:2181--topic topicname”时看到leader:-1这是我担心的。有没有办法从中恢复过来?@rajesh_pudota发生这种情况是因为你选择了1的复制因子。因此,当经纪人破产时,领导者无法转移到其他地方。