随笔分类 - java
java基础知识
jvm
摘要:[TOC] 生成Java core dump 可以按照下面这个文章的指引来通过jni调用触发Java core dump "Generating a Java Core Dump" 基本思路是通过Java调用本地C代码,然后在C代码中触发一个错误,从而引发jvm crash。 需要注意两个问题 1.
阅读全文
摘要:目录 处理写请求总体过程 客户端发起写请求 follower和leader交互过程 follower发送请求给客户端 处理写请求总体过程 zk为了保证分布式数据一致性,使用ZAB协议,在客户端发起一次写请求的时候时候,假设该请求请求到的是follower,follower不会直接处理这个请求,而是转
阅读全文
摘要:目录 session建立的主要过程 客户端发起连接 服务端创建session session建立的主要过程 用一张图来说明session建立过程中client和server的交互 主要流程 服务端启动,客户端启动 客户端发起socket连接 服务端accept socket连接,socket连接建立
阅读全文
摘要:dubbo序列化 dubbo作为一个rpc框架支持丰富的序列化方式,本文简单介绍dubbo的序列化。本文结构: 对象序列化是什么意思? dubbo序列化 几个问题 对象序列化是什意思? 先来思考两个问题: 1. 普通的Java对象的生命周期是仅限于一个JVM中的,只要JVM停止,这个对象也就不存在了
阅读全文
摘要:zookeeper集群启动的时候,首先读取配置,接着开始选举,选举完成以后,每个server根据选举的结果设置自己的角色,角色设置完成后leader需要和所有的follower同步。上面一篇介绍了leader选举过程,这篇接着介绍启动过程中的leader和follower同步过程。 本文结构如下:
阅读全文
摘要:上一篇介绍了zookeeper的单机启动,集群模式下启动和单机启动有相似的地方,但是也有各自的特点。集群模式的配置方式和单机模式也是不一样的,这一篇主要包含以下内容: 概念介绍:角色,服务器状态 服务器组件启动 leader选举 概念介绍:角色,服务器状态 集群模式会有多台server,每台serv
阅读全文
摘要:`说明:zookeeper系列是基于3.6.0版本的` zookeeper一般使用命令工具启动,启动主要就是初始化所有组件,让server可以接收并处理来自client的请求。本文主要结构: main入口 配置解析 组件启动 main入口 我们一般使用命令行工具来部署zk server,zkServ
阅读全文
摘要:spring提供了可配置、易扩展的事务处理框架,本文主要从一下几个方面说明spring事务的原理 基本概念 事务配置解析 事务处理过程 基本概念 事务隔离级别 在同时进行多个事务的时候,可能会出现脏读、不可重复读、幻读四种情况,数据库分别有四种隔离级别处理这些情况。Spring中Transactio
阅读全文
摘要:spring mvc是怎么实现的?为什么我们只需要在方法上写一个注解,就可以通过http访问这个接口?下面我们分3部分来解答这两个问题 spring mvc整体流程 HandlerMapping HandlerAdapter spring mvc整体流程 我们通过看一下spring处理一个http请
阅读全文
摘要:Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置。所以要理解Netty内存的释放我们得先看下直接内存的释放。 Java直接内存释放 我们先来看下直接内存是怎么使用的 申请的过程是其实就是创建一个DirectByteBuffer对象的过程,DirectByteBu
阅读全文
摘要:tiny内存分配 tiny内存分配流程: 1. 如果申请的是tiny类型,会先从tiny缓存中尝试分配,如果缓存分配成功则返回 1. 否则从tinySubpagePools中尝试分配 2. 如果上面没有分配成功则使用allocateNormal进行分配 从缓存中分配 这里以启用了缓存为例来说明,使用
阅读全文
摘要:Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想—— "jemalloc" 。Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果已申请的没有的话,再真正申请内存 分段管理,每个内存大小范围使用不同的分配策略 我们先总体上
阅读全文
摘要:前面经过channel初始化、注册,所需要的数据结构(epoll_event)基本上准备好了,serverSocket也处于监听状态,可以接收来自客户端的请求了。NioServerSocketChannel注册在了NioEventLoop selector,在注册过程中启动了NioEventLoop
阅读全文
摘要:NioEventLoop功能 前面channel已经准备好了,可以接收来自客户端的请求了,NioEventLoop作为一个线程池,只有一个线程,但是有一个queue存储了待执行的task,由于只有一个线程,所以run方法是死循环,除非线程池shutdown。 这个run方法的主要作用: 1. 执行s
阅读全文
摘要:我们在使用Netty的时候的初始化代码一般如下 前面已经说过线程池的启动过程,接下来就是通过builder模式构造启动参数,接下来看看bind的过程。channel的注册和ip:port的绑定都是在bind方法中进行的,bind方法的主要逻辑是 1. 初始化channel 2. channel注册到
阅读全文
摘要:`说明:netty源码系列是基于4.1.25版本的netty源码的` Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网
阅读全文
摘要:分布式事务是一个复杂的问题,rmq实现了事务的最终一致性,rmq保证本地事务成功消息一定会发送成功并被成功消费,如果本地事务失败了,消息不会被发送。 rmq事务消息的实现过程为: 1. producer发送half消息 2. broker确认half消息,并通知producer,表示消息已经成功发送
阅读全文
摘要:RocketMQ本身支持顺序消息,在使用上发送顺序消息和非顺序消息有所区别 发送顺序消息 send方法带有参数MessageQueueSelector,MessageQueueSelector是让用户自己决定消息发送到哪一个队列,如果是局部消息的话,用来决定消息与队列的对应关系。 顺序消息消费 从使
阅读全文
摘要:"上一节" 消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费。阿里云的ons还支持定时消息,而且延时消息是直接指定延时时间,其实阿里云的延时消息也是定时消息的另一种表述方式,
阅读全文
摘要:RocketMQ的消息重试包含了producer发送消息的重试和consumer消息消费的重试。 producer发送消息重试 producer在发送消息的时候如果发送失败了,RocketMQ会自动重试。 上面这个方法区分出不同的消费结果: org.apache.rocketmq.client.co
阅读全文