自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 springboot原理

springboot原理

2022-09-16 16:19:12 236

原创 redis(八:redis特性和扩展数据类型)

1 慢查询:慢查询是一个先进先出的队列。固定长度的,但执行命令超过特定配置则会进入该队列。保存在内存中。 slowlog-max-len 。

2021-06-15 21:22:09 293

原创 redis(七:redis来实现消息队列)

1

2021-06-15 16:43:51 362

原创 redis(六:redis哨兵集群的组成和运行机制)

哨兵之间互相发现,主要是通过redis的pub/sub实现的,也就是发布订阅模式。哨兵只要和主库建立了连接就可以在主库上发布消息了,比如发布自己的ip和端口。同时也可以从主库上订阅消息,获取其他...

2021-06-15 13:50:58 252

原创 redis(五:redis哨兵模式)

主从库集群模式下,如果从库挂了,主库还可以接受客户端的读写请求。但是如果主库挂了,读请求还可以继续,写请求就不被允许了。如果主库挂了,那就会从从库中选择一个出来作为主库。这里...

2021-06-11 11:36:36 248 1

原创 redis(四:redis主从库如何实现数据一致)

redis的高可靠: 1 数据尽可能的少丢失 2 fuw当redis因为宕机而执行数据恢复时,这个过程中redis是无法对外界做请求操作的。redis应对这个问题是

2021-06-11 10:30:45 314 1

原创 redis(三:redis RDB&AOF)

redis一般都是用来做数据缓存。但是当redis宕机,内存里的数据就会丢失。所以redis里的数据也要做持久化操作。第一时间想到的是从数据库里获取。但是这个操作很影响

2021-06-10 20:24:10 202 1

原创 redis(二:redis为什么快)

redis是单线程的。主要指的是redis的网络IO和键值对读写是由一个线程完成的。但是redis的其他功能持久化,异步删除都是由他们线程完成的。1.多线程导致资源过度消耗。多线程虽然能提高系统的吞吐率,但是带来的线程安全问题,线程上下文切换,线程阻塞问题,都会带来额外的开销。2 redis大部分的操作都是基于内存的。3 redis底层运用高效的数据结构,例如哈希表和跳表。4 redis采用多路复用机制,在网络IO操作中,能并发处理大量的客户端请求,实现高吞吐。基本的IO模型..

2021-06-10 19:10:24 130

原创 redis(一:redis底层数据结构)

一般说的redis的数据结构都是他说操作的数据结构,也就是数据的保存形式,比如string,list,hash,set,sorted set。这里说下他们的底层实现。底层数据结构一共六种,

2021-06-10 09:56:46 233

原创 kafka(十五:kafka的监控和优化)

高吞吐TPS: Broker 端进程或 Client 端应用程序每秒能处理的字节数或消息数。如下是kafka吞吐量优化Broker 端参数 num.replica.fetchers 表示的是 Follower 副本用多少个线程来拉取消息,默认使用 1 个线程。如果你的 Broker 端 CPU 资源很充足,不妨适当调大该参数值,加快 Follower 副本的同步速度。因为在实际生产环境中,配置了 acks=all 的 Producer 程序吞吐量被拖累的首要因素,就是副本同步性能。增加这个..

2021-05-10 20:46:41 1264

原创 kafka(十四:高水位和Leader Epoch)

高水位HW高水位的作用定义消息可见性,即用来标识分区下的哪些消息是可以被消费者消费的。 帮助 Kafka 完成副本同步。如上图是某分区中消息的水位情况。在分区高水位以下的消息被认为是已提交消息,反之就是未提交消息。消费者只能消费已提交消息,即图中位移小于 8 的所有消息。位移值等于高水位的消息属于未提交消息。也就是说,高水位上的消息是不能被消费者消费的。图中还有一个日志末端位移的概念,即 Log End Offset,简写是 LEO。它表示副本写入下一条消息的位移值。数字 15 所在的方

2021-05-09 15:07:40 384

原创 kafka(十三:Kafka控制器)

控制器是 Kafka 的核心组件。它的主要作用是在 ZooKeeper 的帮助下管理和协调整个 Kafka 集群。集群中任意一台 Broker 都能充当控制器的角色,但是在运行过程中只能有一个 Broker 成为控制器。ZooKeeper 通过watch机制赋予客户端监控 znode 变更的能力,一旦 znode 节点被创建、删除,子节点数量发生变化,抑或是 znode 所存的数据本身变更,ZooKeeper 会通过节点变更监听器 (ChangeHandler) 的方式显式通知客户端。ZooKeeper

2021-05-09 10:18:46 387 1

原创 kafka(十二:消费者组重平衡流程)

重平衡触发:组成员数量发生变化。 订阅主题数量发生变化。 订阅主题的分区数发生变化。重平衡过程通知到其他消费者实例:消费者端的心跳线程。Kafka Java 消费者需要定期地发送心跳请求到 Broker 端的协调者,以表明它还存活着。在 Kafka 0.10.1.0 版本之前,发送心跳请求是在消费者主线程完成的,也就是 KafkaConsumer.poll 方法的那个线程。消息处理逻辑也是在这个线程中完成的,一旦消息处理消耗了过长的时间,心跳请求将无法及时发到协调者那里,导致协调者“错误地”认

2021-05-09 09:34:27 313 4

原创 kafka(十一:Kafka Broker如何处理请求)

Kafka 使用的是Reactor 模式。Reactor 模式是事件驱动架构的一种实现方式,特别适合应用于处理多个客户端并发向服务器端发送请求的场景。从这张图中,多个客户端会发送请求给到 Reactor。Reactor 有个请求分发线程 Dispatcher,也就是图中的 Acceptor,它会将不同的请求下发到多个工作线程中处理。在这个架构中,Acceptor 线程只是用于请求分发,不涉及具体的逻辑处理,非常得轻量级,因此有很高的吞吐量表现。而这些工作线程可以根据实际业务处理需要任意增减,从而

2021-05-08 18:09:10 308

原创 kafka(十:Kafka副本机制)

副本机制,备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。 提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。 改善数据局部性。将数据放入与用户地理位置相近的地方,从而降低系统延时。Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本。所谓副本(Replica),本质就

2021-05-08 17:34:10 278

原创 kafka(九:消费者组 消费进度监控)

Kafka 消费者监控消费的滞后程度,这个滞后程度被称为:消费者 Lag 或 Consumer Lag。滞后程度就是指消费者当前落后于生产者的程度。Kafka 生产者向某主题成功生产了 100 万条消息,你的消费者当前消费了 80 万条消息,那么我们就说你的消费者滞后了 20 万条消息,即 Lag 等于 20 万。通常来说,Lag 的单位是消息数,一般是在主题这个级别上讨论 Lag 的,但实际上,Kafka 监控 Lag 的层级是在分区上的。如果要计算主题级别的,你需要手动汇总所有主题分区的 Lag

2021-05-07 21:03:14 899

原创 kafka(八:位移提交offset)

老版本的kafka Offset是Consumer 的消费位移,记录了 Consumer 要消费的下一条消息的位移。Consumer 需要向 Kafka 汇报自己的位移数据,这个过程被称为提交位移。Consumer 能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,即Consumer 需要为分配给它的每个分区提交各自的位移数据。提交位移主要是为了表征 Consumer 的消费进度,这样当 Consumer 发生故障重启之后,就能够从 Kafka 中读取之前提交的位移值,然后从..

2021-05-07 20:29:31 377

原创 kafka(七:位移主题__consumer_offsets)

1

2021-04-21 19:44:19 958

原创 kafka(六:消费者组和重平衡)

Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。组内可以有多个消费者,它们共享一个公共的 ID,这个 ID 被称为 Group ID,它标识唯一的一个 Consumer Group。组内的所有消费者协调在一起来消费订阅主题的所有分区。当然,每个分区只能由同一个消费者组内的一个 Consumer 实例来消费。 Consumer Group 之间彼此独立,互不影响,它们能够订阅相同的一组主题而互不干涉。如果所有实例都属于同一个 Group,那么它实现的就是消...

2021-04-20 23:03:42 315

原创 kafka(五:消息交付可靠性保障)

kafka实现消息精确可靠性的机制是幂等性和事务。幂等指的是某些操作或函数能够被执行多次,但每次得到的结果都是不变的。幂等性的其最大的优势在于可以安全地重试任何幂等性操作,反正不会破坏我们的系统状态。幂等性producer: Producer 默认不是幂等性的,但我们可以创建幂等性 Producer。指定消息生产者幂等性的方法设置enable.idempotence为true。enable.idempotence 被设置成 true 后,Producer 自动升级成幂等性 Produce...

2021-04-20 22:39:24 411

原创 kafka(四:kakfa拦截器)

kafka拦截器:Kafka 拦截器可以应用于包括客户端监控、端到端系统性能检测、消息审计等多种功能在内的场景。Kafka 拦截器分为生产者拦截器和消费者拦截器。生产者拦截器在发送消息前以及消息提交成功后植入你的拦截器逻辑;而消费者拦截器支持在消费消息前以及提交位移后编写特定逻辑。这两种拦截器都支持链的方式,将一组拦截器串连成一个大的拦截器,Kafka 会按照添加顺序依次执行拦截器逻辑。生产者实现拦截器只需要实现ProducerInterceptor 接口。onSend:该方法会在消息发..

2021-04-18 23:36:50 285

原创 kafka(三:无消息丢失配置怎么实现)

Kafka 只对“已提交”的消息做有限度的持久化。这里已提交指的是kafka的若干个broker成功接收到消息并成功写入到日志文件,他们就会告诉生产者这条消息提交成功。有限度指的是kafka并不能保证任何情况下都能保证消息不丢失。消息丢失的例子: 1 生产者Producer丢失消息。 可能的场景有网络抖动,导致消息压根就没有发送到 Broker 端,或者消息本身不合格导致 Broker 拒绝接收(比如消息太大了,超过了 Broker 的承受能力),当然如果broker宕机了也是发送...

2021-04-18 22:07:07 126

原创 kafka(二:生产者消息分区机制原理剖析)

分区的作用: 分区的作用是提供负载均衡的能力,实现系统的高伸缩性。不同的分区能够被分配到不同节点上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点都能独立执行各自分区的读写请求。还可以通过添加新的节点机器来增加整体系统的吞吐量。分区策略:分区策略是决定生产者将消息发送到哪个分区的算法。Kafka 提供了默认的分区策略,同时也支持自定义分区策略,实现如下接口自定义parttion方法即可。轮询策略 round-robin,即顺序分配。消息会按顺序一个一个的分配给所有分区...

2021-04-18 15:59:24 208

原创 kafka(一:kafka基本概念)

Kafka 属于分布式的消息引擎系统,它的主要功能是提供一套完备 的消息发布与订阅解决方案。在 Kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务、每个应用创建专属的主题。客户端: 生产者和消费者统称为客户端(Clients)。向主题发布消息的客户端称为生产者(Producer),生产者程序向一个或多个主题发送消息,而订阅这些主题消息的就被称为消费者 (Consumer)。和生产者类似,消费者也能够同时订阅多个主题的消息。服务端:Broker 的服务进程称为服务端。..

2021-04-18 15:03:22 625 1

原创 多线程(五:Lock和semaphore)

JAVA SDK并发包通过lock和condition两个接口来实现管程,其中lock用于解决互斥,condition用于解决同步问题。1.6之前的synchronized互斥锁,线程未获取到锁就进入阻塞状态。Lock针对这个问题做了一些设计来解决。如下:再造管程的设计理念:能够响应中断。synchronized 的问题是,持有锁 A 后,如果尝试获取锁 B 失败,那么线程就进入阻塞状态,一旦发生死锁,就没有任何机会来唤醒阻塞的线程。但如果阻塞状态的线程能够响应中断信号,也就是说当我们给阻塞的线

2021-04-11 15:22:16 437

原创 多线程(四:JAVA线程基础)

程序性能的指标:降低延迟,提高吞吐量。延迟指的是发出请求到收到响应这个过程的时间;延迟越短,意味着程序执行得越快,性能也就越好。吞吐量指的是在单位时间内能处理请求的数量;吞吐量越大,意味着程序能处理的请求越多,性能也就越好。这两个指标内部有一定的联系(同等条件下,延迟越短,吞吐量越大),但是由于它们隶属不同的维度(一个是时间维度,一个是空间维度),并不能互相转换。 有两个方向,第一个是优化算法,第二个是将提高硬件的性能。硬件性能主要是IO,CPU。所以要提升IO的利用率和CPU的利用率。线程数...

2021-04-06 22:58:11 95

原创 多线程(三:锁性能问题,管程MESA模型)

锁的性能问题: 锁会带来性能问题,最好的方案是使用无锁的算法和数据结构。例如本地存储(Thread Local Storage, TLS),写入时复制(Copy-on-write),乐观锁等。JAVA并发包里面的原子类是一种无锁的数据结构,Disruptor 则是一个无锁的内存队列。 减少锁持有的时间。互斥锁本质上就是将并行的锁串行化。所以要增加并行度,减少锁持有的时间。例如使用细粒度的锁,JAVA并发包里的ConcurrentHashMap,使用分段锁技术。还可以使用读写锁,读的时候...

2021-03-05 10:46:10 1343 2

原创 多线程(三:死锁,等待通知机制)

死锁:死锁是一直互相竞争的资源,都在等待对方释放锁资源,导致永久阻塞的情况。class Account { private int balance; // 转账 void transfer(Account target, int amt){ // 锁定转出账户 synchronized(this){ ① // 锁定转入账户 synchronized(target){ ② if (this.balance > amt)

2021-03-04 20:53:28 188 1

原创 多线程(二:JAVA内存模型)

JAVA内存模型(JMM。 java memory model) 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性,有序性的办法就是禁止缓存和编译优化。但是这样虽然解决了问题,但是性能很差,合理的方案是按需禁用缓存和编译优化。JMM规范了JVM如何按需禁用缓存和编译优化的方法,这些方法有volatile,synchronized和final三个关键字,以及六项happens-before原则。 volatile:volatile修饰一个变量,他告诉编译器,对这个变量的...

2021-03-03 23:14:22 130 1

原创 多线程(一:并发理论基础,可见性、原子性和有序性)

1可见性、原子性和有序性问题 缓存导致的可见性问题: 单核时代所有的线程都在一颗CPU上执行,CPU缓存与内存一致性容易解决。所有线程都操作同一颗CPU的缓存,一个线程对缓存的写,对另一个线程来说是可见的。一个线程对共享变量的修改,另一个线程立马可见,这就是可见性。 多核时代每个CPU都有自己的缓存,多个线程在不同的CPU上执行时,这些线程操作的是不同的CPU缓存,这时线程之间的变量就不具备可见性了。public class Test {...

2021-03-03 19:41:39 196 2

转载 JAVA虚拟机基本原理(六:运行时数据区)

JVM运行时数据区Java程序运行时,会基于类加载机制将类文件加载到JVM,并将类中的信息分解后放置到JVM的各个模块,以提供运行。程序(Java类)由数据、指令和控制(return等)组成。下面是JVM运行时数据区:1、程序计数器当前线程正在执行Java方法时,计数器存储的当前方法正在执行的字节码指令的地址和行号;若当前线程正在执行Native方法时,计数器存储的值为Undefined。并且程序计数器是唯一一个不会涉及OutOfMemoryError的区域。...

2021-03-03 10:36:25 142

原创 JAVA虚拟机基本原理(五:GC基本理论)

垃圾回收,顾名思义就是将分配出去的内存,但不在被使用的内存回收回来,以便能够再次分配。垃圾指的是死亡的对象所占据的堆内存。 GC判断算法:引用计数法与可达性分析 引用计数法: 引用计数法是为每个对象添加一个引用计数器。用来统计指向该对象的引用个数。一旦某个对象的引用计数器为0 ,则表示该对象已经死亡,便可以被垃圾回收了。一个引用被赋值给某一对象,那么该对象的计数引用加1,如果一个指向某对象的引用被赋值给其他对象,则该对象的引用计数减去1。期间我们需要截取所...

2021-03-02 15:05:50 161 1

原创 JAVA虚拟机基本原理(四:JAVA对象的内存布局)

JAVA对象的内存布局: 我们可以使用new关键字,反射机制,object.clone方法,反序列化,以及unsafe.allocateInstance方法来新建对象。object.clone方法,反序列化是通过复制已有的数据来初始化新建对象的实例字段。 new关键字和反射是通过调用构造器来初始化实例。 这里也提一下构造器,如果一个类没有定义任何的构造器的话,java编译器会自动添加一个无参构造器。子类的构造器需要调用父类的构造器,如果父类存在无参构造器的话,该调用可以是隐式的,也...

2021-03-02 13:12:47 80

原创 JAVA虚拟机基本原理(三:JVM如何处理异常和如何实现反射)

JVM如何处理异常 异常处理的两大组成要素是捕获异常和抛出异常。抛出异常分为显式和隐式两种,显式异常的主体是应用程序,显式异常是在程序中通过throw关键字手动抛出异常实例。隐式抛异常主体是JVM,他指的是JVM运行过程中碰到无法继续运行的异常,自动抛出异常,比如数组越界异常。异常捕获相关的代码块:try: 标记需要被进行异常监控的代码。catch: 捕获在try中触发的指定类型的异常。finally: 用来声明一段必定运行的代码。设计初衷是为了避免跳过某些关键的清理代码,比如..

2021-03-01 20:17:58 413 2

原创 JAVA虚拟机基本原理(二:JVM是如何执行方法调用的)

JVM是如何执行方法调用的在java程序中,一个类中出现多个名字相同,并且参数也相同的方法,那么他们是无法编译通过的。重载: 在同一个类中定义名字相同的方法,但是参数的类型和个数不同,这些方法之间的关系就是重载。重载的方法在编译期就完成识别。具体到每一个方法调用,java编译器会根据所传入的参数的声明类型来选择重载方法。重载方法在编译阶段已经完成。 选择过程分为三个阶段: 1 不考虑对基本类型的自动拆装箱,以及可变长参数的情况下选取重载方法。 2 上述情...

2021-02-28 15:27:16 267 1

原创 JAVA虚拟机基本原理(一:类如何类加载至JVM中)

目录 java代码是如何运行的 java虚拟机是如何加载类的 java代码是如何运行的 虚拟机在运行java代码之前,我们需要对代码进行一系列转换。以标准JDK的hotspot虚拟机为例,执行java代码首先需要将它编译成的class文件加载到java虚拟机中,加载后的java类会被存放于方法区中。实际运行时,虚拟机会先执行方法区内的代码。JVM会将栈细分为面向java方法的java方法栈,面向java方法的本地方法native栈,以及存放各个线程执行位置的...

2021-02-27 15:39:12 444 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除