Java八股整合(Kafka+RocketMQ+K8S)

消息队列

用于进程中相互通信的队列

放入消息的是生产者,取出消息的是消费者

应用场景

异步处理,削峰/限流,解耦

用Java模拟消息队列

用一个线程当生产者,当消息队列中消息数小于最大队列容量时向队列中加入消息,满了则阻塞

另一个线程当消费者,当消息队列非空时取出消息,空了则阻塞

队列由空到放入消息时唤醒消费者,队列从满到取出消息时唤醒生产者

JMS和AMQP

RPC

Kafka

分布式流式处理平台,削峰填谷

三个关键功能:消息队列,容错的持久方式存储记录消息流(持久化到磁盘。避免消息丢失),流式处理平台

用于秒杀活动,大数据和日志异构同步

分布式系统,由通过高性能TCP网络协议通信的服务器和客户端组成

主要用于消息队列和流数据处理

二进制数据传输

特性

消息持久化

高吞吐量

扩展性强(动态扩展)

多语言支持

流处理

安全机制

数据备份

轻量级

消息压缩

高性能

可以有多个生产者和消费者,也可以将不同的消息进行分类,分成不同的topic放入不同队列,生产者分类投递,消费者按需订阅

单个topic过长还可以分成多个partition分区,每个消费者负责一个分区

高扩展性

将partition分散部署在多台机器上,每台机器代表一个broker,通过增加机器缓解机器CPU过高带来的性能问题

高可用

给partition增加副本replicas,分为leader和follower,leader负责应对生产者和消费者的读写请求,follower只负责同步leader的消息,将leader和follower分散到不同broker上,leader挂了就选举出一个新的partition顶上

持久化和过期策略

将消息放入磁盘中,设置retention policy过期策略,磁盘满了或者过期了就清理掉

消费者组

不同消费者组维护自己的消费进度,互相隔离

ZooKeeper

ZooKeeper组件定期和broker通信,获取整个kafka集群的状态

一个新的broker加入后,其他broker马上就能感知到

分布式协调服务:在分布式环境下让多个实例同时获取到同一份信息的服务

zookeeper是通用的分布式协调服务,可以用于服务注册和发现,还可以用于分布式锁配置管理等场景

但是ZooKeeper过重,在2.8.0版本支持移除Zookeeper,通过broker之间加入一致性算法Raft实现同样效果,这就是Kraft或Quorum模式

如何保证消息顺序消费

生产者通过对消息的key对partition取模,决定把消息放在哪个partition中,消息按照先后有序存储在partition中

消息被路由在不同partition分区,消费者通过balance机制分别指派了对应的消费分区,因为消费者是完全独立的网络节点,所以可能导致消息的消费顺序不是按照发送顺序实现的,导致消费乱序问题

解决方案:自定义消息分区的路由算法,把指定的key发送到一个partition中,指定一个消费者专门消费某个分区的数据

在有些设计方案中,在消费端采用异步线程方式消费数据,提高消息处理效率。每个消费者消费消息速率不同,即便是分区消费也可能出现无序访问的问题

解决方案:在消费端采用一个阻塞队列,把获取到的消息保存到阻塞队列里,采用异步线程从阻塞队列中获取消息进行消费

RocketMQ

和kafka区别

架构减法,功能加法

简化协调节点

将zookeeper去掉,换成了NameServer,轻量级方式管理消息队列的集群信息

简化分区

分区从partition换成Queue

kafka中partition会存储完整的消息体,rocketMQ中Queue只存储简要信息,比如消息偏移offset

消息完整数据放在CommitLog文件上,通过offset定位到CommitLog上的某条消息

kafka只需要从partition中读一次即可,rocketMQ需要读两次

底层存储

kafka底层存储partition分为多段segment,生产者写入数据到partition本质是写入到某个segment文件下,对每个文件都是顺序写,当topic变多时,partition也变多,segment也变多,同时写多个文件时,虽然每个文件内部都是顺序写,但是多个文件存放在磁盘不同地方,顺序写磁盘劣化为随机写,写性能降低

rockerMQ底层存储将单个broker下的多个topic数据全部写到一个逻辑文件CommitLog上,将所有写操作变为顺序写

简化备份模型

kafka同步本质是同步partition下的segment文件数据

RocketMQ直接同步CommitLog文件,通过broker为单位区分主从,保持高可用同时简化备份模型

消息过滤

RocketMQ支持在消息上打标记tag,可以区分同一topic上的消息类型

支持事务

kafka支持事务是发送消息要么同时成功要么同时失败

RocketMQ支持事务是执行自定义逻辑和生产者发消息这两件事同时成功或失败

加入延时队列

加入死信队列

多次重试都发送失败,RocketMQ会把消息放在一个专门的队列,方便后续单独处理

kafka需要手动ack重置偏移量

消息回溯

kafka可以调整offset控制消费者从某个地方开始消费

RocketMQ可以调整offset和时间

缺点

性能(吞吐量)不如kafka

为什么不如kafka

零拷贝技术不同,批处理,数据压缩

数据从磁盘发送到网络过程

首先程序发起系统调用read(),将磁盘数据拷贝到内核空间的缓冲区,再从内核空间缓冲区拷贝到用户空间

程序再发起系统调用write(),将数据从用户空间拷贝到socket发送缓冲区

再从发送缓冲区拷贝到网卡,通过网络到达消费者

总共两次系统调用,对应四次用户态和内核态切换和四次数据拷贝

零拷贝

mmap:操作系统内核提供的一个方法,可以将内核空间缓冲区映射到用户空间,将read()调用改为mmap()方法,不需要从内核缓冲区拷贝到用户空间,但还需要拷贝到socket缓冲区然后拷贝到网卡

sendfile:也是内核提供的方法,发起系统调用sendfile()后,内核将磁盘数据拷贝到内核空间缓冲区,然后直接拷贝到网卡,只需要两次数据拷贝,不需要CPU参与数据拷贝

RocketMQ使用mmap技术,kafka使用sendfile技术

为什么RocketMQ不用sendfile

mmap返回的是数据具体内容,应用层能获取到消息内容,并进行逻辑处理

sendfile返回的是成功发送字节数,应用层不知道消息内容,RocketMQ需要了解具体的消息内容,方便二次投递(死信队列)

选哪个?

大数据场景(Spark,Flink)用kafka

其他场景尽量用RocketMQ

RabbitMQ

K8S

本质上是应用服务和服务器之间的中间层,通过暴露一系列API能力简化服务的运维部署流程,可以通过这些API能力搭建自己的服务管理平台

可以通过策略协调和管理多个应用服务,只需要一个yaml文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,能让他们自动扩缩容,在一个服务器挂了后可以自动在其他服务器上自动部署应用

架构设计

服务器分为控制平面control plane和工作节点Node,控制平面控制和管理各个Node,Node实际运行各个应用服务

控制平面

通过调用API,由Scheduler调度器查看服务器内存和CPU资源部署应用

Controller Mgr控制器管理器负责创建和关闭服务

将数据保存到存储层ETCD

工作节点

可以是裸机服务器或虚拟机

多个应用服务共享一台Node上的内存和CPU等计算资源

只需要将服务代码打包成Container Image容器镜像,就能一行命令直接部署(容器镜像可以理解为将应用代码和系统环境打包成压缩包,在任意服务器上解压即可正常运行服务)

为了下载和部署镜像,Node中会有container runtime容器运行时组件,每个应用服务可以认为是一个container,大多数时候还会为应用服务搭配一个日志收集器container或监控采集器container,多个container组成一个pod,运行在Node上

K8S可以将pod从某个Node,调度到另一个Node,还能以pod为单位做重启和动态扩缩容的操作

Node组件Kubelet用于接收控制平面的命令,负责管理和监控pod

Node中还有个kube proxy,负责Node的网络通信功能,可以将外部请求转发到pod中

Cluster

控制平面和工作节点共同构成了一个Cluster集群,一般会构建多个Cluster集群,比如生产环境和测试环境

为了将集群内部服务暴露给外部用户使用,还会部署一个入口控制器Ingress控制器,让外部用户访问集群内部服务

Kubectl

命令行工具Kubectl,只需要执行命令,内部就会调用K8S的API

使用方式

编写yaml文件,定义pod用到了哪些镜像,占用内存和CPU等信息

然后使用Kubectl命令行工具执行kubectl apply -f xx.yaml文件

Kubectl将解析后的对象通过API请求发送给K8S

API Server驱使Scheduler通过ETCD提供的数据寻找合适的Node

再驱使Controller Mgr控制Node创建服务

Node内部的Kubelet开始基于container runtime组件拉取镜像创建容器

最终完成pod创建

调用过程

之前直接发送HTTP请求,发送到Nginx服务器,转发到部署的服务内

现在外部请求先到达K8S集群的Ingress控制器,然后转发到K8S内某个Node的kube proxy上,找到对应的pod后转发到容器内部服务中,处理结果原路返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++进阶】之C++11的简单介绍(三)

📃博客主页: 小镇敲码人 💚代码仓库,欢迎访问 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧…

Vue项目实战-新能源汽车可视化(一)(持续更新中)

一.项目代码 1.App.vue <template><!-- 模板--><div id"wrapper"><div style"width: 100%"><el-tabs v-model"activeName" id"tabs"> <!-- 标签栏里包含了三个标签面板&#xff0c;分别是研发与维…

web前端-html:简单创建表格表单相结合的网页

效果&#xff1a; <body><form action"这里如果为空表单提交后不会有任何操作"method"get"<label for"edit">用户名</label><input type"text" name"用户名" id"最好不要空&#xff0c;id属性…

【论文学习与撰写】论文里配图的题注、多张图片同列排版格式等

目录 1、插入题注 2、多张图排版 1、插入题注 word--引用--插入题注&#xff0c;就会出来这个 直接点确定的话&#xff0c;是会出来图1/图2/图3.。。。之类的 那是因为标签设置的是 图 如图新建标签为&#xff1a; 图 1. 那么&#xff0c;插入题注之后&#xff0c;就会…

【分立元件】贴片电阻的额定功率

贴片电阻器通过电流后将会发热。而贴片电阻的额定功率(Power Rating)是在额定环境温度中可在连续工作状态下使用的最大功率值。 此外,由于使用温度的上限是确定的,因此在高于额定环境温度的条件下使用时,需要按照以下的功率降额曲线来降低功率。额定环境温度是能够…

ionic Capacitor 生成 Android 应用

官方文档 https://ionic.nodejs.cn/developing/android/ https://capacitorjs.com/docs/getting-started 1、创建新的 Capacitor 应用程序 空目录下面 npm init capacitor/app2、install Capacitor npm install npm start在这里插入图片描述 3、生成dist目录 npm run buil…

SpringBoot篇(缓存层)

目录 前言 缓存是什么&#xff1f; 一、SpringBoot内置缓存解决方案 1. 简介 2. 手机验证码案例 二、SpringBoot整合Ehcache缓存 1. 简介 2. 总结 三、SpringBoot整合Redis缓存 1. 简介 2. 总结 四、SpringBoot整合Memcached缓存 1. 简介 2. 安装 3. 变更缓存为M…

5G 现网信令参数学习(1) - MIB

MIB消息中的参数 systemFrameNumber 000101B, subCarrierSpacingCommon scs30or120, ssb-SubcarrierOffset 6, dmrs-TypeA-Position pos2, pdcch-ConfigSIB1 { controlResourceSetZero 10, searchSpaceZero 4 }, cellBarred notBarred, intraFreqReselection allowed, sp…

1024程序员节特惠题解!

#题外话&#xff1a;/ #先看题目 题目传送门https://www.luogu.com.cn/problem/P1035#思路&#xff1a;直接模拟&#xff08;Shift1&#xff09; #代码&#xff1a; #include <bits/stdc.h> using namespace std; int main(){double cnt0,k,sum0,x;cin>>k;while…

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器&#xff0c;由C语言编写&#xff0c;用于用户与操作系统之间进行交互。用户可以通过Shell输入命令&#xff0c;操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能&#xff0c;允许用户…

【Mac 上将 MOV 格式转换为 MP4 格式的简易指南】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

R语言笔记(四):函数

文章目录 一、Function basics1、Creating your own function2、Function structure3、Using your created function4、Multiple inputs5、Default inputs 二、Return values and side effects1、Returning more than one thing2、Side effectsExample of side effect: plot 三…

从零开始学python必看,最强“Python编程三剑客(pdf)”

目录 三剑客PDF传送门&#xff1a;三剑客 第一本&#xff1a;《Python编程&#xff1a;从入门到实践》 1.1《Python编程&#xff1a;从入门到实践》第一部分&#xff1a;基础知识 1.2《Python编程&#xff1a;从入门到实践》第二部分&#xff1a;项目 第二本&#xff1a;《…

Metasploit渗透测试之模块学习与开发

# 概述 Metasploit 框架采用模块化架构&#xff0c;即所有漏洞利用、有效载荷、编码器等都以模块形式存在。模块化架构使框架功能的扩展更加容易。任何程序员都可以开发自己的模块&#xff0c;并将其轻松移植到框架中。 # 1、使用辅助模块 在之前的"信息收集和扫描 &qu…

【设计模式-原型】

**原型模式&#xff08;Prototype Pattern&#xff09;**是一种创建型设计模式&#xff0c;旨在通过复制现有对象的方式来创建新对象&#xff0c;而不是通过实例化类来创建对象。该模式允许对象通过克隆&#xff08;复制&#xff09;来创建新的实例&#xff0c;因此避免了重新创…

QT-使用QSS美化UI界面

一、QSS简介&#xff1a; Qt Style Sheet&#xff1a;Qt样式表&#xff0c;用来自定义控件外观的一种机制&#xff0c;可以把他类比成CSS&#xff08;CSS主要功能与最终目的都是能使界面的表现与界面的元素分离&#xff09;。QSS机制使应用程序也能像web界面那样随意地改变外观…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时&#xff0c;使用latest作为tag取到的并非最新版本&#xff0c;本文尝试用实际最新版本的版本号进行pull&#xff0c;从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

基于vue框架的的高校消防设施管理系统06y99(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;设备分类,设备信息,维修人员,报修信息,维修进度,院系,消防知识,培训记录,培训信息,备件信息,备件申请,派发信息,采购信息 开题报告内容 基于Vue框架的高校消防设施管理系统开题报告 一、项目背景与意义 随着高校规模的不断扩大和校园建…

OpenCV和HALCON

OpenCV和HALCON是两种广泛用于图像处理和计算机视觉的开发库&#xff0c;它们各有优缺点&#xff0c;适合不同的应用场景。以下是两者的比较&#xff1a; 1. 开发背景与定位 OpenCV (Open Source Computer Vision Library)&#xff1a; 开源库&#xff0c;最初由Intel开发&…

【EmbeddedGUI】PFB设计说明

PFB设计说明 背景介绍 一般来说&#xff0c;要实现屏幕显示&#xff0c;就是向特定像素点写入颜色值&#xff0c;最简单的办法就是直接通过SPI接口&#xff0c;向显示器芯片的特定缓存地址&#xff0c;写入像素点。一般来说&#xff0c;显示器芯片会提供2个基本操作API&#…