消息中间件是基于什么需求设计的?

  1. 既然是消息中间件,那么一定会有发送消息和接收消息
  2. 应用程序往消息中间件发送消息,那么一定会通过网络请求,为了保证中间件的性能,网络请求应该需要用到NIO
  3. 牛逼一点的中间件,应该会支持跨语言,不应该只为Java而设计
  4. 消息是通过什么形式发送的呢,目前比较流行的应该还是序列化和反序列化吧
  5. 生产者发送完消息后如何知道自己是否发送成功了,消费者消费完消息后,中间件如何知道该消息是否真的被消费了,这应该会设计一个确认机制吧
  6. 消息存储在哪里,如何储存的,是存内存还是磁盘

术语

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