消息中间件是基于什么需求设计的?
- 既然是消息中间件,那么一定会有发送消息和接收消息
- 应用程序往消息中间件发送消息,那么一定会通过网络请求,为了保证中间件的性能,网络请求应该需要用到NIO
- 牛逼一点的中间件,应该会支持跨语言,不应该只为Java而设计
- 消息是通过什么形式发送的呢,目前比较流行的应该还是序列化和反序列化吧
- 生产者发送完消息后如何知道自己是否发送成功了,消费者消费完消息后,中间件如何知道该消息是否真的被消费了,这应该会设计一个确认机制吧
- 消息存储在哪里,如何储存的,是存内存还是磁盘
术语
kafak主题(topic)
每条消息的发送其实都应该设计一个类别,比如新闻包含军事、娱乐等。而topic其实就是一个类别,也可以理解为topic就是一个数据库的某张表。生产者需要发送消息到topic=test上,就好比需要将一批数据保存到test表里面。
kafka分区(Partition)
一个topic会包含多个分区,如果topic是一张表,那么partition就是表分区。Oracle有表分区的概念,如果数据量非常大的时候,表分区可以提高查询性能。kafka的分区也是为了提高性能。分区其实就是物理上的概念,它在物理上被拆分成多个文件。
kafka消费者组
消费者在消费消息时,它会存在一个组里面(如果指定消费者组,那么就存在于指定组,不指定,就在默认组里面),假设kafka里有100条消息,如果一个组里就只有一个消费者,那么该消费者会消费100条消息;如果一个组里面有多个消费者,那么多个消费者共同消费100条消息;如果另外新来一个消费者组,那么该组会消费到100条消息;所以,消费者组如果存在多个,则是属于订阅模式,每个组都会消费到所有的消息。
基本命令
创建topic=fut_topic
bin/kafka-topics.sh --create --zookeeper kafka_zk001:2181,kafka_zk002:2181,kafka_zk003:2181 --replication-factor 1 --partitions 1 --topic fut_topic
kafka_zk001、kafka_zk002、kafka_zk003是机器的hostname,等价于ip地址
删除topic=fut_topic
bin/kafka-topics.sh --delete --zookeeper kafka_zk001:2181,kafka_zk002:2181,kafka_zk003:2181 --topic fut_topic
在topic=fut_topic上开启生产者
bin/kafka-console-producer.sh --broker-list kafka_zk001:9092 --topic fut_topic
在topic=fut_topic上开启消费者
bin/kafka-console-consumer.sh --bootstrap-server kafka_zk003:9092 --topic fut_topic --from-beginning
列出所有的topic
bin/kafka-topics.sh --list --zookeeper kafka_zk001:2181,kafka_zk002:2181,kafka_zk003:2181
查看某个topic的详细信息
bin/kafka-topics.sh --describe --zookeeper kafka_zk001:2181,kafka_zk002:2181,kafka_zk003:2181 --topic fut_topic