Kafka是一种分布式消息队列,为何要使用消息队列?是基于异步通信的诉求,为了服务之间相互解耦,同时避免在高并发时完成流量削峰的作用。
一 基础概念:
producer:消息生产者、
consumer:消息消费者、
topic:一个队列、
consumer group:消费者组
broker:一台kafka机器,一个broker可以容纳多个topic
partition:每个topic包含多个partition
offset:偏移量
leader主、follower从。所有的读写操作都在leader,leader挂了自动选择follwer成为leader
二 环境搭建:
1 首先需要java环境,下载安装jdk
2 下载kafka安装包,kafka_2.11-2.4.1.tgz。解压缩。
3 修改config/server.properties文件:
#broker 的全局唯一编号,不能重复
broker.id=0
#删除 topic 功能使能
delete.topic.enable=true
#kafka服务监听端口
listeners=PLAINTEXT://localhost:9092
#kafka 运行日志存放的路径
log.dirs=/opt/module/kafka/logs
#配置连接 Zookeeper 集群地址
zookeeper.connect=localhost:2181
三 常见命令:
zookeeper服务启动:/usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties&
Kafka服务启动:/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties &
Kafka服务关闭:/usr/local/kafka/bin/kafka-server-stop.sh stop
1)查看topic列表cd /usr/local/kafka/ && bin/kafka-topics.sh --zookeeper localhost:2181 --list
2) 创建 topic cd /usr/local/kafka/ && bin/kafka-topics.sh --zookeeper localhost:2181 --create --replication-factor 1 --partitions 1 --topic first
3) 删除topic cd /usr/local/kafka/ && bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic __consumer_offsets
4)发送消息 cd /usr/local/kafka/ && bin/kafka-console-producer.sh --broker-list localhost:9092 --topic first
5)消费消息 cd /usr/local/kafka/ && bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic first
6)查看topic cd /usr/local/kafka/ && bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic first
7) 确认是否存在要使用的主题 cd /usr/local/kafka/ && bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
四 php API
1 生产者:
public function actionKafkaProduce()
{
$config = \Kafka\lib\ProducerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('localhost:9092');
$producer = new \Kafka\Producer();
while (!feof(STDIN)) {
$line = fread(STDIN, 1024);
$producer->send([
[
'topic' => "first",
'key' => 1,
'value' => json_encode([
'biz' => 'store_job',
'action' => $line,
]),
]
]);
}
}
2 消费者:
public function actionKafkaConsume()
{
$config = \Kafka\lib\ConsumerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('localhost:9092');
$config->setGroupId('test');
$config->setBrokerVersion('1.0.0');
$config->setTopics(['first']);
$config->setOffsetReset('earliest');
$consumer = new \Kafka\Consumer();
$consumer->start([$this, "kafkaConsume"]);
}
3 回调函数
public function kafkaConsume($topic, $part, $message_orig)
{
$message = json_decode($message_orig['message']['value'],1);
var_dump($message);
}