1.调研项目

腾讯云 CKafka
消息队列 pulsar (腾讯TDMQ)

2.Kafka 介绍

模式:发布/订阅

分布式消息队列调研 - 图1

broker: kafka 服务器集群

topic: 消息的主题,对消息进行分类。一般一个 topic 对应一个业务线

partition: topic 的分区,分区的作用是做负载,提高 kafka 的吞吐量。同一个 topic 在不同分区的数据是不同的,partition 的表现形式就是一个个文件夹。

replication: 每一个 partition 都有多个副本。分区中有一个 Leader,如果挂了会选举出一个 Follower 来做 Leader。
kafka 默认最大为 10 个副本。partition 的数量不能超过 broker。 leader 和 follower 需要存放在不同的机器上。

comsumer group: 多个消费者组成一个消费组,一个 partiton 的数据只能被消费组中的某一个消费者消费。消费组可以消费一个 topic 不同 partition 的数据,这样有利于提高 kafka 的吞吐量。

概念

  • kafka 通过 Topic 对存储数据进行分流
  • 每条记录中包含一个 key、一个 value、一个 timestamp
  • API
    • Producer API 生产者
    • Comsumer API 消费者
    • Streams API 流处理,消费多个 Topic 的输入流,然后产生一个输出流到一个或多个 Topic 中去(流转换)
    • Connector API 连接数据库,捕捉表的变化

基本命令

查看 Topic kafka-topics.sh --list --zookeeper localhost:2181

如何保证消息有序?只要开多线程/多进程消费都有问题

php 操作 kafka

请阅读参考资料
检查是否有安装 gcc g++ 等编译工具

php-kafka 文档 => 另一个 php 开发的客户端

命令行消费
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic='kafka-php-test'

不同的消费 group 可以同时消费消息,这个有点像广播。
组内的消息每个 partition 的数据只能被一个消费者消费

分布式消息队列调研 - 图2

分布式消息队列调研 - 图3

3.配置参数详解

earliest 当分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费。
latest 当分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据。
none 当该topic下所有分区中存在未提交的offset时,抛出异常。

rdkafka 踩坑