我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kubernetes消息队列的概念有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kubernetes消息队列的概念有哪些

这篇文章主要介绍“Kubernetes消息队列的概念有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Kubernetes消息队列的概念有哪些”文章能帮助大家解决问题。

服务质量

服务语义

服务质量一般可以分为三个级别,下面说明它们不同语义。

At most once

至多一次,消息可能丢失,但绝不会重复传输。生产者:完全依赖底层TCP/IP的传输可靠性,不做特殊处理,所谓“发送即忘”。kafka中设置acks=0。消费者:先保存消费进度,再处理消息。kafka中设置消费者自动提交偏移量并设置较短的提交时间间隔。

At least once

至少一次,消息绝不会丢,但是可能会重复。生产者:要做消息防丢失的保证。kafka中设置acks=1 或 all并设置retries>0。消费者:先处理消息,再保存消费进度。kafka中设置消费者自动提交偏移量并设置很长的提交时间间隔,或者直接关闭自动提交偏移量,处理消息后手动调用同步模式的偏移量提交。

Exactly once

精确一次,每条消息肯定会被传输一次且仅一次。这个级别光靠消息队列本身并不好保证,有可能要依赖外部组件。生产者:要做消息防丢失的保证。kafka中设置acks=1 或 all并设置retries>0。mosquito中通过四步握手与DUP、MessageID等标识来实现单次语义。消费者:要做消息防重复的保证,有多种方案,如:在保存消费进度和处理消息这两个操作中引入两阶段提交协议;让消息幂等;让消费处理与进度保存处于一个事务中来保证原子性。kafka中关闭自动提交偏移量,并设置自定义的再平衡监听器,监听到分区发生变化时从外部组件读取或者存储偏移量,保证自己或者其他消费者在更换分区时能读到最新的偏移量从而避免重复。总之就是结合ConsumerRebalanceListener、seek和一个外部系统(如支持事务的数据库)共同来实现单次语义。此外,kafka还提供了GUID以便用户自行实现去重。kafka 0.11版本通过3个大的改动支持EOS:1.幂等的producer;2. 支持事务;3. 支持EOS的流式处理(保证读-处理-写全链路的EOS)。这三个级别可靠性依次增加,但是延迟和带宽占用也会增加,所以实际情况中,要依据业务类型做出权衡。

可靠性

上面的三个语义不仅需要生产者和消费者的配合实现,还要broker本身的可靠性来进行保证。可靠性就是只要broker向producer发出确认,就一定要保证这个消息可以被consumer获取。

kafka 中一个topic有多个partition,每个partition又有多个replica,所有replica中有一个leader,ISR是一定要同步leader后才能返回提交成功的replica集,OSR内的replica尽力的去同步leader,可能数据版本会落后。在kafka工作的过程中,如果某个replica同步速度慢于replica.lag.time.max.ms指定的阈值,则被踢出ISR存入OSR,如果后续速度恢复可以回到ISR中。可以配置min.insync.replicas指定ISR中的replica最小数量,默认该值为1。LEO是分区的最新数据的offset,当数据写入leader后,LEO就立即执行该最新数据,相当于最新数据标识位。HW是当写入的数据被同步到所有的ISR中的副本后,数据才认为已提交,HW更新到该位置,HW之前的数据才可以被消费者访问,保证没有同步完成的数据不会被消费者访问到,相当于所有副本同步数据标识位。

每个partition的所有replica需要进行leader选举(依赖ZooKeeper)。在leader宕机后,只能从ISR列表中选取新的leader,无论ISR中哪个副本被选为新的leader,它都知道HW之前的数据,可以保证在切换了leader后,消费者可以继续看到HW之前已经提交的数据。当ISR中所有replica都宕机该partition就不可用了,可以设置unclean.leader.election.enable=true,该选项使得kafka选择任何一个活的replica成为leader然后继续工作,此replica可能不在ISR中,就可能导致数据丢失。所以实际使用中需要进行可用性与可靠性的权衡。

kafka建议数据可靠存储不依赖于数据强制刷盘(会影响整体性能),而是依赖于replica。

顺序消费

顺序消费是指消费者处理消息的顺序与生产者投放消息的顺序一致。主要可能破坏顺序的场景是生产者投放两条消息AB,然后A失败重投递导致消费者拿到的消息是BA。

kafka中能保证分区内部消息的有序性,其做法是设置max.in.flight.requests.per.connection=1,也就是说生产者在未得到broker对消息A的确认情况下是不会发送消息B的,这样就能保证broker存储的消息有序,自然消费者请求到的消息也是有序的。但是我们明显能感觉到这会降低吞吐量,因为消息不能并行投递了,而且会阻塞等待,也没法发挥 batch的威力。如果想要整个topic有序,那就只能一个topic一个partition了,一个consumer group也就只有一个consumer了。这样就违背了kafka高吞吐的初衷。

重复消费

重复消费是指一个消息被消费者重复消费了。 这个问题也是上面第三个语义需要解决的。

一般的消息系统如kafka或者类似的rocketmq都不能也不提倡在系统内部解决,而是配合第三方组件,让用户自己去解决。究其原因还是解决问题的成本与解决问题后获得的价值不匹配,所以干脆不解决,就像操作系统对待死锁一样,采取“鸵鸟政策”。但是kafka 0.11还是处理了这个问题,见发行说明,维护者是想让用户无可挑剔嘛 [笑cry]。

性能

衡量一个消息系统的性能有许多方面,最常见的就是下面几个指标。

连接数

是指系统在同一时刻能支持多少个生产者或者消费者的连接总数。连接数和broker采用的网络IO模型直接相关,常见模型有:单线程、连接每线程、Reactor、Proactor等。单线程一时刻只能处理一个连接,连接每线程受制于server的线程数量,Reactor是目前主流的高性能网络IO模型,Proactor由于操作系统对真异步的支持不太行所以尚未流行。

kafka的broker采用了类似于Netty的Reactor模型:1(1个Acceptor线程)+N(N个Processor线程)+M(M个Work线程)。其中Acceptor负责监听新的连接请求,同时注册OPACCEPT事件,将新的连接按照RoundRobin的方式交给某个Processor线程处理。每个Processor都有一个NIO selector,向 Acceptor分配的 SocketChannel 注册 OPREAD、OPWRITE事件,对socket进行读写。N由num.networker.threads决定。Worker负责具体的业务逻辑如:从requestQueue中读取请求、数据存储到磁盘、把响应放进responseQueue中等等。M的大小由num.io.threads决定。

Reactor模型一般基于IO多路复用(如select,epoll),是非阻塞的,所以少量的线程能处理大量的连接。如果大量的连接都是idle的,那么Reactor使用epoll的效率是杠杠的,如果大量的连接都是活跃的,此时如果没有Proactor的支持就最好把epoll换成select或者poll。具体做法是-Djava.nio.channels.spi.SelectorProvider把sun.nio.ch包下面的EPollSelectorProvider换成PollSelectorProvider。

QPS

是指系统每秒能处理的请求数量。QPS通常可以体现吞吐量(该术语很广,可以用TPS/QPS、PV、UV、业务数/小时等单位体现)的大小。

kafka中由于可以采用 batch 的方式(还可以压缩),所以每秒钟可以处理的请求很多(因为减少了解析量、网络往复次数、磁盘IO次数等)。另一方面,kafka每一个topic都有多个partition,所以同一个topic下可以并行(注意不是并发哟)服务多个生产者和消费者,这也提高了吞吐量。

平均响应时间

平均响应时间是指每个请求获得响应需要的等待时间。

kafka中处理请求的瓶颈(也就是最影响响应时间的因素)最有可能出现在哪些地方呢?网络? 有可能,但是这个因素总体而言不是kafka能控制的,kafka可以对消息进行编码压缩并批量提交,减少带宽占用;磁盘? 很有可能,所以kafka从分利用OS的pagecache,并且对磁盘采用顺序写,这样能大大提升磁盘的写入速度。同时kafka还使用了零拷贝技术,把普通的拷贝过程:disk->read buffer->app buffer->socket buffer->NIC buffer 中,内核buffer到用户buffer的拷贝过程省略了,加快了处理速度。此外还有文件分段技术,每个partition都分为多个segment,避免了大文件操作的同时提高了并行度。CPU? 不大可能,因为消息队列的使用并不涉及大量的计算,常见消耗有线程切换、编解码、压缩解压、内存拷贝等,这些在大数据处理中一般不是瓶颈。

并发数

是指系统同时能处理的请求数量数。一般而言,QPS = 并发数/平均响应时间 或者说 并发数 = QPS*平均响应时间。

这个参数一般只能估计或者计算,没法直接测。顾名思义,机器性能越好当然并发数越高咯。此外注意用上多线程技术并且提高代码的并行度、优化IO模型、减少减少内存分配和释放等手段都是可以提高并发数的。

扩展性

消息系统的可扩展性是指要为系统组件添加的新的成员的时候比较容易。

kafka中扩展性的基石就是topic采用的partition机制。第一,Kafka允许Partition在cluster中的Broker之间移动,以此来解决数据倾斜问题。第二,支持自定义的Partition算法,比如你可以将同一个Key的所有消息都路由到同一个Partition上去(来获得顺序)。第三,partition的所有replica通过ZooKeeper来进行集群管理,可以动态增减副本。第四,partition也支持动态增减。

对于producer,不存在扩展问题,只要broker还够你连接就行。对于consumer,一个consumer group中的consumer可以增减,但是最好不要超过一个topic的partition数量,因为多余的consumer并不能提升处理速度,一个partition在同一时刻只能被一个consumer group中的一个consumer消费

代码上的可扩展性就属于设计模式的领域了,这里不谈。

关于“Kubernetes消息队列的概念有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kubernetes消息队列的概念有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kubernetes消息队列的概念有哪些

这篇文章主要介绍“Kubernetes消息队列的概念有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Kubernetes消息队列的概念有哪些”文章能帮助大家解决问题。服务质量服务语义服务质量一般
2023-06-05

分布式消息队列RocketMQ概念详解

RocketMQ 是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ 的特点是纯JAVA实现,是一套提供了消息生产,存储,消费全过程API的软件系统,本文详细介绍了分布式消息队列RocketMQ概念,需要的朋友可以参考下
2023-05-19

RabbitMQ消息队列的特点有哪些

RabbitMQ消息队列的特点包括:可靠性:RabbitMQ使用持久化机制来确保消息的可靠性。它将消息存储在磁盘上,即使在重启服务器或发生故障时,消息也不会丢失。互通性:RabbitMQ支持多种消息协议,包括AMQP、STOMP、MQTT等
2023-10-25

linux消息队列有哪些特点

Linux消息队列具有以下特点:1. 异步通信:发送方和接收方可以独立进行操作,不需要等待对方的响应,提高了系统的并发性能。2. 解耦性:消息队列将发送方和接收方解耦,发送方只需将消息发送到队列中,而不需要知道具体的接收方是谁,接收方只需要
2023-09-21

redis消息队列的优缺点有哪些

Redis消息队列的优点包括:1. 高性能:Redis是基于内存的,能够提供非常高的读写速度,使得消息队列能够处理大量的消息。2. 可靠性:Redis支持持久化,可以将消息保存到磁盘上,即使发生宕机或重启,也能够恢复消息队列的状态。3. 灵
2023-09-16

RabbitMQ消息队列的应用场景有哪些

RabbitMQ是一个高性能的开源消息中间件,它可以在分布式系统中传递和存储大量的消息。它的应用场景非常广泛,包括但不限于以下几个方面:1. 异步通信:RabbitMQ可以用于解耦发送者和接收者之间的通信,发送者可以将消息发送到队列中,接收
2023-09-20

消息队列Rabbitmq的交换器类型有哪些

这篇文章主要介绍“消息队列Rabbitmq的交换器类型有哪些”,在日常操作中,相信很多人在消息队列Rabbitmq的交换器类型有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”消息队列Rabbitmq的交换
2023-06-01

Java中关于消息队列的面试题有哪些

这篇文章将为大家详细讲解有关Java中关于消息队列的面试题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。面试题1:说说你对消息队列的理解,消息队列为了解决什么问题?我们公司业务系统一开始体量较小,很
2023-06-20

Linux编程消息队列相关的函数有哪些

本篇内容介绍了“Linux编程消息队列相关的函数有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、消息队列简介消息队列本质上是位于内核
2023-06-28

Kafka和其他消息队列系统有哪些异同点

Kafka和其他消息队列系统的异同点主要体现在以下几个方面:数据存储方式:Kafka使用磁盘存储消息数据,而其他消息队列系统如RabbitMQ、ActiveMQ等通常使用内存存储消息数据。这使得Kafka能够支持更大规模的数据量和更长时间的
Kafka和其他消息队列系统有哪些异同点
2024-03-14

NIO的概念有哪些

这篇文章主要介绍了NIO的概念有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇NIO的概念有哪些文章都会有所收获,下面我们一起来看看吧。缓冲区(Buffers) 新的 Buffer 类是常规 Java 类和
2023-06-17

WCF消息队列的类型有几种

这篇文章主要介绍WCF消息队列的类型有几种,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!WCF经过长时间的发展,很多用户都很了解WCF了,这里我发表一下个人理解,和大家讨论讨论。WCF消息队列Message是由通信的
2023-06-17

J2SE的基本概念有哪些

这篇文章主要讲解了“J2SE的基本概念有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“J2SE的基本概念有哪些”吧!Java概述:  目前Java主要应用于中间件的开发(middlewa
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录