自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Pipeline 的事件传播机制

Pipeline 的事件传播机制前面章节中,我们已经知道 AbstractChannelHandlerContext 中有 inbound 和 outbound 两个 boolean 变量,分别用于标识 Context 所对应的 handler 的类型,即:1、inbound 为 true 是,表示其对应的 ChannelHandler 是 ChannelInboundHandler 的子类。2、outbound 为 true 时,表示对应的 ChannelHandler 是 ChannelOutbo

2021-02-22 18:37:17 380 1

原创 netty源码-EventLoopGroup

EventLoopGroup 与 Reactor 关联我们介绍了三种 Reactor 的线程模型, 那么它们和 NioEventLoopGroup 又有什么关系呢?其实,不同的设置NioEventLoopGroup 的方式就对应了不同的 Reactor 的线程模型。1.单线程模型,来看下面的应用代码:EventLoopGroup bossGroup = new NioEventLoopGroup(1); ServerBootstrap server = new ServerBootstr

2020-12-27 15:46:32 451

原创 netty源码-服务端初始化

NioServerSocketChannel的创建再看服务端代码,我们调用了 ServerBootstarap 的 channel(NioServerSocketChannel.class)方法,传的参数是 NioServerSocketChannel.class 对象。如此,按照客户端代码同样的流程,我们可以确定 NioServerSocketChannel 的 实例化也是通过 ReflectiveChannelFactory 工厂类来完成的,而 ReflectiveChannelFactory 中的

2020-12-17 19:14:11 551

原创 netty无锁化的串行设计理念

无锁化的串行设计理念在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来 严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息 的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。为了尽可能提升性能,Netty 采用了串行无锁化设计,在 IO 线程内部进行串行操作,避免多线程竞争导致的性能下降表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 N

2020-12-01 18:17:30 1780

原创 netty源码-客户端初始化

netty的客户端代码例子:public Test connect(int port, String host, final String nickName) { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioSock...

2020-12-01 18:15:31 424

原创 netty中的设计模式

设计模式在 Netty 中的应用单例模式源码举例单例模式要点回顾:1、一个类在任何情况下只有一个对象,并提供一个全局访问点。2、可延迟创建。3、避免线程安全问题案例分析@Sharable public final class MqttEncoder extends MessageToMessageEncoder<MqttMessage> { public static final MqttEncoder INSTANCE = new MqttEncode..

2020-11-26 10:35:48 580

原创 netty的内存池

内存池随着 JVM 虚拟机和 JIT 即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区 Buffer,情 况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty 提供了基于内存池的缓冲区重用机制。下面我们一起看下 Netty ByteBuf 的实现:Netty 提供了多种内存管理策略,通过在启动辅助类中配置相关参数,可以实现差异化的定制。下面通过性能测试,我们看下基于内存池循环利用的 ByteBuf 和普通 ByteBuf

2020-11-13 10:07:58 672 1

原创 netty的零拷贝

Netty 的“零拷贝”主要体现在如下三个方面:1) Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲 区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接 内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。2) Netty 提供了组合 Buffer 对象,可以聚合多个 B

2020-11-13 10:07:05 471

原创 netty的基本概念-阻塞与非阻塞,同步与异步

阻塞(Block)和非阻塞(Non-Block)阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。同步(Synchronization)和异步(Asynchronous)同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式。比如同步:是应用

2020-11-13 10:06:09 1210

原创 netty的基本概念-编码器和解码器

编、解码技术通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持 久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原 始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远程跨进程服务调用时(例如 RPC 调用),需要使用特定的编解码技术,对需要进行网络传输的对象做编码或者解码,以便完成远程调用。Netty 为什么要提供编解码框架?作为一个

2020-11-13 10:05:30 875

原创 netty的基本概念-TCP粘包和拆包

TCP 粘包/拆包TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP 作为传输层协议并不不了解上层业务数据的具 体含义,它会根据 TCP 缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。 同样, 在 Netty 的编码器中, 也会对半包和粘包问题做相应的处理。什么是半包, 顾名思义, 就是不完整的数据包, 因为 Betty 在轮询读事件的时候

2020-11-13 10:04:57 273

原创 netty的基本概念-NIO三件套

Java NIO 三件套在 NIO 中有几个核心对象需要掌握:缓冲区(Buffer)、选择器(Selector)、通道(Channel)缓冲区 Buffer1.Buffer 操作基本 AP在 NIO 中,所有的缓冲区类型都继承于抽象类 Buffer,最常用的就是 ByteBuffer,对于 Java 中的基本类型,基本都有一个具体 Buffer 类型与之相对应,它们之间的继承关系如下图所示:下面是一个简单的使用 IntBuffer 的例子:package com.gupaoed

2020-11-13 10:04:28 267

原创 netty的基本概念-BIO与NIO对比

BIO 与 NIO 对比下表总结了 Java BIO(Block IO)和 NIO(Non-Block IO)之间的主要差别异。面向流与面向缓冲Java NIO 和 BIO 之间第一个最大的区别是,BIO 是面向流的,NIO 是面向缓冲区的。 Java BIO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。 如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO 的缓冲导向方法略有不同。数据读取到

2020-11-13 10:02:59 592 1

原创 netty的基本概念-AIO详解

Java AIO 详解jdk1.7 (NIO2)才是实现真正的异步 AIO、把 IO 读写操作完全交给操作系统,学习了 linux epoll 模式,下面我们来做一些演示。AIO(Asynchronous IO)基本原理服务端:AsynchronousServerSocketChannel客服端:AsynchronousSocketChannel用户处理器:CompletionHandler 接口,这个接口实现应用程序向操作系统发起 IO 请求,当完成后处理具体逻辑,否则做自己该做的事情

2020-11-13 10:02:01 879

原创 netty的高效的Reactor线程模型

高效的 Reactor 线程模型常用的 Reactor 线程模型有三种,分别如下:1) Reactor 单线程模型;2) Reactor 多线程模型;3) 主从 Reactor 多线程模型Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下:1) 作为 NIO 服务端,接收客户端的 TCP 连接;2) 作为 NIO 客户端,向服务端发起 TCP 连接;3) 读取通信对端的请求或者应答消息;4) 向通信对端发送消息请求

2020-11-13 10:01:04 289

原创 netty的拆包粘包,在生产中是怎么处理的

概念TCP 是以流的方式来处理数据,所以会导致粘包 / 拆包。 拆包:一个完整的包可能会被 TCP 拆分成多个包进行发送。 粘包:也可能把小的封装成一个大的数据包发送。 原因 应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象。而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象。 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。 以太网帧的 payload(净荷)大于 MTU(.

2020-11-13 10:00:37 228

原创 netty的epoll和linux的epoll是如何实现的

1.linux的epollepoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。

2020-11-04 18:25:06 4079

原创 IM面试题

1.消息存储中,内容表和索引表如果需要分库处理,应该按什么字段来哈希? 索引表可以和内容表合并成一个表吗?答: 内容表应该按主键消息ID来哈希做分库分表处理,这样便于定位某一条具体的消息;索引表应该按索引的用户UID来哈希做分库分表处理,这样可以使得当前用户的所有联系人都落在一张表上,减少遍历所有表的麻烦。 索引表可以与内容表合成一张表,好处是显而易见的,能减少拉取历史消息时的数据库IO,不好的地方就是消息内容冗余存储,浪费了空间。2.能从索引表里获取到最近联系人所需要的信息,为什么还需要单独的联系

2020-05-09 12:28:56 2450

原创 面试常问缓存三大问题及解决方案

1.缓存来由随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。2.缓存问题虽然使用缓存给系统带来了一定的质的提升,但同时也带来了一些需要注意的问题。2.1 缓存穿透缓存穿透是指查询一个一定不存在的数据,因为缓存中也无该数据的信息,则会直接去数据库层进行查询,从系统层面来看像是穿透了缓存层直接达到db,从而称为缓存穿透,没有了缓存层的保护,这种查询一定不存在的数据对系统来说可能是一

2020-05-09 10:59:43 609

原创 IM系统四大基本特性

1.实时性:保证消息实时触达是互动场景的必备能力。对于一个实时消息系统,“实时”二字很好地表达了这个系统的基本要求。通过微信和你的好友聊天,结果等半天对方才收到,基本上也没有意愿聊了;直播场景下,如果主播的互动消息房间里的粉丝要等很长时间才能收到,也很难让粉丝们有积极参与的欲望。实时性分为:短轮询,长轮询,WebSocket(长链接)。2.可靠性:“不丢消息”和“消息不重复”是系统值得信赖...

2020-05-07 18:21:31 3768

原创 学习hadoop遇到的问题(当kafka集群中的topic的数据过大的时,清除时需要注意的问题)

1.在kafka集群中的topic存储旧数据总量过大时,要使用./kafka-topics.sh --zookeeper node1:2181 --delete --topic log4oa命令删除(特别注意:如果手动删除的话,要把涉及到kafka集群的topic的信息全部删除,例如storm整合kafka,zk中的topic的信息删除,否则会有问题)2.在删除kafka集群的topic时...

2019-09-29 15:20:55 2154

原创 27道spring面试题

1. 什么是Spring框架?Spring框架有哪些主要模块?Spring框架是一个为Java应用程序开发提供综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身也是按照设计模式精心打造,这使得我们可以在开发环境中安心地集成Spring框架,不必担心Spring是如何在后台工作的。 Spring大约18...

2019-09-07 18:29:36 1770

原创 spring5的系统架构

Spring 总共大约有 20 个模块,由 1300 多个不同的文件构成。而这些组件被分别整合在核心容器(Core Container)、AOP(Aspect Oriented Programming)和设备支持(Instrmentation)、数据访问 及集成(Data Access/Integeration)、Web、报文发送(Messaging)、Test,6 个模块集合中。以 下是 Spr...

2019-09-07 18:16:39 1874

原创 spring的设计初衷,BOP 编程伊始,依赖注入的基本概念,AOP 编程理念

Spring 的设计初衷Spring 是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑 Spring 的仅 仅是少许的基本理念,而所有的这些基本理念都能可以追溯到一个最根本的使命:简化开发。这是一个 郑重的承诺,其实许多框架都声称在某些方面做了简化。而 Spring 则立志于全方面的简化 Java 开发。 对此,她主要采取了 4 个关键策略: 1、基于 POJO 的轻量级和...

2019-09-07 18:11:12 1999

转载 面试官问你MySQL的优化,看这篇文章就够了

一、EXPLAIN做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式 key_len列,索引长度 ...

2019-08-15 19:04:11 2031

转载 面试官问我:说一下你对MySQL索引的理解?

MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,且听我一一道来。一、索引是什么?索引是帮助MySQL高效获取数据的数据结构。二、索引能干什么?索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。三、索引的分类?1、从存储结构上来划分:BTree索引(B-T...

2019-08-15 18:55:28 1699

转载 史上最难10道Java面试题!

这是我收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉得很难回答。1.为什么等待和通知是在 Object 类而不是 Thread 中声明的?一...

2019-08-15 18:45:13 760

转载 Kafka 参数调优实战

1、背景引入:很多同学看不懂kafka参数今天给大家聊一个很有意思的话题,大家知道很多公司都会基于Kafka作为MQ来开发一些复杂的大型系统。而在使用Kafka的客户端编写代码与服务器交互的时候,是需要对客户端设置很多的参数的。所以我就见过很多年轻的同学,可能刚刚加入团队,对Kafka这个技术其实并不是很了解。此时就会导致他们看团队里的一些资深同事写的一些代码,会看不懂是怎么回事,...

2019-08-15 18:36:39 344

转载 MySQL 数据库优化,看这篇就够了 | 不长不短,2000 字小结

前言 1. 优化一览图 2. 优化 2.1 软优化 2.2 硬优化 结语 前言数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷.1. 优化一览图2. 优化笔者将优化分为了两大类...

2019-08-15 18:30:51 364

转载 mysql优化方面的面试题

1.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。c. mysql库主从读写分离。d. 找规律分表,减少单表中的数据量提高查询速度。e。添加缓存机制,比如memcached,apc等。f. 不经常改动的页面,生成静态...

2019-08-15 18:25:48 57784 13

转载 mysql其它面试题

1.Mysql中有哪些不同的表格?共有5种类型的表格:MyISAM Heap Merge INNODB ISAM2.简述在MySQL数据库中MyISAM和InnoDB的区别MyISAM:不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作是对整个表加锁;存储表的总行数;一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;采用菲聚集...

2019-08-15 18:25:29 561

转载 mysql锁的面试题

1.Mysql中有哪几种锁?1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。2.锁的优化策略1. 读写分离2. 分段加锁3. 减少锁持有...

2019-08-15 18:25:05 13345

转载 mysql事务的面试题

1.Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?SQL标准定义的四个隔离级别为:read uncommited :读到未提交数据 read committed:脏读,不可重复读 repeatable read:可重读 serializable :串行事物2.MYSQL支持事务吗?在缺省模式下,MYSQL是autocommit模式的,所...

2019-08-15 18:24:45 8503

转载 mysql索引的面试题

1.可以使用多少列创建索引?任何标准表最多可以创建16个索引列。2.索引的底层实现原理和优化B+树,经过优化的B+树主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。3.什么情况下设置了索引但无法使用1.以“%”开头的LIKE语句,模糊匹配2. OR语句前后没有同时使用索引3. 数据类型出现隐式转...

2019-08-15 18:24:18 26952

转载 MySQL高频面试

索引相关关于MySQL的索引,曾经进行过一次总结,文章链接在这里Mysql索引原理及其优化.1. 什么是索引?索引是一种数据结构,可以帮助我们快速的进行数据的查找.2. 索引是个什么样的数据结构呢?索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引.3. Ha...

2019-08-15 18:22:32 357

原创 kafka的副本数据的同步原理

在《kafka的partition 的高可用副本机制》一文中介绍了parttion的高可用原理,副本机制中的几个概念和协同机制后,下面来说说副本数据的同步原理。数据的同步过程了解了副本的协同过程以后,还有一个最重要的机制,就是数据的同步过程。它需要解决 怎么传播消息 在向消息发送端返回 ack 之前需要保证多少个 Replica已经接收到这个消息 数据的处理过程是P...

2019-08-14 18:44:17 6784

原创 kafka的partition 的高可用副本机制

partition 的高可用副本机制我们已经知道Kafka的每个topic都可以分为多个Partition,并且多个 partition 会均匀分布在集群的各个节点下。虽然这种方式能够有效的对数据进行分片,但是对于每个partition 来说,都是单点的,当其中一个 partition 不可用的时候,那么这部分消息就没办法消费。所以 kafka 为了提高 partition 的可靠性而提供了副...

2019-08-14 18:37:26 1468 1

原创 kafka的消息存储策略

消息的保存路径消息发送端发送消息到 broker 上以后,消息是如何持久化的呢?那么接下来去分析下消息的存储,首先我们需要了解的是,kafka 是使用日志文件的方式来保存生产者和发送者的消息,每条消息都有一个 offset 值来表示它在分区中的偏移量。Kafka 中存储的一般都是海量的消息数据,为了避免日志文件过大,Log 并不是直接对应在一个磁盘上的日志文件,而是对应磁盘上的一个目录,这个目...

2019-08-14 18:32:00 2840

原创 kafka消息的存储原理

消息的文件存储机制前面我们知道了一个 topic 的多个 partition 在物理磁盘上的保存路径,那么我们再来分析日志的存储方式。通过如下命令找到对应 partition 下的日志内容[root@localhost ~]# ls /tmp/kafka-logs/firstTopic-1/00000000000000000000.index 00000000000000000000...

2019-08-14 18:29:51 1712 1

原创 kafka的消息分发策略和如何保存消费端的消费位置

关于消息分发kafka 消息分发策略消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由 key、value 两部分构成,在发送一条消息时,我们可以指定这个 key,那么 producer 会根据 key 和 partition 机制来判断当前这条消息应该发送并存储到哪个 partition 中。我们可以根据需要进行扩展 producer 的 partition 机制。...

2019-08-14 18:19:42 1918

空空如也

空空如也

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

TA关注的人

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