Kafka 是一种分布式的流处理平台,它可以用于处理大量的实时数据,如业务日志、用户行为数据、Metrics 数据等。Kafka 主要适用于以下几种情况:
- 业务日志:作为业务系统的日志收集器,将各种类型的日志(如错误日志、访问日志、审计日志等)发送到 Kafka 集群中,然后由其他系统(如 ELK、Hadoop、Spark 等)从 Kafka 中消费日志数据,进行分析、存储或展示。
- 用户行为数据:作为用户行为数据的传输层,将用户在网站或应用上的行为(如点击、浏览、购买等)发送到 Kafka 集群中,然后由其他系统(如 Flink、Storm、Samza 等)从 Kafka 中消费用户行为数据,进行实时或离线的分析、推荐或个性化。
- Metrics 数据:作为 Metrics 数据的采集和传输层,将各种系统或应用的性能指标(如 CPU、内存、磁盘、网络等)发送到 Kafka 集群中,然后由其他系统从 Kafka 中消费 Metrics 数据,进行监控、报警或可视化。
一条消息从生产到消费的处理流程如下:
- 生产者(Producer):向 Kafka 集群发送消息的客户端,它可以是任何可以与 Kafka 通信的系统或应用。生产者通过 Kafka 提供的 API 将消息封装成 ProducerRecord 对象,然后发送到指定的主题(Topic)中。
- 代理(Broker):Kafka 集群中的服务器节点,它负责接收和存储生产者发送的消息,以及提供给消费者消费的消息。代理将每个分区中的消息按照先进先出的顺序追加到一个日志文件(LOG)中,并为每条消息分配一个递增的偏移量,用于唯一标识该消息在分区中的位置。代理还会定期将消息从内存刷新到磁盘中,以保证消息的持久化。
- 消费者(Consumer):从 Kafka 集群消费消息的客户端,可以是任何可以与 Kafka 通信的系统或应用。消费者通过 Kafka 提供的 API 从指定的主题中拉取消息,并将消息封装成 ConsumerRecord 对象,然后进行处理或传递。消费者可以组成一个消费者组,每个消费者组有一个唯一的标识符,每个消费者组内的消费者可以并行地消费不同分区中的消息,但同一个分区中的消息只能被同一个消费者组内的一个消费者消费。消费者还会维护一个当前消费位置的指针,称为消费位移,用于记录该消费者在每个分区中已经消费到哪条消息。
由于Kaflk在实际使用中总会遇到诸如数据重复和丢失的问题为了解决它们,字节跳动开发了一种基于 Kafka 的改进方案,称为 BMQ。BMQ 的架构如下:
- BMQ Client:客户端组件,它包括 BMQ Producer 和 BMQ Consumer。BMQ Producer 负责向 BMQ 集群发送消息,它可以根据配置文件中的路由规则将消息发送到不同的主题或分区中。BMQ Consumer 负责从 BMQ 集群消费消息,它可以根据配置文件中的订阅规则从不同的主题或分区中拉取消息。
- BMQ Broker:服务器组件,它负责接收和存储 BMQ Client 发送的消息,以及提供给 BMQ Client 消费的消息。BMQ Broker 基于 Kafka Broker 进行了优化和扩展,增加了一些功能模块,如路由模块、存储模块等。
- BMQ Manager:管理组件,它负责对 BMQ 集群进行配置、监控、调度、运维等工作。其提供了一个 Web 界面和一个 API 接口,方便用户和开发者对 BMQ 集群进行管理和操作。