Kafka broker 写消息的过程

Producer → Kafka Broker → Replication → Consumer
               |
          Partition chosen (by key or round-robin)
               |
          Message appended to end of log (commit log)

上面的流程是kafka 写操作的大体流程。

kafka 不会特意保留message 在内存中,而是直接写入了disk。
那么消费的时候,如果是最近 produced 的message,即使写入了disk,还是会保留在OS的page cache中。 OS page cache 即使是flush 到了disk,也不会被立刻清除,这个是OS 自己的机制。 所以consumer 读最近生产的消息的时候,还是可以从page cache中读取出来的,而不用从disk 中读取。

  1. Kafka Broker Receives the Message
    决定partition

  2. Message is Appended to a Partition Log
    The selected broker appends the message to the end of the partition log (a sequential write).
    Kafka writes messages to disk efficiently using write-ahead logs (WAL).

  3. Replication (for Fault Tolerance)
    Kafka waits for acknowledgments based on the producer’s acks setting:
    acks=0: Producer doesn’t wait.
    acks=1: Wait for leader only.
    acks=all: Wait for all replicas to acknowledge.

  4. Message is Made Available to Consumers
    Once the acks is fulfilled, it becomes available for consumers.
    Consumers read sequentially using offsets.
    Kafka keeps messages for a retention period (e.g., 7 days), regardless of whether they’ve been consumed.

要使用PHP rdkafkaKafka broker消费消息,你可以按照以下步骤进行操作: 1. 确保已经在服务器上正确安装了Kafka和rdkafka扩展。可以参考官方文档或者其他资源进行安装和配置。 2. 创建一个消费者实例并设置相关的配置参数。例如: ```php $conf = new RdKafka\Conf(); $conf->set('group.id', 'your_consumer_group_id'); $conf->set('metadata.broker.list', 'your_broker_host:your_broker_port'); $consumer = new RdKafka\KafkaConsumer($conf); ``` 在上面的代码中,你需要设置`group.id`为你的消费者组ID,`metadata.broker.list`为你的Kafka broker地址。 3. 订阅一个或多个主题来消费消息。例如: ```php $consumer->subscribe(['topic1', 'topic2']); ``` 在上面的代码中,你可以将要消费的主题名称以数组的形式传递给`subscribe`方法。 4. 使用`consume`方法从Kafka broker获取消息。例如: ```php while (true) { $message = $consumer->consume(120 * 1000); // 设置超时时间 switch ($message->err) { case RD_KAFKA_RESP_ERR_NO_ERROR: // 处理消息 echo 'Key: ' . $message->key . ', Value: ' . $message->payload . PHP_EOL; break; case RD_KAFKA_RESP_ERR__PARTITION_EOF: // 没有更多消息,等待新消息到达 break; case RD_KAFKA_RESP_ERR__TIMED_OUT: // 超时,继续下一次消费 break; default: // 错误处理 echo 'Error: ' . $message->errstr() . PHP_EOL; break; } } ``` 在上面的代码中,`consume`方法将会阻塞等待消息的到达,并返回一个`RdKafka\Message`对象。你可以根据返回的消息对象做相应的处理,比如获取消息的键和值。 请注意,上述代码仅为示例,你需要根据实际情况进行适当的修改和错误处理。 希望以上信息对你有帮助!如果还有其他问题,请随时提问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值