Netty线程模型-编程思维

Netty 的实现虽然参考了 Reactor 模式,但是并没有完全照搬,Netty 中最核心的概念是事件循环(EventLoop),其实也就是 Reactor 模式中的 Reactor,负责监听网络事件并调用事件处理器进行处理。在 4.x 版本的 Netty 中,网络连接和 EventLoop 是稳定的多对 1 关系,而 EventLoop 和 Java 线程是 1 对 1 关系,这里的稳定指的是关系一旦确定就不再发生变化。也就是说一个网络连接只会对应唯一的一个 EventLoop,而一个 EventLoop 也只会对应到一个 Java 线程,所以一个网络连接只会对应到一个 Java 线程。一个网络连接对应到一个 Java 线程上,有什么好处呢?最大的好处就是对于一个网络连接的事件处理是单线程的,这样就避免了各种并发问题。Netty 中的线程模型可以参考下图,这个图和前面我们提到的理想的线程模型图非常相似,核心目标都是用一个线程处理多个网络连接。

Netty 中还有一个核心概念是 EventLoopGroup,顾名思义,一个 EventLoopGroup 由一组 EventLoop 组成。实际使用中,一般都会创建两个 EventLoopGroup,一个称为 bossGroup,一个称为 workerGroup。为什么会有两个 EventLoopGroup 呢?这个和 socket 处理网络请求的机制有关,socket 处理 TCP 网络连接请求,是在一个独立的 socket 中,每当有一个 TCP 连接成功建立,都会创建一个新的 socket,之后对 TCP 连接的读写都是由新创建处理的 socket 完成的。也就是说处理 TCP 连接请求和读写请求是通过两个不同的 socket 完成的。上面我们在讨论网络请求的时候,为了简化模型,只是讨论了读写请求,而没有讨论连接请求。在 Netty 中,bossGroup 就用来处理连接请求的,而 workerGroup 是用来处理读写请求的。bossGroup 处理完连接请求后,会将这个连接提交给 workerGroup 来处理, workerGroup 里面有多个 EventLoop,那新的连接会交给哪个 EventLoop 来处理呢?这就需要一个负载均衡算法,Netty 中目前使用的是轮询算法。

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/ukzq/p/15962652.html

JDK8到JDK17各个版本的重要特性整理-编程思维

JDK8新特性(2014年初)(LTS版本) 1、Lambda表达式 2、函数式编程 3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法 4、方法引用 5、重复注解,同一个注解可以使用多次 6、引入Optional来避免空指针 7、引入Streams相关的API 8、引入新的Date/Time相关的A

keystore和truststore-编程思维

首先需要理解什么是keystore,keystore是存储密钥(公钥、私钥)的容器。 keystore和truststore其本质都是keystore。只不过二者盛放的密钥所有者不同而已,对于keystore一般存储自己的私钥和公钥,而truststore则用来存储自己信任的对象的公钥。举例说明: 1.单向认证: 由

【Java分享客栈】我有一个朋友,和前端工程师联调接口被狠狠鄙视了一番。-编程思维

前言 我有一个朋友,昨天和前端工程师联调一个接口,然后被狠狠鄙视了一番。 大家知道,自从前后端分离以后,像我一样一直以Java工程师为傲而自居的码圣们就砍掉了一半脊梁,从此被贴上了“Java服务端工程师”、“Java后端工程师”等等这样的标签。 同时,前端爸比越来越多,也让我们写个接口都如履薄冰。 那么到底发生了审麽

分库分表-编程思维

读写分离分散了数据库读写操作的压力,但没有分散存储压力, 当数据量达到千万甚至上亿条的时候,单台数据库服务器的存储能力会成为系统的瓶颈,主要体现在这几个方面: 1.数据量太大,读写的性能会下降,即使有索引,索引也会变得很大,性能同样会下降。 2.数据文件会变得很大,数据库备份和恢复需要耗费很长时间。 3.数据文件越大,

Java刷题时常用的标准库数据结构和相应操作-编程思维

目录一、线性表(广义的数组)1. 数组一维数组的定义和初始化二维数组的定义和初始化Arrays工具类的一些常用方法2. List接口容器对象的构建读写和插入删除数据排序反转数组List转为数组二、字符串三、Map和Set1. Map2. Set四、栈Stack和队列Queue1. 栈Stack2. 队列Queue五、优