java
文章平均质量分 87
it噩梦
好记性不如烂笔头
展开
-
rocketmq源码之consumer
文章目录2.5 Consumer2.5.1 消息消费概述2.5.2 消息消费初探2.5.3 消费者启动流程2.5.4 消息拉取1)PullMessageService实现机制2)ProcessQueue实现机制3)消息拉取基本流程1.客户端发起拉取请求2.消息服务端Broker组装消息3.消息拉取客户端处理消息4.消息拉取总结4)消息拉取长轮询机制分析2.5.5 消息队列负载与重新分布机制2.5.6 消息消费过程2.5.7 定时消息机制2.5.8 顺序消息2.5.9 小结2.5 Consumer2.5.原创 2022-05-19 20:00:00 · 645 阅读 · 1 评论 -
rocketmq源码之消息存储
文章目录2.4.1 消息存储核心类2.4.2 消息存储流程2.4.3 存储文件2.4.4 存储文件内存映射1)MappedFileQueue2)MappedFile3)TransientStorePool2.4.5 实时更新消息消费队列与索引文件1)转发到ConsumerQueue2)转发到Index2.4.6 消息队列和索引文件恢复1)存储文件加载2)正常恢复3)异常恢复2.4.7 刷盘机制同步刷盘异步刷盘2.4.8 过期文件删除机制2.4.9 小结2.4.1 消息存储核心类private fina原创 2022-05-18 21:30:00 · 801 阅读 · 0 评论 -
rocketmq源码分析之Producer
文章目录1.3.1 方法和属性1)主要方法介绍1.3.2 启动流程1.3.3 消息发送1)验证消息2)查找路由3)选择队列4)发送消息1.3.4 批量消息发送消息生产者的代码都在client模块中,相对于RocketMQ来讲,消息生产者就是客户端,也是消息的提供者。1.3.1 方法和属性1)主要方法介绍//创建主题void createTopic(final String key, final String newTopic, final int queueNum) throws MQCl原创 2022-05-17 14:01:22 · 672 阅读 · 0 评论 -
rocketmq源码分析之NameServer、Broker
文章目录1.2.1 架构设计1.2.2 启动流程步骤一步骤二步骤三1.2.3 路由管理1.2.3.1 路由元信息1.2.3.2 路由注册1)发送心跳包2)处理心跳包1.2.3.3 路由删除1.2.3.4 路由发现1.2.4 小结1.2.1 架构设计消息中间件的设计思路一般是基于主题订阅发布的机制,消息生产者(Producer)发送某一个主题到消息服务器,消息服务器负责将消息持久化存储,消息消费者(Consumer)订阅该兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(Push模式)或者原创 2022-05-16 18:15:01 · 1431 阅读 · 0 评论 -
idea 源码启动rocketmq
文章目录1.1 环境搭建1.1.1 源码拉取1.1.2 导入IDEA1.1.3 调试1)启动NameServer2)启动Broker3)发送消息4)消费消息2.1 rocketmq dashboard搭建1.1 环境搭建依赖工具JDK :1.8+MavenIntelliJ IDEA1.1.1 源码拉取从官方仓库 https://github.com/apache/rocketmq clone或者download源码。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(i原创 2022-05-16 21:15:00 · 786 阅读 · 0 评论 -
rocketmq相关总结
文章目录1.1 消息存储1.1.1 存储介质1.1.3 消息的存储和发送1)消息存储2)消息发送1.1.4 消息存储结构1.1.5 刷盘机制1)同步刷盘2)异步刷盘1.2 高可用性机制1.2.1 消息消费高可用1.2.2 消息发送高可用1.2.3 消息主从复制1.3 负载均衡1.3.1 Producer负载均衡1.3.2 Consumer负载均衡1)集群模式1.4 消息重试1.4.1 顺序消息的重试1.4.2 无序消息的重试1)重试次数2)配置方式1.5 死信队列1.5.1 死信特性1.5.2 查看死信信息原创 2022-05-16 20:00:00 · 623 阅读 · 0 评论 -
Netty内存分配之ByteBuf
文章目录1.1初始认识ByteBuf1.1.1 ByteBuf的基础结构1.1.2 ByteBuf的基本分类1.2 ByteBufAllocator内存管理器1.3 非池化内存内存分配1.3.1 堆内内存的分配1.1初始认识ByteBufByteBuf主要负责把数据从底层I/O读到ByteBuf,然后传递给应用程序,应用程序处理完成之后再把数据封装成ByteBuf写回I/O。1.1.1 ByteBuf的基础结构我们来看netty * +-------------------+------原创 2022-05-05 15:16:37 · 1405 阅读 · 0 评论 -
netty 优化与源码
文章目录1. 优化1.1 扩展序列化算法1.2 参数调优1)CONNECT_TIMEOUT_MILLIS2)SO_BACKLOG3)ulimit -n4)TCP_NODELAY5)SO_SNDBUF & SO_RCVBUF6)ALLOCATOR7)RCVBUF_ALLOCATOR1.3 RPC 框架1)准备工作2)服务器 handler3)客户端代码第一版4)客户端 handler 第一版5)客户端代码 第二版6)客户端 handler 第二版2. 源码分析2.1 启动剖析2.2 NioEventL原创 2022-05-02 11:13:46 · 280 阅读 · 0 评论 -
netty 进阶
文章目录1. 粘包与半包1.1 粘包现象1.2 半包现象1.3 现象分析1.4 解决方案方法1,短链接方法2,固定长度方法3,固定分隔符方法4,预设长度2. 协议设计与解析2.1 为什么需要协议?2.2 redis 协议举例2.3 http 协议举例2.4 自定义协议要素编解码器💡 什么时候可以加 @Sharable3. 聊天室案例3.1 聊天室业务介绍3.2 聊天室业务-登录3.3 聊天室业务-单聊3.4 聊天室业务-群聊3.5 聊天室业务-退出3.6 聊天室业务-空闲检测连接假死1. 粘包与半包1.原创 2022-04-27 22:22:55 · 645 阅读 · 0 评论 -
Netty入门
文章目录二. Netty 入门1. 概述1.1 Netty 是什么?1.2 Netty 的作者1.3 Netty 的地位1.4 Netty 的优势2. Hello World2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理💡 提示3. 组件3.1 EventLoop💡 优雅关闭演示 NioEventLoop 处理 io 事件💡 handler 执行中如何换人?演示 NioEventLoop 处理普通任务演示 NioEventLoop 处理定时任务3.2 ChannelChannelFutureCl原创 2022-04-23 21:28:48 · 332 阅读 · 0 评论 -
NIO 基础总结
文章目录一. NIO 基础1. 三大组件1.1 Channel & Buffer1.2 Selector多线程版设计⚠️ 多线程版缺点线程池版设计⚠️ 线程池版缺点selector 版设计2. ByteBuffer2.1 ByteBuffer 正确使用姿势2.2 ByteBuffer 结构💡 调试工具类2.3 ByteBuffer 常见方法分配空间向 buffer 写入数据从 buffer 读取数据mark 和 reset字符串与 ByteBuffer 互转⚠️ Buffer 的线程安全2.4 S原创 2022-04-23 15:52:22 · 1486 阅读 · 0 评论 -
单机canal监听binlog
文章目录简介环境部署MySQLCanal安装Canal客户端开发创建client_demo项目Maven依赖在canal_demo模块创建包结构开发步骤Canal消息格式转换为JSON数据简介基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger(触发器) 获取增量变更从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务,原创 2022-04-11 09:12:52 · 1059 阅读 · 0 评论 -
Apache Druid 总结
文章目录Druid架构与原理Druid系统架构详解索引服务Overlord节点MiddleManager节点Coordinator节点Historical节点Broker节点Druid数据存储数据存储数据分区SegmentSegment内部存储结构roll-up聚合位图索引Druid架构与原理Druid系统架构详解Druid有5种节点:OverlordMiddleManagerCoordinatorHistoricalBroker以下是这几个节点的主要功能:Overlord、Mid原创 2022-04-10 11:14:53 · 863 阅读 · 0 评论 -
es相关总结
选举策略读流程写流程常见优化总结原创 2022-03-27 21:56:55 · 2951 阅读 · 0 评论 -
kafka相关总结
文章目录Kafka的应用场景消息队列的两种模型Kafka中的重要概念事务消息生产者分区写入策略消费组Consumer Group Rebalance机制消费者的分区分配策略副本的ACK机制高级API(High-Level API)、低级API(Low-Level API)leader和followerAR\ISR\OSRleader选举Kafka读写流程Kafka的物理存储消息传递的语义性Kafka的消息不丢失数据积压数据清理&配额限速Kafka的应用场景异步处理系统解耦流量削峰日志处理原创 2022-03-10 18:05:50 · 453 阅读 · 0 评论 -
常见限流算法总结
文章目录概述固定窗口计数器算法滑动窗口计数器算法令牌桶算法漏桶算法限流算法对比Sentinel的限流与Gateway的限流有什么差别?概述限流算法常见的包括:计数器算法,又包括窗口计数器算法、滑动窗口计数器算法令牌桶算法(Token Bucket)漏桶算法(Leaky Bucket)固定窗口计数器算法固定窗口计数器算法概念如下:将时间划分为多个窗口,窗口时间跨度称为Interval,本例中为1000ms;每个窗口维护一个计数器,每有一次请求就将计数器加一,限流就是设置计数器阈值,本.原创 2022-03-05 19:24:01 · 556 阅读 · 0 评论 -
AQS总结
文章目录概述主要用到 AQS 的并发工具类ReentrantLock 原理非公平锁实现原理公平锁加锁过程条件变量实现原理概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 .原创 2022-03-03 17:35:10 · 459 阅读 · 0 评论 -
synchronized 总结
文章目录Monitor 原理synchronized 原理Monitor 原理每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针。Monitor 结构如下:刚开始 Monitor 中 Owner 为 null当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2,Monito.原创 2022-02-26 22:20:51 · 795 阅读 · 0 评论 -
java中volatile总结
原子性起因:多线程下,不同线程的指令发生了交错导致的共享变量的读写混乱解决:用悲观锁或乐观锁解决,volatile 并不能解决原子性可见性起因:由于编译器优化、或缓存优化、或 CPU 指令重排序优化导致的对共享变量所做的修改另外的线程看不到解决:用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见有序性起因:由于编译器优化、或缓存优化、或 CPU 指令重排序优化导致指令的实际执行顺序与编写顺序不一致解决:用 volatile 修.原创 2022-02-11 16:38:48 · 579 阅读 · 0 评论 -
wait 和 sleep比较
文章目录一个共同点,三个不同点共同点不同点代码示例一个共同点,三个不同点共同点wait() ,wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态不同点方法归属不同sleep(long) 是 Thread 的静态方法而 wait(),wait(long) 都是 Object 的成员方法,每个对象都有醒来时机不同执行 sleep(long) 和 wait(long) 的线程都会在等待相应毫秒后醒来wait(lon.原创 2022-02-11 15:09:08 · 822 阅读 · 0 评论 -
Java线程相关总结
六种状态及转换分别是新建当一个线程对象被创建,但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联可运行调用了 start 方法,就会由新建进入可运行此时与底层线程关联,由操作系统调度执行终结线程内代码已经执行完毕,由可运行进入终结此时会取消与底层线程关联阻塞当获取锁失败后,由可运行进入 Monitor 的阻塞队列阻塞,此时不占用 cpu 时间当持锁线程释放锁时,会按照一定规则唤醒阻塞队列中的阻塞线程,唤醒后的线程进入可运行状态等待.原创 2022-02-11 23:30:00 · 1096 阅读 · 0 评论 -
Hashtable vs ConcurrentHashMap
Hashtable 对比 ConcurrentHashMapHashtable 与 ConcurrentHashMap 都是线程安全的 Map 集合Hashtable 并发度低,整个 Hashtable 对应一把锁,同一时刻,只能有一个线程操作它ConcurrentHashMap 并发度高,整个 ConcurrentHashMap 对应多把锁,只要线程访问的是不同锁,那么不会冲突ConcurrentHashMap 1.7**数据结构:Segment(大数组) + HashEntry(小数组.原创 2022-02-10 17:05:15 · 646 阅读 · 0 评论 -
方法区、永久代、元空间
方法区是 JVM 规范中定义的一块内存区域,用来存储类元数据、方法字节码、即时编译器需要的信息等永久代是 Hotspot 虚拟机对 JVM 规范的实现(1.8 之前)元空间是 Hotspot 虚拟机对 JVM 规范的另一种实现(1.8 以后),使用本地内存作为这些信息的存储空间从这张图学到三点当第一次用到某个类是,由类加载器将 class 文件的类元信息读入,并存储于元空间X,Y 的类元信息是存储于元空间中,无法直接访问可以用 X.class,Y.class 间接访问类元信息,它们俩属..原创 2022-02-10 23:15:00 · 644 阅读 · 0 评论 -
java 代码的执行理解JVM内存划分
结合一段 java 代码的执行理解内存划分执行 javac 命令编译源代码为字节码执行 java 命令创建 JVM,调用类加载子系统加载 class,将类的信息存入方法区创建 main 线程,使用的内存区域是 JVM 虚拟机栈,开始执行 main 方法代码如果遇到了未见过的类,会继续触发类加载过程,同样会存入方法区需要创建对象,会使用堆内存来存储对象不再使用的对象,会由垃圾回收器在内存不足时回收其内存调用方法时,方法内的局部变量、方法参数所使用的是 JVM 虚拟机栈中的栈帧内存调.原创 2022-02-10 23:15:00 · 476 阅读 · 0 评论 -
java中出现OOM情况总结
前言除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。Java Heap 溢出原创 2022-02-10 23:30:00 · 1912 阅读 · 1 评论 -
java中四种引用
文章目录强引用软引用(SoftReference)弱引用(WeakReference)虚引用(PhantomReference)演示虚引用的基本用法模拟 ThreadLocalMap, 采用引用队列释放 entry 内存强引用普通变量赋值即为强引用,如 A a = new A();通过 GC Root 的引用链,如果强引用不到该对象,该对象才能被回收软引用(SoftReference)例如:SoftReference a = new SoftReference(new A()).原创 2022-02-09 15:06:27 · 335 阅读 · 0 评论 -
Spring bean 循环依赖
文章目录循环依赖的产生构造循环依赖的解决思路1思路2示例1:用 @Lazy 为构造方法参数生成代理示例2:用 ObjectProvider 延迟依赖对象的创建示例3:用 @Scope 产生代理示例4:用 Provider 接口解决解决 set 循环依赖的原理一级缓存一级缓存与循环依赖二级缓存二级缓存与创建代理三级缓存循环依赖的产生首先要明白,bean 的创建要遵循一定的步骤,必须是创建、注入、初始化三步,这些顺序不能乱set 方法(包括成员变量)的循环依赖如图所示可以在「a 创建」和「.原创 2022-02-08 15:09:39 · 773 阅读 · 0 评论 -
Spring中使用事务失效的场景
文章目录抛出检查异常导致事务不能正确回滚业务方法内自己 try-catch 异常导致事务不能正确回滚aop 切面顺序导致导致事务不能正确回滚非 public 方法导致的事务失效父子容器导致的事务失效调用本类方法导致传播行为失效@Transactional 没有保证原子行为@Transactional 方法导致的 synchronized 失效抛出检查异常导致事务不能正确回滚@Servicepublic class Service1 { @Autowired private Acco.原创 2022-02-07 23:30:00 · 413 阅读 · 0 评论 -
排序相关总结
文章目录冒泡排序算法描述算法实现进一步优化选择排序算法描述算法实现与冒泡排序比较冒泡排序算法描述依次比较数组中相邻两个元素大小,若 a[j] > a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后重复以上步骤,直到整个数组有序算法实现public static void bubble(int[] a) { for (int j = 0; j < a.length - 1; j++) { // 一轮冒泡 b.原创 2022-02-04 21:50:52 · 759 阅读 · 0 评论 -
二分查找总结
文章目录二分查找算法描述算法实现测试代码解决整数溢出问题其它总结二分查找算法描述前提:有已排序数组 A(假设已经做好)定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)获取中间索引 M = Floor((L+R) /2)中间索引的值 A[M] 与待搜索的值 T 进行比较① A[M] == T 表示找到,返回中间索引② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找③ A[M] .原创 2022-02-04 21:27:05 · 261 阅读 · 0 评论 -
java中HashMap总结
文章目录基本数据结构树化与退化索引计算put 与扩容并发问题key 的设计String 对象的 hashCode() 设计基本数据结构1.7 数组 + 链表1.8 数组 + (链表 | 红黑树)树化与退化树化意义红黑树用来避免 DoS 攻击,防止链表超长时性能下降,树化应当是偶然情况,是保底策略hash 表的查找,更新的时间复杂度是 O(1)O(1)O(1),而红黑树的查找,更新的时间复杂度是 O(log2n)O(log_2n )O(log2n),TreeNode 占用空间也比.原创 2022-02-03 21:32:26 · 830 阅读 · 0 评论