Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
kafka是一个分布式的,分区的消息(官方称之为commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独特的设计。可以这样来说,Kafka借鉴了JMS规范的思想,但是确并没有完全遵循JMS规范。
首先,让我们来看一下基础的消息(Message)相关术语:
因此,从一个较高的层面上来看,producer通过网络发送消息到Kafka集群,然后consumer来进行消费,如下图:
服务端(brokers)和客户端(producer、consumer)之间通信通过TCP协议来完成。
针对于同步的通信⽅式来说,异步的⽅式,可以让上游快速成功,极⼤提⾼了系统的吞吐
量。⽽且在分布式系统中,通过下游多个服务的分布式事务的保障,也能保障业务执⾏之后
的最终⼀致性。消息队列解决具体的是什么问题——通信问题。即便下游有任务失败也不影响最终是成功的。
⽬前消息队列的中间件选型有很多种:
rabbitMQ:内部的可玩性(功能性)是非常强的
rocketMQ: 阿里内部一个大神,根据kafka的内部执行原理,手写的一个消息队列中间件。性能是与Kafka相比肩,除此之外,在功能上封装了更多的功能。
kafka:全球消息处理性能最快的一款MQ
zeroMQ
这些消息队列中间件有什么区别?
重topic:Kafka、RocketMQ、ActiveMQ
整个broker,依据topic来进行消息的中转。在重topic的消息队列里必然需要topic的存在
轻topic:RabbitMQ
topic只是一种中转模式。
在生产者和消费者之间没有使用broker,例如zeroMQ,直接使用socket进行通信。
/usr/local/kafka
#broker.id属性在kafka集群中必须要是唯一
broker.id=0
#kafka部署的机器ip和提供服务的端口号
listeners=PLAINTEXT://192.168.65.60:9092
#kafka的消息存储文件
log.dir=/usr/local/data/kafka-logs
#kafka连接zookeeper的地址
zookeeper.connect=192.168.65.60:2181
./kafka-server-start.sh -daemon ../config/server.properties
进入到zookeeper内用ls指令查看是否有kafka的节点:/brokers/ids/0
./kafka-topics.sh --create --zookeeper 172.16.253.35:2181 --replication-factor 1 --partitions 1 --topic test
./kafka-topics.sh --list --zookeeper 172.16.253.35:2181
test
把消息发送给broker中的某个topic,打开一个kafka发送消息的客户端,然后开始用客户端向kafka服务器发送消息
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --topic test
打开一个消费消息的客户端,向kafka服务器的某个主题消费消息
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --topic test
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --from-beginning --topic test
/usr/local/kafka/data/kafka-logs/主题-分区/00000000.log
在一个kafka的topic中,启动两个消费者,一个生产者,问:生产者发送消息,这条消息是否同时会被两个消费者消费?
如果多个消费者在同一个消费组,那么只有一个消费者可以收到订阅的topic中的消息。换言之,同一个消费组中只能有一个消费者收到一个topic中的消息。
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --consumer-property group.id=testGroup --topic test
不同的消费组订阅同一个topic,那么不同的消费组中只有一个消费者能收到消息。实际上也是多个消费组中的多个消费者收到了同一个消息。
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --consumer-property group.id=testGroup1 --topic test
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --consumer-property group.id=testGroup2 --topic test
下图就是描述多播和单播消息的区别
通过以下命令可以查看到消费组的相信信息:
./kafka-consumer-groups.sh --bootstrap-server 172.16.253.38:9092 --describe --group testGroup
重点关注以下几个信息:
千峰教育