Kafka
- Kafka 是⼀个分布式流式处理平台,主要有两⼤应⽤场景:消息队列、数据处理
- 和其他消息队列相⽐,Kafka的优势在哪⾥
- 极致的性能 :基于 Scala 和 Java 语⾔开发,设计中⼤量使⽤了批量处理和异步的思想
- ⽣态系统兼容性很好
- Kafka 的多分区(Partition)以及多副本(Replica)机制有什么好处
-
Kafka 通过给特定 Topic 指定多个 Partition, ⽽各个 Partition 可以分布在不同的 Broker 上 , 这样便能提供比较好的并发能⼒(负载均衡)
-
Partition 可以指定对应的 Replica 数 , 这也极⼤地提⾼了消息存储的安全性 , 提⾼了容灾能⼒,不过也相应的增加了所需要的存储空间
-
Kafka 如何保证消息的消费顺序?
-
1 个 Topic 只对应⼀个 Partition
-
(推荐)发送消息的时候指定 key/Partition
- Kafka 如何保证消息不丢失
采用回调函数的形式,如果消息发送失败,检查失败原因之后重新发送
ListenableFuture<SendResult<String, Object>> future =
kafkaTemplate.send(topic, o);
future.addCallback(result -> logger.info("⽣产者成功发送消息到topic:{}
partition:{}的消息", result.getRecordMetadata().topic(),
result.getRecordMetadata().partition()),
ex -> logger.error("⽣产者发送消失败,原因:{}",
ex.getMessage()));
回调函数
一般情况下,应用程序会时常通过API调用库里所预先备好的函数。但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数
回调实际上有两种:阻塞式回调和延迟式回调
下列例子是阻塞式回调
#回调函数1 #生成一个2k形式的偶数 def double(x): return x * 2 #回调函数2 #生成一个4k形式的偶数 def quadruple(x): return x * 4 def getOddNumber(k, getEvenNumber): return 1 + getEvenNumber(k) #起始函数,这里是程序的主函数 def main(): k = 1 #当需要生成一个2k+1形式的奇数时 i = getOddNumber(k, double) print(i) #当需要一个4k+1形式的奇数时 i = getOddNumber(k, quadruple) print(i)