- 博客(110)
- 收藏
- 关注
原创 零拷贝应用场景
大部分场景下,在Netty接收和发送ByteBuffer的过程中会使用直接内存进行Socket通道读写,使用JVM的堆内存进行业务处理,会涉及直接内存、堆内存之间的数据复制。内存的数据复制其实是效率非常低的,Netty提供了多种方法,以帮助应用程序减少内存的复制。Netty中的零拷贝和操作系统层面上的零拷贝是有区别的,不能混淆,我们所说的Netty零拷贝完全是基于Java层面或者说用户空间的,它更多的是偏向于应用中的数据操作优化,而不是系统层面的操作优化。
2025-07-26 19:44:30
1021
原创 Kafka MQ 消费者应用场景
在 Kafka 中默认的消费位移的提交方式是自动提交,这个由消费者客户端参数配置,默认值为 true。当然这个默认的自动提交不是每消费一条消息就提交一次,而是定期提交,这个定期的周期时间由客户端参数配置,默认值为5秒,此参数生效的前提是参数为true。在代码清单3-1中并没有展示出这两个参数,说明使用的正是默认值。在默认的方式下,消费者每隔5秒会将拉取到的每个分区中最大的消息位移进行提交。
2025-07-26 17:25:42
529
原创 Java8 默认的垃圾收集器
在Java中使用Metaspace(元空间)而移除了PermGenspace(永久区)。设置JVM的参数PermSize和MaxPermSize时会被忽略并给出警告。但是类的元数据信息(metadata)还在,只是不再存储在连续的堆空间中,而是移动到了被称为”Metaspace(元空间)”的本地内存(Native memory)中。结果分析:由结果可以看出Java8的GC情况是:-XX:+UseParallelGC,即Parallel Scavenge(新生代) + Parallel Old(老生代)。
2025-07-26 01:00:24
310
原创 Nacos 一致性协议 Distro协议
Distro 协议是 Nacos 社区自研的一种 AP 分布式协议,是面向临时实例设计的一种分布式协议,其保证了在某些 Nacos 节点宕机后,整个临时实例处理系统依旧可以正常工作。作为一种有状态的中间件应用的内嵌协议,Distro 保证了各个 Nacos 节点对于海量注册请求的统一协调和存储。
2025-07-25 17:45:02
1133
原创 JVM 垃圾收集器CMS和G1
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求。其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;
2025-07-24 17:19:35
845
原创 Kafka MQ 消费者与消费者群组
假设我们有一个应用程序,它从一个Kafka主题读取消息,在对这些消息做一些验证后再把它们保存起来。应用程序需要创建一个消费者对象,订阅主题并开始接收消息、验证消息和保存结果。但过了一阵子,生产者向主题写入消息的速度超过了应用程序验证数据的速度,这时候该怎么办呢?如果只使用单个消费者来处理消息,那么应用程序会远远跟不上消息生成的速度。显然,此时很有必要对消费者进行横向伸缩。就像多个生产者可以向相同的主题写入消息一样,也可以让多个消费者从同一个主题读取消息。Kafka消费者从属于消费者群组。
2025-07-22 09:17:04
46
原创 RocketMQ 可靠性优先的生产者和消费者
顺序消息是指消息的消费顺序和产生顺序相同,在有些业务逻辑下,必须保证顺序。比如订单的生成、付款、发货,这3个消息必须按顺序处理才行。顺序消息分为全局顺序消息和部分顺序消息,全局顺序消息指某个Topic下的所有消息都要保证顺序;部分顺序消息只要保证每一组消息被顺序消费即可,比如上面订单消息的例子,只要保证同一个订单ID的三个消息能按顺序消费即可。
2025-07-21 16:48:50
36
原创 Kafka MQ 控制器 broker
在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。当使用脚本为某个topic增加分区数量时,同样还是由控制器负责分区的重新分配。
2025-07-20 14:31:43
102
原创 RocketMQ路由中心NameServer
主要介绍RocketMQ路由管理、服务注册及服务发现机制。NameServer是整个RocketMQ的“大脑”,相信大家对“服务发现”这个词并不陌生,分布式服务SOA架构体系的服务注册中心主要提供服务调用的解析服务,指引服务调用方(消费者)找到“远方”的服务提供者,完成网络通信,那么RocketMQ的路由中心存储的是什么数据呢?作为一款高性能的消息中间件,如何避免NameServer的单点故障,提供高可用性呢?让我们带着这些疑问,一起进入RocketMQ NameServer的精彩世界。本章重点内容如下。
2025-07-19 23:23:13
137
原创 Nacos 的一致性模型 AP 和 CP
Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它的全称是 Naming and Configuration Service,旨在帮助开发者更轻松地构建、交付和管理微服务应用。服务发现:支持服务的注册和发现,确保服务之间的通信高效且可靠。动态配置:支持动态配置管理,允许在不重启服务的情况下更新配置。服务管理:提供服务实例的健康检查、负载均衡和故障转移等功能。
2025-07-17 16:48:32
900
原创 高并发四种IO模型的底层原理
为了避免用户进程直接操作内核,保证内核安全,操作系统将内存(虚拟内存)划分为两部分:一部分是内核空间(Kernel-Space),另一部分是用户空间(User-Space)。在Linux系统中,内核模块运行在内核空间,对应的进程处于内核态;用户程序运行在用户空间,对应的进程处于用户态。操作系统的核心是内核程序,它独立于普通的应用程序,既有权限访问受保护的内核空间,也有权限访问硬件设备,而普通的应用程序并没有这样的权限。内核空间总是驻留在内存中,是为操作系统的内核保留的。
2025-07-15 23:19:52
1066
原创 Java 并发AQS为什么是双向链表
AQS采用双向链表设计的主要原因在于其高效性:双向链表便于快速插入/删除节点(如线程中断时移除节点),能直接访问前驱节点判断线程状态,减少头部竞争,支持条件队列高效迁移,以及从尾部遍历快速定位线程。这些特性使双向链表成为AQS实现高并发同步机制的最佳选择,有效提升了线程管理和同步操作的效率。
2025-07-11 22:48:55
328
原创 Java 并发 Monitor机制
设objectX是任意一个对象,monitorX是这个对象对应的内部锁,假设有线程A、B、C同时申请monitorX,那么由于任意一个时刻只有一个线程能够获得(占用/持有)这个锁,因此除了胜出(即获得了锁)的线程(这里假设是B)外,其他线程(这里就是A和C)都会被暂停(线程的生命周期状态会被调整为BLOCKED)。如果有个线程执行了objectX.wait(),那么该线程就会被暂停(线程的生命周期状态会被调整为WAITTING)并被存入objectX的Wait Set(以下记为waitSetX)之中。
2025-07-09 17:20:38
889
原创 Redis 持久化
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。命令有那么只要满足以下三个条件中的任意一个,BGSAVE。
2025-06-26 23:02:00
336
原创 Redis 为什么选用跳跃表,而不是红黑树
一般来说,平衡树每个节点包含2个指针(分别指向左右子树),而skiplist每个节点包含的指针数目平均为1/(1-p),具体取决于参数p的大小。而哈希表在保持较低的哈希值冲突概率的前提下,查找时间复杂度接近O(1),性能更高一些。Redis只在两个地方用到了跳跃表,一个是实现有序集合键(zset),另一个是在集群节点中用作内部数据结构,除此之外,跳表在Redis里面没有其他用途。2)平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。
2025-06-26 23:01:00
255
原创 Redis 缓存穿透、雪崩、击穿
缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。代码流程想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。
2025-06-26 22:59:17
300
原创 Java 并发掌握AQS的原理及应用
本文深入解析了Java并发编程中的AQS(AbstractQueuedSynchronizer)框架及其应用。主要内容包括: AQS是Java同步类(Lock、Semaphore等)的基础框架,提供原子状态管理、线程阻塞/唤醒和队列模型功能 以ReentrantLock为例,对比分析其与synchronized的特性差异,展示AQS在实际锁实现中的应用 详细剖析AQS的五层架构设计,从API层到底层数据结构,重点讲解独占锁的实现机制 介绍AQS核心数据结构Node,解析CLH变体队列的节点实现和状态管理 通
2025-06-18 14:46:46
846
原创 JVM 四种垃圾收集算法
标记-清除算法是最基础的收集算法,如同它的名字一样,算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,标记过程其实就是通过引用计数算法或者根搜索算法来判断对象是否存活。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。它的主要不足有两个:一个是效率问题,标记和清除两个过程的效率都不高;
2025-06-16 10:48:09
829
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人