MQ同类产品对比以及选型-Kafka的背后故事

Kafka最初由LinkedIn开发,旨在解决大规模数据管道问题,现已发展为高性能实时数据处理平台。Kafka采用append-only日志存储结构,确保数据不丢失,适用于数据波峰波谷变化。自2010年开源以来,Kafka已成为Apache顶级项目,被广泛应用于实时数据通道和分布式备份日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Kafka诞生于LinkedIn,使用Scala语言编写,目标是为处理实时数据提供一个统一、高通量、低等待的平台。Kafka设计之初是为了解决Linkedin公司数据管道(datapipe)问题(主要是监控和跟踪系统的需求,也就是日志)。截至2015年8月, Kafka帮助LinkedIn的使用量增长了超过1万亿条消息,每天消耗的数据超过1 PB。

Kafka名字的由来

       “我认为,由于Kafka是一个针对写作优化的系统,使用作者的名字是有道理的。 我在大学里学过很多课程,并且喜欢弗兰兹卡夫卡。 此外,对于一个开源项目来说这个名字听起来很酷。”--Jay Kreps

Kafka产生背景
        kafka 起创于2010年前后,作为一个消息系统,早起设计的目的是用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeline)。当时 LinkedIn 也和很多大的互联网公司一样,每天都要收集很多的数据,包含用户的活动数据和运营数据。活动数据包括页面访问量(PV),浏览轨迹,用户搜索。运营数据包括务器的性能数据CPU、IO使用率、请求时间、服务日志等。这些数据都是实时生成的,而且数量非常庞大。Linkin在尝试很多MQ产品发现,当时 MQ 系统都有两个比较通用的缺陷:一是数据丢失,当消费者无法及时消费数据时数据会被丢失;二是当时的MQ产品很难配合数据的波峰和波谷。

“所以 2010 年我们开始自己开发 Kafka。它的设计理念非常简单,就是一个以 append-only 日志作为核心的数据存储结构。简单来说,就是我们把数据以日志的方式进行组织,所有对于日志的写操作,都提交在日志的最末端,对日志也只能是顺序读取。Kafka 的日志存储是持久化到磁盘上的,虽然普遍感觉上 HDD 非常慢,但其实如果能够把所有的读和写都按照顺序来进行操作,会发现它几乎可以媲美内存的随机访问。另外,我们直接使用文件系统的缓存,如果你读取的基本上是在日志最尾端,那么绝大可能性只会访问到这个文件系统的缓存,而不需落盘。所以它的速度非常快。”---王国璋老师在 QCon 2018 上海站的演讲

Kafka发展历程
        2010年底Kafka在GitHub上作为开源项目发布,初始版本为0.7.0。
        2011年7月被提议并被接受为Apache Software Foundation孵化器项目。
        2012年10月开始Apache Kafka毕业于孵化器成为apache顶级项目;
        2014年,开发者团队jay kreps,neha narkhede,jun rao离开linkedin,创建confluent,并着眼于Kafka。
总结:
        Kafka作为一个流处理平台,是一个不断进化的平台。最后再次借用王国璋老师的话总结一下Kafka是什么。
“最早的时候,我们说 Kafka 是一个可扩展的订阅发布的消息系统;2013 年的时候,我们说 Kafka 是一个实时数据通道;2015 年的时候,我们说 Kafka 是一个分布式的备份 Log,同年,我们提出了 Kafka Architecture,是针对 Lamda Architecture 提出的一个新的框架,我们认为 Kafka 是一个统一数据集成堆栈。”---王国璋老师在 QCon 2018 上海站的演讲
 

### MQKafka集成的解决方案 在现代分布式系统中,消息队列(MQ)和流处理平台(如Kafka)是构建高可用、可扩展系统的基石。以下内容将详细介绍如何将MQ(例如RabbitMQ)与Kafka进行集成,并提供一些实际的使用教程或解决方案。 #### 1. RabbitMQKafka的功能对比 RabbitMQ基于AMQP协议实现,支持复杂的路由规则和灵活的消息传递模式[^2]。而Kafka则专注于高吞吐量的数据流处理,适用于大规模日志收集、实时数据分析等场景[^1]。两者的功能定位不同,但可以结合使用以满足不同的业务需求。 #### 2. 集成场景分析 在某些场景下,可能需要将RabbitMQ中的消息转发到Kafka中进行进一步处理。例如: - 将RabbitMQ作为轻量级的消息入口,接收来自前端应用的消息。 - 使用Kafka作为后端数据管道,进行批量处理或持久化存储。 #### 3. 技术实现方案 以下是通过Spring Boot框架实现RabbitMQKafka的消息转发的具体步骤: ##### 3.1 添加依赖 在项目的`pom.xml`文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 上述代码片段展示了如何引入RabbitMQKafka的相关依赖[^3]。 ##### 3.2 配置RabbitMQ监听器 创建一个RabbitMQ监听器,用于接收消息并将其转发到Kafka中: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; @Service public class RabbitToKafkaService { private final KafkaTemplate<String, String> kafkaTemplate; public RabbitToKafkaService(KafkaTemplate<String, String> kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } @RabbitListener(queues = "inputQueue") public void receiveMessage(String message) { // 将接收到的消息发送到Kafka主题 kafkaTemplate.send("outputTopic", message); } } ``` ##### 3.3 配置Kafka生产者 确保Kafka生产者的配置正确无误: ```yaml spring: kafka: producer: bootstrap-servers: localhost:9092 key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer ``` ##### 3.4 Docker环境搭建 如果需要快速搭建Kafka集群,可以参考以下Docker Compose配置文件[^4]: ```yaml version: "1" services: kafka: image: 'bitnami/kafka:latest' hostname: kafka ports: - 9092:9092 - 9093:9093 volumes: - 'D:\Docker\Kafka\data:/bitnami/kafka' environment: KAFKA_CFG_NODE_ID: 0 KAFKA_CFG_PROCESS_ROLES: controller,broker KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@kafka:9093 KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.2.51:9092 KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_CFG_INTER_BROKER_LISTENER_NAME: PLAINTEXT networks: kafka_net: driver: bridge ``` #### 4. 可视化工具推荐 为了方便调试和监控,可以使用Offset Explorer等工具来查看Kafka主题的消费情况[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值