- 博客(21)
- 收藏
- 关注
原创 RabbitMQ入门-AMQP协议
RabbitMQ和AMQP AMQP生产者流转过程 AMQP消费者流转过程 RabbitMQ和AMQP RabbitMQ遵从AMQP协议,AMQP的模型架构和RabbitMQ的模型架构是一样的,...
2020-03-11 11:14:46 392
原创 RabbitMQ入门-相关概念介绍
生产者和消费者 队列 交换器、路由键、绑定 RabbitMQ运转流程 连接和信道 生产者和消费者 生产者:Producer...
2020-03-10 14:59:17 285
原创 Netty-流量整形注意事项
上一篇:流量整形工作机制 1. 并发编程在流量整形中的使用 1.1 volatile的使用 1.2 减小锁的范围 1.3 原子类 &n...
2020-03-06 10:17:27 728
原创 Netty-流量整形工作机制
流量整形工作原理及源码分析 消息读取的流量整形 消息发送流量整形流量整形工作原理及源码分析 流量整形工作原理:拦截channelRead()和write()...
2020-03-05 10:25:27 1224
原创 Netty-流量整形实践
当系统负载压力比较大时,系统进入过负荷状态,可能是CPU、内存资源已经过载,也可能是应用进程内部的资源几乎耗尽,如果继续全量处理业务,可能会导致长时间的Full GC、消息严重积压或者应用进程宕机,最终将压力转移到集群中的其他节点,引起级联故障。通过动态流控,拒绝一定比例新接入的请求消息,可以保障系统不被压垮除了动态流控,有时候还需要对消息的读取和发送速度做控制,以便消息能以比较恒定的速度发送...
2020-03-03 11:00:31 1824 3
原创 Netty-NioEventLoop线程工作机制
I/O读写操作原理 异步任务执行原理 定时任务执行原理I/O读写操作原理 NioEventLoop作为Reactor线程,负责TCP连接的创建和接入,以及TCP消息的读写,Reactor线程职责如下:作为NIO服务端,接受客...
2020-02-28 15:19:29 2053
原创 Netty-服务端接收不到客户端发送消息案例
得益于高性能、低时延的优势,Netty被广泛应用于物联网领域,用于海量终端设备的协议接入、消息收发和数据处理。当服务端出现性能瓶颈或者阻塞时,就会导致终端设备连接超时和掉线,引发各种问题,因此在物联网场景下,一定要防止服务端代码因为编码不当导致的意外阻塞,进而无法处理终端请求消息。 服务端接收不到客户端发送消息案例 堆...
2020-02-27 16:46:43 8461
原创 JAVA-文件操作工具类
文件操作工具类/******************************************** * 文件操作工具类 * * @author p.ww *********************************************/import java.io.*;import java.util.concurrent.ExecutorService;im...
2020-02-25 17:32:50 254
原创 Netty-DefaultEventExecutor工作机制
DefaultEventExecutor源码 业务线程池优化策略 Netty线程绑定机制原理DefaultEventExecutor源码 DefaultEventExecutor是JDK线程池ExecutorService的一种...
2020-02-21 16:16:04 1722 1
原创 Netty-并发失效案例之DefaultEventExecutorGroup特性
为了提升性能,如果用户实现的ChannelHandler包含复杂或者可能导致同步阻塞的业务逻辑,往往需要通过线程池来提升并发能力,线程池添加有两种策略:用户自定义线程池执行业务ChannelHandler,以及通过Netty的EventExecutorGroup机制来并行执行ChannelHandler。 案例重现 无法...
2020-02-20 16:39:36 5354 2
原创 Netty-channelReadComplete方法多次触发问题
针对Channel上发生的各种网络操作,例如链路创建、链路关闭、消息读写等,Netty将这些消息封装成事件,触发ChannelPipeline调用ChannelHandler链,由系统或者用户实现的ChannelHandler对网络事件做处理。由于网络事件种类比较多,触发和执行机制也存在一些差异,如果掌握不到位很有可能发生一些莫名其妙的问题。channelReadComplete被多次调...
2020-02-17 15:46:17 9673
原创 线程池的三种阻塞队列
三种阻塞队列: SynchronousQueue ArrayBlockingQueue LinkedBlockingQueueSynchronousQueue 无缓冲无界等待队列,超出核心线程个数的任务时,创建新的线程执行任务...
2020-01-28 00:39:47 2440
原创 线程池的4种拒绝策略
四种拒绝策略: AbortPolicy CallerRunsPolicy DiscardPolicy DiscardOldestPolicyAbortPolicy 默认拒绝策略,丢弃任务并触发...
2020-01-20 16:50:21 535
原创 Netty-ChannelHandler并发安全分析
ChannelHandler是Netty中使用最广的接口,Netty提供了大量内置的ChannelHandler实现类,包括编解码、SSL、日志打印等等。用户通过实现ChannelHandler接口,来接口和发送业务消息,并进行业务逻辑处理。 Netty ChannelHandler并发安全问题 ...
2020-01-15 16:09:08 2468
原创 Netty-发送队列积压导致内存泄漏
导致Netty内存泄漏的原因很多,如使用内存池方式创建的对象忘记释放,或者系统处理压力过大导致发送队列积压,尽管Netty采用NIO非阻塞通信,I/O处理往往不会成为业务瓶颈,但如果客户端并发压力过大,超过了服务端处理能力,又没有流控保护,则容易发生内存泄漏 高并发故障场景 内存泄漏原因分析 &n...
2020-01-14 09:52:21 2864
原创 Netty-消息发送工作机制
业务调用write后,经过ChannelPipeline职责链处理,消息被投递到消息发送缓冲区待发送,调用flush之后会执行真正的发送操作,底层通过调用Java NIO的SocketChannel进行非阻塞write操作,将消息发送到网络上。 WriteAndFlushTask原理和源码分析 ChannelOutbou...
2020-01-13 09:26:48 1647
原创 Netty-什么是串行无锁化?
为尽可能提升性能,Netty中有提到一个串行无锁化概念。什么是串行无锁化? NioEventLoop维护了一个任务队列,队列在创建NioEventLoop时被初始化,是用来实现串行无锁化的载体。//SingleThreadEventExecutor类this.taskQueue = this.newTaskQueue(this...
2020-01-10 11:40:51 2635
原创 Netty-ByteBuf使用注意事项
根据一个具体案例来分析ByteBuf申请和释放时的线程并发安全问题和非法引用问题 HTTP响应Body获取时异常 ByteBuf非法引用问题HTTP响应Body获取时异常 HTTP客户端示例代码,采用同步HTTP调用方式:public class Http...
2020-01-08 18:04:10 1174 2
原创 Netty-ByteBuf实现机制
应用在进行数据传输时,往往需要使用缓冲区,最常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer。由于JDK原生的Buffer存在一些缺点,Netty提供了自己的ByteBuffer实现(ByteBuf类); ByteBuf种类繁多,支...
2020-01-08 14:06:14 305
原创 Netty-内存池原理分析
作为高性能的NIO通信框架,性能优势是Netty的核心竞争力之一,自Netty4.x引入内存池机制后,Netty默认采用内存池模式创建ByteBuf对象,性能得到很大提升,GC压力也得到很大缓解。内存池原理分析 主要数据结构 Netty内存池内存的几种类型 &...
2020-01-06 20:42:19 869 1
原创 Netty-响应消息的释放
- 堆内存(PooledHeapByteBuf)会将HeapByteBuffer转换成DirectByteBuffer,并释放PooledHeapByteBuf到内存池。 //AbstractNioChannel protected final ByteBuf newDirectBuffer(ByteBuf buf){ final int readableBytes = buf.read...
2020-01-05 20:20:06 921
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人