消息队列mq之kafka

奋斗的蜗牛灬 奋斗的蜗牛灬     2022-12-09     582

关键词:

前言

一、消息队列 MQ

  • MQ,Message Queue 消息队列

为什么需要消息队列(MQ)

主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。

我们使用消息队列,通过【异步处理】请求,从而缓解系统的压力。

消息队列常应用于 异步处理,流量削峰,应用解耦,消息通讯 等场景。

当前比较常见的 MQ 中间件有 ActiveMQ、RabbitMQ、RocketMQ、Pulsar。
在这里插入图片描述

使用消息队列的好处

(1)解耦

  • 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

(2)可恢复性

  • 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
  • 因为MQ 将消息保存在磁盘中,恢复后可以继续发送消息。

(3)缓冲(重点)

  • 有助于控制和优化数据流经过系统的速度,解决生产消息(先缓存) 和 消费消息 的处理速度不一致的情况
  • 生产消息 先进行缓存,放到缓冲区,消费消息 再慢慢去取,去处理,起到缓冲效果。

(4)灵活性 & 峰值处理能力

  • 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。
  • 使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
  • 比如抢红包、双十一秒杀活动场景

(5)异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

消息队列的两种模式

(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)
消息生产者生产消息发送到消息队列中,然后消息消费者从消息队列中取出并且消费消息。消息被消费以后,消息队列中不再有存储,所以消息消费者不可能消费到已经被消费的消息。消息队列支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

(2)发布/订阅模式(一对多,又叫观察者模式,消费者消费数据之后不会清除消息)
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic 的消息会被所有订阅者消费。
发布/订阅模式是定义对象间一种一对多的依赖关系,使得每当一个对象(目标对象)的状态发生改变,则所有依赖于它的对观察者对象)都会得到通知并自动更新。

二、Kafka 概述

Kafka定义

  • Kafka 是一个分布式的、基于发布/订阅模式的 消息队列,主要应用于大数据实时处理领域。

Kafka 简介

  • Kafka 是最初由 Linkedin 公司开发,于 2010年贡献给了Apache 基金会并成为顶级开源项目。
  • 是一个分布式、支持分区的(partition)、多副本的(replica),基于Zookeeper协调的分布式消息中间件系统
  • 它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop 的批处理系统、低延迟的实时系统、Spark/Flink流式处理引擎,nginx访问日志,消息服务等等
  • 用 scala语言编写,

Kafka 的特性

高吞吐量、低延迟

  • Kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒。每个topic可以分多个 Partition,Consumer Group对Partition进行消费操作,提高负载均衡能力和消费能力。
    ●可扩展性
  • kafka集群支持热扩展
    ●持久性、可靠性
  • 消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
    ●容错性
  • 允许集群中节点失败(多副本情况下,若副本数量为n,则允许 n-1个节点失败)

(1) Broker
一台kafka服务器就是一个 broker。一个集群由多个broker组成。一个 broker 可以容纳多个topic

(2)Topic
可以理解为一个队列,生产者和消费者面向的都是一个topic。
类似于数据库的表名或者ES 的index
物理上不同topic 的消息分开存储

(3) Partition
为了实现扩展性,一个非常大的 topic可以分布到多个 broker(即服务器)上,一个 topic可以分割为一个或多个partition,每个 partition 是一个有序的队列。Kafka只保i证partition内的记录是有序的,而不保证topic 中不同partition的顺序。

每个topic至少有一个partition,当生产者产生数据的时候,会根据分配策略选择分区,然后将消息追加到指定的分区的队列末尾。

##Partation数据路由规则:
1.指定了patition,则直接使用;
2.未指定 patition但指定key(相当于消息中某个属性),通过对key的value进行hash取模,选出一个patition;
3. patition和 key都未指定,使用轮询选出一个patition。
每条消息都会有一个自增的编号,用于标识消息的偏移量,标识顺序从О开始。每个partition中的数据使用多个segment文件存储。
如果 topic有多个partition,消费数据时就不能保证数据的顺序。严格保证消息的消费顺序的场景下(例如商品秒杀、抢红包),需要将partition数目设为1。

broker存储topic 的数据。如果某 topic有N个partition,集群有N个broker,那么每个 broker存储该 topio的一个partition。
·如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个 broker存储 topic的一个partition,剩下的M个broker 不存储该topic的partition数据。
·如果某topic有N个partition,集群中 broker 数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
//分区的原因
方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;
●可以提高并发,因为可以以Partition为单位读写了。

( 4) Leader
每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的 partition。

(5) Follower
Follower跟随Leader,所有写请求都通过Leader 路由,数据变更会广播给所有 Follower,Follower 与Leader保持数据同步。Follower只负责备份,不负责数据的读写。
如果Leader 故障,则从Follower中选举出一个新的 Leader。
当Follower 挂掉、卡住或者同步太慢,Leader 会把这个Follower 从ISR (Leader维护的一个和Leader保持同步的Follower集合)列表中删除,重新创建一个Follower。

( 6) Replica
副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个 leader和若干个follower。

(7) Producer
生产者即数据的发布者,该角色将消息发布到Kafka 的topic中。
broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的 segment 文件中。生产者发送的消息,存储到一个partition 中,生产者也可以指定数据存储的 partition。

(8) Consumer
消费者可以从 broker中读取数据。消费者可以消费多个topic中的数据。

(9) Consumer Group (CG)
消费者组,由多个consumer 组成。
所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。可为每个消费者指定组名,若不指定组名则属于默认的组。
将多个消费者集中到一起去处理某一个Topic 的数据,可以更快的提高数据的消费能力。
消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,防止数据被重复读取。消费者组之间互不影响。

(10) offset 偏移量
可以唯一的标识一条消息。
偏移量决定读取数据的位置,不会有线程安全的问题,消费者通过偏移量来决定下次读取的消息(即消费位置)。消息被消费之后,并不被马上删除,这样多个业务就可以重复使用Kafka 的消息。
某一个业务也可以通过修改偏移量达到重新读取消息的目的,偏移量由用户控制。消息最终还是会被删除的,默认生命周期为1周(7*24小时)。

(11) Zookeeper
Kafka通过Zookeeper来存储集群的meta信息。
由于consumer在消费过程中可能会出现断电宕机等故障,consumer恢复后,需要从故
障前的位置的继续消费,所以consumer需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。
Kafka 0.9版本之前,consumer 默认将offset 保存在Zookeeper中;从 0.9版本开始,
consumer默认将offset 保存在 Kafka一个内置的topic中,该topic为_consumer_ offsets。

三 实验

filebeat → kafka → logstash → es → kibana

elk
7-8 logstash
7-3 es
7-4 es filebeat

zookeeper

最详解消息队列以及rabbbitmq之helloworld(代码片段)

1、消息队列1、MQ的相关概念1、什么是MQ2、为什么要使用MQ1、流量消峰2、应用解耦3、异步处理3、MQ的分类1、ActiveMQ2、Kafka3、RocketMQ4、RabbitMQ对比特性ActiveMQKafkaRocketMQRabbitMQ单机吞吐量单机吞吐量万级,比RocketMQ、Kafka低一个数量... 查看详情

消息队列(mq)与kafaka概述(filebeat+kafka+elk部署)(代码片段)

消息队列(MQ)与kafaka概述(Filebeat+Kafka+ELK)部署一、消息队列(MQ)概述1、为什么需要消息队列(MQ)?2、使用消息队列的好处3、消息队列的两种模式二、Kafka定义1、Kafka简介2、Kafka的特性3、kafaka系统架构... 查看详情

kafka概述

Kafka概述消息列队(MQ)为什么需要消息队列(MQ)使用消息队列的好处消息队列的两种模式kafka简介Kafka定义Kafka简介Kafka的特性kafka系统架构消息列队(MQ)为什么需要消息队列(MQ)主要原因是由于在高并发... 查看详情

Kafka 连接与多个消息队列的集成

】Kafka连接与多个消息队列的集成【英文标题】:KafkaconnectintegrationwithmultipleMessageQueues【发布时间】:2019-11-2810:51:51【问题描述】:我正在设计一个必须与多个基于消息队列(MQ)的后端集成的系统。我为每个后端提供一个微服务,... 查看详情

mq消息队列之msmq

 主要参考文章:   消息队列(MessageQueue)简介及其使用   查看详情

kafka笔记整理(代码片段)

[TOC]Kafka笔记整理(一)Kafka简介消息队列(MessageQueue)消息Message网络中的两台计算机或者两个通讯设备之间传递的数据。例如说:文本、音乐、视频等内容。队列Queue一种特殊的线性表(数据元素首尾相接),特殊之处在于只允... 查看详情

消息队列mq/jms/kafka,你都了解吗?

...注公众号,实用技术文章及时了解是不是平常听到说消息队列啊,JMS啊,MQ啊、kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧。1消息队列介绍首先举个收快递的... 查看详情

消息队列面试题

...下:【activeMQ】【rabitMQ】【rocketMQ】【kafka】生产者投递消息到MQ,MQ存储消息,消费者从MQ消费消息:要分别确保上述三个过程都是成功的,有如下做法:解决方法如下:【rabbitmq解决积压范例】【kafka解决范例】 查看详情

kafka概述

Kafka概述消息列队(MQ)为什么需要消息队列(MQ)使用消息队列的好处消息队列的两种模式kafka简介Kafka定义Kafka简介Kafka的特性kafka系统架构消息列队(MQ)为什么需要消息队列(MQ)主要原因是由于在高并发... 查看详情

kafka概述

Kafka概述消息列队(MQ)为什么需要消息队列(MQ)使用消息队列的好处消息队列的两种模式kafka简介Kafka定义Kafka简介Kafka的特性kafka系统架构消息列队(MQ)为什么需要消息队列(MQ)主要原因是由于在高并发... 查看详情

mq之主流mq:kafaka+rocketmq+rabbitmq对比

参考技术A@TOC消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、... 查看详情

kafka,mq和redis作为消息队列使用

...日志处理缓冲组件,在大数据信息处理中使用。和传统的消息队列相比较简化了队列结构和功能,以流形式处理存储(持久化)消息(主要是日志)。日志数据量巨大,处理组件一般会处理不过来,所以作为缓冲层的kafka,支持... 查看详情

kafka,mq和redis作为消息队列使用

...日志处理缓冲组件,在大数据信息处理中使用。和传统的消息队列相比较简化了队列结构和功能,以流形式处理存储(持久化)消息(主要是日志)。日志数据量巨大,处理组件一般会处理不过来,所以作为缓冲层的kafka,支持... 查看详情

mq选型对比activemq,rabbitmq,rocketmq,kafka消息队列框架选哪个?

最近研究消息队列,发现好几个框架,搜罗一下进行对比,说一下选型说明:1)中小型软件公司,建议选RabbitMQ。一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便。不考虑rocketmq和kafka的原因是,一... 查看详情

mq消息队列及常见mq比较

一、什么是消息队列  我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰... 查看详情

消息队列之rabbitmq

关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块的知识整理记录一下了。市面上的消息队列产品有很多,比如老牌的ActiveMQ、RabbitMQ,目... 查看详情

什么是mq?

消息队列(MessageQueue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。 为什么会产生消息队列?有几个原因:不同进程(pro... 查看详情

消息队列之kafka从入门到小牛(代码片段)

目录一、Kafka介绍1.1消息队列的介绍1.2Kafka简介1.3安装Kafka集群二、Kafka使用初体验三、Kafka核心扩展内容3.1Broker扩展3.2Producer扩展3.3Consumer扩展3.4Kafka核心之存储和容错机制3.5Kafka高效读写数据3.6Zookeeper在Kafka中的作用3.7Kafka事务一... 查看详情