MQ 及 Kafka 相关组件简介

server/2024/10/21 4:14:02/

Kafka

在这里插入图片描述

Kafka 简介

​ Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,由 Scala 和 Java 编写,Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

​ Kafka 的架构师 jay kreps 对于 kafka 的名称由来是这样讲的,由于jay kreps 非常喜欢 franz kafka,并且觉得kafka 这个名字很酷,因此取了个和消息传递系统完全不相干的名称 Kafka,该名字并没有特别的含义。

​ Kafka作为一个分布式流处理平台,其设计旨在提供高性能、高可扩展性和高可靠性的消息队列服务,特别适用于大规模数据流处理场景。

在这里插入图片描述

消息队列

消息队列(Message Queue,简称MQ)是一种应用间的通信方法,它通过在应用程序之间引入一个中间层,来解耦消息的生产和消费过程。

在这里插入图片描述

具体来说,消息队列的工作原理如下:

  1. 解耦(Decoupling):消息队列允许消息的生产者(Producer)和消费者(Consumer)独立工作,它们不需要直接交互或了解对方的存在。生产者只需将消息放入队列,而消费者则从队列中取出并处理消息。这样,系统组件之间就不需要紧密绑定,提高了系统的灵活性和可维护性。

  2. 削峰填谷(Load Leveling):在高流量期间,消息队列可以作为缓冲区暂时存储过多的请求,待系统有能力处理时再逐步消费这些消息。这样可以防止因瞬间高峰流量导致的服务崩溃,使系统负载更加平滑。

  3. 异步处理(Asynchronous Processing):消息队列支持异步处理模式,即生产者无需等待消息被处理完毕即可继续执行后续操作。这种方式可以提高整体系统的响应速度和吞吐量。

  4. 可扩展性和可靠性:通过复制和分布式部署,消息队列可以容易地扩展以应对更大的消息量,并通过消息确认和持久化机制确保消息不会丢失。

  5. 传输模式:主要有两种模式:

    • 点对点(Point-to-Point, P2P):每个消息只能被一个消费者消费,一旦消息被消费,通常会从队列中移除。

    在这里插入图片描述

    • 发布/订阅(Publish/Subscribe, Pub/Sub):消息可以被多个订阅了相同主题的消费者消费,每个消费者都会收到一份消息副本。

    在这里插入图片描述

  6. 常用的消息队列产品:包括但不限于RabbitMQ、Apache Kafka、ActiveMQ、RocketMQ、Amazon SQS等,这些产品各有侧重,比如Kafka以其高吞吐量和低延迟特别适合大规模数据流处理场景。

总之,消息队列作为一种中间件技术,通过提供异步、解耦、可靠的通信机制,极大地增强了复杂分布式系统的设计灵活性和稳定性。

消息中间件

“MQ” 是 “Message Queue”(消息队列)的缩写,通常被用来指代消息中间件。在技术领域,人们经常交替使用这两个术语。

消息中间件(Message-Oriented Middleware, MOM)是一种系统软件或服务,它支持和促进分布式应用程序之间的异步通信。通过消息中间件,不同的应用程序组件可以在无需直接连接或同步等待的情况下交换数据和指令,从而提高了系统的可扩展性、灵活性和解耦性

常见的消息中间件产品:

  • RabbitMQ:基于AMQP(Advanced Message Queuing Protocol)协议的开源消息队列系统,支持多种编程语言,提供高可用性和灵活的路由规则。
  • Apache Kafka:专为高吞吐量实时处理设计的分布式流处理平台,适用于日志聚合、实时数据流处理和大规模消息传递。
  • ActiveMQ:Apache旗下的开源消息中间件,支持多种消息协议,如JMS、AMQP等,具备高可用和集群部署能力。
  • IBM MQ:企业级消息中间件,支持多种平台和协议,强调高可靠性和安全性,适用于大型企业集成。
  • Redis Pub/Sub:虽然Redis主要是一个键值存储系统,但也提供发布/订阅功能,可以用于简单的消息传递场景。

消息中间件是现代分布式系统架构中的重要组成部分,它帮助开发者构建更健壮、可扩展和灵活的应用程序。

Kafka 核心特性

Kafka 是一种高吞吐量的分布式发布-订阅消息系统,由Apache软件基金会开发并维护。它最初由LinkedIn公司创建,后成为开源项目,并广泛应用于大数据处理和实时数据流场景中。下面是Kafka的一些核心特点和组件介绍:

  1. 高吞吐量与低延迟:Kafka设计目标之一就是即使在处理极大量消息时也能保持较低的端到端延迟,适合实时数据处理场景。
  2. 可扩展性:通过添加更多的服务器(称为Broker)到集群中,Kafka能够线性地扩展消息处理能力,支持处理更大的数据量和更高的并发需求。
  3. 持久性与可靠性:Kafka将消息持久化到磁盘,并支持配置消息副本,确保即使在硬件故障情况下数据也不会丢失,从而提供了高度的数据可靠性。
  4. 容错性:通过副本集机制,Kafka能够在单个或多个Broker发生故障时自动切换到其他可用副本,保证服务的连续性。
  5. 发布-订阅模型:消息生产者(Producer)向特定的主题(Topic)发布消息,而多个消息消费者(Consumer)可以通过订阅这些主题来接收消息。这一模式支持一对多的消息分发。
  6. 分区(Partitioning):每个主题可以被划分为多个分区,分区使得消息可以在多个Broker间分布,从而提高系统的并行处理能力和吞吐量。
  7. 消费组(Consumer Group):允许一组消费者以组的形式工作,每个分区的消息只会被该组内的一个消费者消费,这为实现消息的并行消费和实现容错提供了便利。
  8. 消息保证:支持至少一次或精确一次的消息传递语义,满足不同应用场景的需求。
  9. 资源效率:通过批量处理、消息压缩等技术减少网络传输和存储开销,对CPU和内存的使用也相对高效。
  10. 生态丰富:Kafka生态系统包括了一系列工具如Kafka Connect、Kafka Streams等,方便数据集成和流处理。

Kafka 关键组件

Kafka的关键组件包括:

  1. Broker
    Kafka集群的核心组件,每个Broker是一个独立运行的服务器实例,负责接收、存储、索引以及转发消息。Broker是Kafka系统中的消息中转站,它们构成了Kafka的分布式架构基础。多个Broker组成集群,共同工作以提供高可用性和水平扩展能力。

  2. Topic
    消息的逻辑分类,类似于消息队列的概念。每个Topic可以视为一个消息通道,生产者向Topic发布消息,消费者从Topic订阅并消费消息。一个Topic可以被划分为多个Partition,以支持并行处理和扩展。

  3. Partition
    Topic中的数据被切分成多个有序的、不可变的消息序列,每个这样的序列称为一个Partition。Partition是Kafka可扩展性的基础,通过将一个Topic的数据分散到多个Broker上的不同Partition中,可以实现数据的并行处理和提高吞吐量。每个Partition还可以配置副本以提高数据的持久性和可用性。

  4. Producer(生产者)
    负责生成消息并将消息发送到Kafka Broker的客户端应用程序。生产者可以选择将消息发送到特定的Topic和Partition,或者根据Kafka提供的分区策略(如轮询、哈希等)自动分配。生产者还支持消息的批量发送和压缩,以提高效率。

  5. Consumer(消费者)
    订阅Topic并消费其中消息的客户端应用程序。消费者可以属于一个或多个消费组,同一个组内的消费者会相互竞争消息消费,实现消息的负载均衡,而不同组的消费者则会独立消费所有消息。Kafka支持自动位移管理和手动位移管理,以控制消息的消费进度。

  6. Consumer Group(消费者组)
    一群共享相同组ID的消费者实例。Kafka通过消费者组来实现消息的并行消费和故障恢复。同一组内的消费者会自动分配Topic的Partition,确保每个Partition的消息只被组内一个消费者消费,实现消息的均匀分配和高可用。

  7. ZooKeeper
    虽然随着Kafka版本更新,对ZooKeeper的依赖有所减少,但在许多版本中,ZooKeeper仍扮演着重要的角色,用于存储Kafka集群的元数据、选举Partition的领导者、管理Broker和消费者的会话等。它帮助Kafka集群维持一致性状态和进行协调。

这些组件共同协作,使得Kafka能够提供高吞吐量、低延迟、可扩展性强且具有高可靠性的消息队列服务。

Kafka 应用场景

Kafka 作为一个高度可扩展、高性能的分布式流处理平台,广泛应用于多种场景中,以下是其主要应用场景:

  1. 日志收集与分析:Kafka 常被用于收集来自不同服务的日志数据,作为统一的数据管道,将日志流式传输至数据分析系统(如ELK Stack: Elasticsearch, Logstash, Kibana)、Hadoop 或数据仓库,用于实时监控、日志分析和离线处理。

  2. 消息系统:作为消息队列使用,Kafka 能够解耦系统组件,实现生产者和消费者的异步通信。生产者将消息发布到特定主题,消费者订阅这些主题并按需消费消息,适用于构建松耦合、高可用的微服务架构。

  3. 用户行为跟踪与分析:在线服务如网站或移动应用可以利用Kafka收集用户活动数据,如点击流、搜索记录、购买行为等,供实时分析系统处理,进行用户行为分析、个性化推荐或实时监控。

  4. 运营指标与监控:Kafka 可用于收集和分发各类业务指标和系统监控数据,如交易量、错误率、性能指标等,为运营团队提供实时反馈和报警,支撑报表生成和数据分析。

  5. 事件驱动架构:在事件驱动的系统设计中,Kafka 作为事件总线,连接起不同的服务和组件,使得系统能够对事件作出响应,实现高度解耦和灵活性。

  6. 数据集成:通过 Kafka Connect 等工具,可以轻松地在不同系统之间(如数据库、数据湖、消息系统)集成数据流,支持数据的实时同步和ETL(提取、转换、加载)过程。

  7. 流处理:结合 Kafka Streams 或其他流处理框架(如Apache Flink、Spark Streaming)进行实时数据处理和分析,支持复杂的计算逻辑,如聚合、窗口计算和模式匹配。

  8. 削峰填谷:作为缓冲区,Kafka帮助系统应对流量峰值,通过暂存多余请求,平滑处理负载,防止服务过载。

  9. 物联网(IoT)数据收集:Kafka能高效处理来自大量设备的实时数据流,用于监测、分析和管理物联网设备产生的数据。

这些应用场景展示了 Kafka 在现代数据密集型应用中的核心价值,即提供一个高性能、可伸缩、灵活的数据传输平台,支撑数据流动和处理的各个环节。

Kafka 环境搭建

Kafka的环境搭建可以根据不同的需求和场景采取不同的模式,主要包括以下几种:

  1. 单机模式(Standalone Mode)
    在这种模式下,Kafka、Zookeeper 以及生产者和消费者都在同一台机器上运行。这是最简单的部署方式,主要用于学习、测试和开发环境中。不需要考虑网络配置和集群管理,但无法体现 Kafka 的分布式特性和高可用性。

  2. 伪分布式模式(Pseudo-Distributed Mode)
    虽然所有组件仍然部署在同一台物理机器上,但是 Kafka 和 Zookeeper 会模拟分布式环境运行,即分别启动多个 Zookeeper 实例和 Kafka Broker 实例。这种方式可以模拟实际的集群环境,便于理解和调试 Kafka 的分布式特性,同时不需要额外的硬件资源。

  3. 分布式模式(Distributed Mode)
    在生产环境中,Kafka 和 Zookeeper 会部署在不同的服务器上,形成真正的分布式集群。Kafka集群包含多个Broker 节点,Zookeeper 集群用于管理 Kafka 的元数据和协调 Broker及消费者之间的通信。这种模式下,可以配置副本集来增强数据的持久性和容错性,同时通过增加节点来提升系统的整体处理能力和可靠性。

  4. 云环境部署
    Kafka 也可以在云平台上部署,如AWS、Azure、Google Cloud等,利用云服务提供商的基础设施和服务来快速搭建和管理 Kafka 集群。云服务商通常提供预配置的Kafka服务,简化了安装、配置、扩展和运维工作。

  5. 容器化部署
    使用 Docker 容器或 Kubernetes 等容器编排工具来部署 Kafka 和 Zookeeper,可以实现更灵活的资源管理和自动扩缩容能力。这种方式特别适合微服务架构和持续集成/持续部署(CI/CD)流程。

每种模式的选择取决于具体的使用场景、资源条件、性能要求以及运维能力。对于开发和测试环境,单机模式或伪分布式模式可能更为便捷;而对于生产环境,则需要考虑分布式模式或利用云服务和容器技术来满足高可用性和可扩展性的需求。

Kafka 的搭建过程,放在下一章节来讲解!


http://www.ppmy.cn/server/38985.html

相关文章

等保测评—Linux-CentOS标准范例截图

密码输入错误无法登录 用户账户情况包含root、guanli、shenji 查看审计用户权限 身份鉴别: cat /etc/passwd,核查用户名和 UID,是否存在同样的用户名和 UID cat /etc/shadow,查看文件中各用户名状态 , 核查密码一栏为…

Unity调用智谱API(简单操作 文本实时翻译)

代码展示: using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI;public class ZhiPuAi : MonoBehaviour {// API的端点URLpublic string…

银行卡OCR识别接口快速对接

银行卡OCR识别接口又叫银行卡卡面信息识别接口、银行卡文字信息识别API接口,指的是传入银行卡照片,精准识别静态银行卡图像上的文字信息,包括银行卡号、卡类型、银行名称等。那么银行卡OCR识别接口如何快速对接呢? 首先我们找到一…

力扣题目101:对称二叉树

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

var, let, const 的区别

var, let, const 是JavaScript中用于声明变量的关键字。 var:可以声明变量,没有块级作用域的概念,可以重复声明变量,其值可以改变。 var x 10; // 声明变量x var x 20; // 重新声明变量x,值改变 console.log(x); /…

使用PyMuPDF(fitz)提取PDF文件文本内容

安装PyMuPDF库(如果还没有安装的话): pip install pymupdf使用以下Python脚本来提取指定页面的文本: import fitz # 导入PyMuPDF库def extract_text_from_specific_page(file_path, page_number):# 打开PDF文件doc fitz.open(…

unity基础(一)

内容概要: 生命周期函数vector3 位置 方向 缩放旋转等信息Vector3欧拉角和Quaternion四元素unity脚本执行顺序设置 一 生命周期函数 方法说明Awake最早调用,所以一般可以再此实现单例模式OnEnable组件激活后调用,在Awake后会调用一次Start在Update之前调用一次&a…

【退役之重学Java】如何保证从消息队列里拿到的消息顺序执行

一、场景 MySQL binlog 同步数据,比如大数据team。在MySQL中进行增删改查,将其 binlog 发送到 MQ 里面,到消费出来执行,这里就必须要保证其顺序执行,不然数据库就会错乱。 二、如何保证消息的顺序性呢? …