自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 netty心跳检测

为什么需要心跳在TCP长连接的过程中,若发生网络抖动等原因,导致连接中断。恰好服务器和客户端之间在这个 时间点没有数据交互。则不能在短时间内发现对方掉线。心跳检测的原理:在客服端和服务器之间没有数据交互处于idle状态时,客服端或者服务器向对方发送一种特殊的数据包 ,对方收到数据包之后也回一个特定的数据包。形成一个ping-pong交互。当某方掉线时,可以及时确认TCP的连接有效性实现心跳的两种方式1、使用TCP协议层面keeplive机制【注意区分Http的header中的keep-a

2020-07-27 19:13:56 541

原创 Netty处理半包粘包问题

无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。TCP粘包/拆包发生的根本原因【流式协议,消息无边界】粘包主要原因发送方每次写入数据 < 套接字缓冲区大小 接收方读取套接字缓冲区数据不够及时半包的主要原因:发送方写入数据 > 套接字缓冲区大小 发送的数据大于协议的 MTU(Maximum Transmission Unit,最大传输单元),必须拆包拆包、粘包示例假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次

2020-07-27 19:10:29 376

原创 IO模型-NIO选择器

为了将Channel和Selector配合使用,channel必须注册到selector上。通过SelectableChannel.register()方法来实现.Channel必须处于非阻塞模式下。这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以基于选择器,Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,避免了多线程之间的上下文切换导致的开销SelectionKey key =

2020-07-27 19:02:42 170

原创 IO模型-NIO管道

通道(Channel)所有的 IO 在NIO 中都从一个Channel开始,数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中channel必须注册到selectorChannel与流的区别:BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中的通道(Channel)是双向的,可以读操作,也可以写操作。 通道可以异步地读写。 通道中的数据总是要先读到一个Buffer,或者总是要从一个...

2020-07-27 18:52:17 143

原创 IO模型-NIO缓冲区

缓冲区(Buffer):缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存(底层是数组)。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。理解Buffer的工作原理,需要熟悉它的三个属性:capacity容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变.设定后只能往里写capacity个byte、long,char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。position表示

2020-07-27 18:48:53 114

原创 IO模型-NIO

传统BIO同步阻塞:阻塞节点1:等待客户端的连接阻塞节点2:客户端连接请求进来后,需要创建独立的线程处理,且当前线程暂时没有数据可读,则线程就阻塞在 Read 操作上NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据先总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道 。Selector 、 Channel 和 Buffer 的关系:一个Se

2020-07-27 18:45:13 112

原创 IO模型

Unix网络编程的五种IO模型:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。操作系统的IO模型是底层基石,Java有三种IO模型的基础:NIO、NIO、AIO就是对于IO的操作其实就是进一步的封装。Java的三种IO模型,BIO就是操作系统提供的阻塞IO模型,NIO是IO复用模型,而AIO是异步IO模型相关概念不管是网络IO还是磁盘IO,对于读操作而言,都是等到网络的某个数据分组到达后/数据准备好后,将数据拷贝到内核空间的缓冲区中,再从内核空间拷贝到用户空间的缓冲区。(

2020-07-27 18:34:57 145

原创 分布式事务-TCC补偿机制

TCC事务是Try、Commit、Cancel三种指令的缩写,其逻辑模式类似于XA两阶段提交,但是实现方式是在代码层面来人为实现。TCC开源框架ByteTCC,tcc-transaction,himly1、先来Try一下,不要把业务逻辑完成,先试试看,看各个服务能不能基本正常运转,能不能先冻结我需要的资源。如果Try都ok,也就是说,底层的数据库、redis、elasticsearch、M...

2020-05-07 17:39:45 957

原创 高并发三大利器:限流

缓存:将数据缓存起来,减少磁盘IO 降级:保护核心系统/服务,防止系统崩盘 限流:在某一时间段内限制访问流量,保护系统一、在哪些节点做访问限流网关、接口二、限流的方式【两窗两桶】1、固定时间窗口-计数器算法计数器算法是限流算法里最简单也是最容易实现的一种算法。计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个周期开始时,进行清零,重新...

2020-04-09 20:34:14 384

原创 接口幂等性的几种解决方案

例如在电商系统下单支付过程中,点击支付按钮由于网络等原因导致请求结果未及时返回,这时用户又重复点击,导致最后在用户同一订单支付两次。为了防止重试对数据状态的改变,需要将接口的设计为幂等的。保证幂等策略幂等需要通过唯一的业务单号来保证先检查,后操作。实现幂等很简单:先检查订单是否已经支付过,如果已经支付过,则返回支付成功;如果没有支付,进行支付流程但上述先检查后更新为非原子性...

2020-04-09 13:55:18 2402

原创 生产环境数据库迁移方案

迁移步骤:1、生产库DTS实时同步至中转库,全量同步完成之后在某一时间结点掐断DTS(线上老服务产生的数据依然入生产库不受影响)2、中转终态数据迁移至灰度库【这里需设置自增id值,以便区分老服务和新服务的数据】3、恢复生产库到中转库的DTS同步4、灰度环境发布验证并通过后5、停止生产环境老服务6、生产库到中转库的DTS数据全部同步完成7、将灰度库的老数据清除,老服务的数...

2020-04-09 13:33:36 1555

原创 线上CPU飙升,问题定位

1、定位到cpu最高PIDtop2、将线程PID转换为 16进制为后面查找 jstack 日志做准备#查看进程内最耗费CPU的线程top -Hp pid#该进程id是10进制的,需要转为16进制printf “%x” PID注意(1)可以直接查找jstack数据jstack PID | grep 54ee(2)也可以通过以下步骤导出日志文件3、导...

2019-12-13 14:07:38 228

原创 【kafka】消费者

consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。所以设计消费者时,offset是必须考虑的问题public static void consumerMsg() { Properties props = new Properties(); //连接Kafka集群 props.put(ConsumerCon...

2019-10-15 09:43:04 316

原创 【kafka】生产者

Kafka 的 Producer发送消息采用的是异步发送的方式。在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程,以及一个共享变量——RecordAccumulator。main 线程将消息发送给 RecordAccumulator, Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka broker。/** ...

2019-10-15 09:41:32 150

原创 【kafka】partition分区策略

方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic 又可以有多个 Partition 组成,因此整个集群就可以适应任意大小的数据了;可以提高并发,因为可以以 Partition 为单位读写了。我们需要将 producer 发送的数据封装成一个 ProducerRecord 对象。ProducerRecord(String topic, In...

2019-10-15 09:39:50 350

原创 【Kafka】相关命令

Topic1、创建 topicbin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --replication-factor 3 --partitions 1 --topic MyTopicName--topic 定义 topic 名--replication-factor 定义副本数--partitions 定义...

2019-10-14 09:24:43 107

原创 【kafka】架构

一个kafka集群由多个 broker 组成一个 broker可以容纳多个 topic(一个非常大的 topic 可以分布到多个 broker即服务器上)。Kafka 中消息是以 topic 进行分类的,topic是逻辑上的概念。一个 topic 可分为多个 partition(有序队列), partition 是物理上的概念。每个 partition 分为多个 segment。每个 ...

2019-10-14 09:24:32 145

原创 【kafka】监控工具

市面上主要有JMXTool、Burrow、Confluent Control Center、kafka-eagle、kafka manager等监控工具。Kafka Eagle1、下载并解压下载地址:http://download.kafka-eagle.org/2、配置环境变量:export KE_HOME=/usr/local/eagle export PATH=$PATH...

2019-10-14 09:24:05 339

原创 【kafka】安装

kafka依赖zookeeper,所以需要先启动zookeeper1、下载,并解压 下载地址:http://kafka.apache.org/downloads.htmltar -zxvf kafka_2.11-0.11.0.0.tgz -C /usr/local/kafka创建日志和数据存放目录:mkdir data2、修改配置文件进入config目录下的 编辑server....

2019-10-14 09:20:26 187

原创 【RoceketMQ】发布订阅

广播生产者public class BroadcastingProducer { //nameserver地址 private static String namesrvaddress="127.0.0.1:9876;"; public static void main(String[] args) throws UnsupportedEncodingExcep...

2019-10-08 17:29:23 122

原创 【RoceketMQ】事务消息

事务消息可以解决分布式事务实现数据最终一致。二阶段提交协议。public class TransactionListenerImpl implements TransactionListener { //存储当前线程对应的事务状态 private ConcurrentHashMap<String, Integer> localTrans = new Conc...

2019-10-08 17:29:11 320

原创 【RoceketMQ】顺序消息

RoceketMQ消息默认会随机发送到4个队列中,RoceketMQ只能保持各自队列的消息的有序性,所以无法保证全局消息的有序性要全局顺序只能一个队列。有序消息的生产者:public class OrderProducer { //nameserver地址 private static String namesrvaddress="127.0.0.1:9876;";...

2019-10-08 17:29:01 249

原创 【RoceketMQ】普通消息

RocketMQ有2种常见的消费模式,分别是DefaultMQPushConsumer和DefaultMQPullConsumer模式。两种模式其本质都是拉取消息,只是实现机制不一样。DefaultMQPushConsumer(推荐使用):consumer向broker发出请求,保持了一种长链接,broker会每5秒会检测一次是否有消息,如果有消息,则将消息推送给consumer。broker...

2019-10-08 17:28:32 170

原创 【RocketMQ】架构

注册中心:NameServer,保存Producer、Consumer、broker的master、slaver信息,和topic、queue信息。与broker的连接用netty的TCP连接。​ Broker:消息的存储、中转中心。​ Consumer:消息的消费者。​ Producer:消息的生产者1、启动注册中心,等待Broker、Produer、Consumer的注册...

2019-10-08 17:28:21 65

原创 【RocketMQ】安装

http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/安装环境要求:64bit OS, Linux/Unix/Mac is recommended;64bit JDK 1.8+;Maven 3.2.x;Git;4g+ free disk for Broker server(4g+的内存)下载地址:...

2019-10-08 17:28:02 133

原创 【Nginx】原理

nginx启动后,在后台其实启动了一个master进程和多个worker进程master只做任务分配给worker worker是负责处理nginx部分的请求。原理:客户端发送请求到nginx的master,master将任务分配给地下的各个worker,分配方式为各个worker争抢模式,某worker争取到任务后,走代理等到对应的tomcat请求数据逼格返回。master-wo...

2019-09-26 22:04:18 97

原创 【Nginx】负载均衡算法

1、轮询(默认) 每个请求按顺序逐一分配到不同的服务器,如果某台服务器宕机,自动剔除故障系统,整个服务保证可用2、weight(轮询加权) weight的值越大分配到的访问概率越高 upstream bakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight...

2019-09-26 22:02:34 59

原创 【Nginx】使用

1、Nginx 介绍:Nginx 是高性能的HTTP和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。正向代理:客户端通过配置代理服务器,由代理服务器去请求目标服务器。如:客户端要访问google,先用代理服务器xxx.com,通过xxx.com访问google.反向代理:所谓反向代理正好与正向代理相反,代...

2019-09-26 21:57:49 93

原创 Java异常

1、异常体系2、常见异常:java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。 java.lang.InstantiationError:实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常. java.lang.Ou...

2019-09-26 21:38:10 142

原创 Redis(十二):Redis过期策略的实现原理

redis提供了为key设置过期时间,redis定时删除过期key。定时删除:实现:在设置键的过期时间的时候创建一个定时器,当过期时间到的时候立马执行删除操作。优点:可以做到及时删除缺点:会创建大量的定时器,严重影响性能惰性删除:实现原理:Redis收到获取key的指令,首先判断是否过期、若过期则执行删除操作、返回null优点:只有在获取单个key时候,做过期判断,删除...

2019-09-22 14:25:00 331

原创 JVM:类加载器

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。如果两个类来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类就必定不相等。启动类加载器(Bootstrap ClassLoader)使用C++语言实现,是虚拟机自身的一部分;这个类加载器负责将存放在\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟...

2019-09-15 10:54:36 84

原创 JVM:类装载机制

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化。最终形成可以被虚拟机最直接使用的java类型的过程就是虚拟机的类加载机制。JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。在五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为...

2019-09-15 10:54:24 262 1

原创 JVM:虚拟机性能监控工具

jps 查看进程状况-q:仅输出VM标识符,不包括classname,jar name,arguments in main method-m:输出main method的参数-l:输出完全的包名,应用主类名,jar的完全路径名-v:输出jvm参数 -V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 -Joption:传递参数到...

2019-09-15 10:54:07 110

原创 JVM:垃圾回收器

前面了解过,通过可达性算法可以分析出谁需要被收回、回收算法知道如何去回收,接下来就是使用不同垃圾回收器去回收JDK7之后的HotSpot虚拟机包含垃圾回收器有:用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。Serial收集器...

2019-09-15 10:53:57 125

原创 JVM:回收算法

二、如何回收(回收算法)判断了对象存活的状态,就需要通过gc回收算法,将垃圾回收2.1、标记-清除算法该算法先标记,后清除,将所有需要回收的对象进行标记,然后清除;这种算法的缺点是:效率比较低(标记和清除的效率都不高);标记清除后会出现大量不连续的内存空间碎片,这些碎片太多将来到需要分配较大对象时,无法找到连续的内存,而不得再次触发GC,造成内存浪费以及时间的消耗。2.2、复制算法...

2019-09-15 10:53:47 80

原创 JVM:判断对象存活算法

JVM线程私有部分(程序计数器,虚拟机栈,方法栈)随着线程而生,随线程而灭,内存分配和回收都具有确定性,而堆、方法区(jdk8为元数据区),内存分配和回收都是动态的。 GC做的三件事哪些内存需要回收(判断对象存活) 如何回收(回收算法) 谁去回收一、判断对象存活引用计数算法引用计数算法很简单,类似重入锁原理。与对象它实际上是通过在对象头中分配一个空间来保存该对象被引用的次数。如果...

2019-09-15 10:53:39 164

原创 JVM:内存模型

JDK7的jvm数据区内存结构图:1、程序计数器程序计数作用:记录当前线程所运行的代码指令地址(记录线程执行到那个地方,线程切换回来的时候以便继续执行),字节码解释器工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳准、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成,程序计数器保证了程序的正常执行注意:当线程执行的是本地方法的时候,程...

2019-09-15 10:53:27 80

原创 JVM:Java内存模型

JMM(java memory model)java内存模型主要目标是定义程序中的共享变量,(此处所指的变量是实例字段、静态字段等,不包含局部变量和函数参数,因为这两种是线程私有无法共享)在虚拟机中存储到内存与从内存读取出来的规则细节java被分为工作内存和主内存,工作内存中保存了该线程使用到的变量的主内存副本拷贝,并规定线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读...

2019-09-15 10:53:11 69

原创 JVM:介绍

JVM系列知识大都来自于国内学习JVM最好的书籍【深入理解Java虚拟机】没有之一。经过自己理解和总结汇成该系列。学习JVM书是必看的、还需要结合大牛的文章,自己画图理解,学习总结等途径。1、什么是JVM?Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是运行相同的字节码,它们在不同平台都会给出相同...

2019-09-15 10:52:47 75

原创 【MySQL】锁

1、锁的相关查看查看事务select * from INFORMATION_SCHEMA.INNODB_TRX;TRX_ID 事务IdTRX_WEIGHT 事务的权重,反映(但不一定是确切的计数)更改的行数和事务锁定的行数。要解决死锁,请 InnoDB选择权重最小的事务作为回滚的“ 受害者 ”。无论更改和锁定行的数量如何,已更改非事务表的事务都被认为比其他事务更重。...

2019-09-12 11:46:50 127

空空如也

空空如也

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

TA关注的人

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