当前位置: 首页 > news >正文

常见面试题-Netty线程模型以及TCP粘包拆包

介绍一下 Netty 使用的线程模型?

答:

Netty 主要基于主从 Reactor 多线程模型,其中主从 Reactor 多线程模型将 Reactor 分为两部分:

  • mainReactor:监听 Server Socket,用来处理网络 IO 连接建立操作,将建立的 SocketChannel 指定注册给 subReactor
  • subReactor:和建立起来的 socket 做数据交互和业务处理操作

因为客户端的连接数量相对来说比较少,而数据的读和写会比较多一点,使用 mainReactor 只接受客户端连接,由其他线程 subReactor 负责读和写,将业务处理剥离出,让线程池来处理,降低了 Reactor 的性能开销

扩展:单 Reactor 单线程模型、单 Reactor 多线程模型

  • 单 Reactor 单线程模型

    通过 1 个线程负责客户端连接、网络数据的读写、业务处理

    缓存 Redis 就是单 Reactor 单线程模型

  • 单 Reactor 多线程模型

    通过 1 个线程负责客户端的连接、网络数据的读写,将业务处理剥离出去,通过线程池来进行处理

三种 Reactor 模型的优缺点:

  • 单 Reactor 单线程模型是单线程进行业务处理,当负载过重时,处理速度将会变慢,影响系统性能,因此引出单 Reactor 多线程模型
  • 单 Reactor 多线程模型时多个线程处理业务,业务处理速度上来了,但是单 Reactor 承担了所有时间的监听和响应,可能存在性能问题。当有数百万客户端进行连接或者服务端需要对客户端握手进行安全认证,认证本身非常消耗性能,因此出现了主从 Reactor 多线程模型
  • 主从 Reactor 多线程模型中 1 个主 Reactor 只用来处理网络 IO 的连接建立操作,而对于接入认证、IP 黑白名单过滤、握手等操作由从 Reactor 进行处理,这样进一步提升性能,在主从 Reactor 多线程模型中,从 Reactor 有多个,可以与 CPU 个数相同

TCP 粘包、拆包是什么?如何解决?

答:

TCP本身的机制决定了一定会有粘包、拆包,因为 TCP 传输协议时基于数据流传输的,而流化的数据没有界限,因此 TCP 作为传输层协议并不了解上层业务数据的具体含义,会根据 TCP 缓冲区的实际情况进行数据包的划分,所以业务上认为的一个完整的包,可能被 TCP 拆成多个包或者把多个小的包封装成一个大的包进行发送。

产生原因:

  • 粘包:客户端发送的包的大小比socket的缓存小或者接收方读取socket缓存不及时,因此多个包一起发送了
  • 拆包:客户端发送的包的大小比socket的缓存大或者发送的数据大于协议的MTU(最大传输单元)必须拆包,那么这个包就被拆分成了多个包进行发送

解决方法:

有三种方式:

  • 通过指定分隔符来进行分割
  • 通过指定固定长度来进行分割
  • 上边两种方式灵活性不好,因此常用的是通过指定接收数据的长度来解决,也就是LengthFieldBasedFrameDecoder()这个类

相关文章:

常见面试题-Netty线程模型以及TCP粘包拆包

介绍一下 Netty 使用的线程模型? 答: Netty 主要基于主从 Reactor 多线程模型,其中主从 Reactor 多线程模型将 Reactor 分为两部分: mainReactor:监听 Server Socket,用来处理网络 IO 连接建立操作&…...

03.webpack中hash,chunkhash和contenthash 的区别

hash、contenthash 和 chunkhash 是通过散列函数处理之后,生成的一串字符,可用于区分文件。 作用:善用文件的哈希值,解决浏览器缓存导致的资源未及时更新的问题 1.文件名不带哈希值 const path require(path) const HtmlWebpac…...

OpenAI前CEO萨姆·阿尔特曼可能重返CEO职位;用LoRA微调LLM的实用技巧

🦉 AI新闻 🚀 OpenAI前CEO萨姆阿尔特曼可能重返CEO职位 摘要:据报道,OpenAI前CEO萨姆阿尔特曼有望重新担任CEO职位,并对公司董事会进行重大改变。微软等投资人正努力恢复阿尔特曼的职位,尽管董事会仍然是…...

修改docker默认数据目录

前言: docker默认数据目录是/var/lib/docker,根目录的存储空间有限,我们往往不能使用默认配置,需要创建空间相对较大的数据data目录 停止docker服务 systemctl stop docker 编辑配置文件 vi /etc/docker/daemon.json 增加选项 “graph”…...

wpf devexpress post 更改数据库

这个教程示范如何使用GridControl编辑数据,和保存更改到数据库。这个教程基于前一个篇。 Items Source Wizard 当 CRUD (Create, Read, Update, Delete) 启动选项时添加Post data功能 Items Source Wizard 生成如下代码: 1、设置 TableView.ShowUpdat…...

Ubuntu 18.04/20.04 LTS 操作系统设置静态DNS

1、nano /etc/systemd/resolved.conf 2、修改配置 使用DNS服务器:223.5.5.5 223.6.6.6 [Resolve] DNS223.5.5.5 223.6.6.6 3、重启服务 systemctl restart systemd-resolved.service 4、查看解析文件 cat /run/systemd/resolve/resolv.conf # This file is man…...

VSCode使用MinGW中的go并支持CGO

在Windows中,如果想使用Linux下的一些命令或者开发工具,可以安装Cygwin或者MinGW,MinGW相比Cygwin要轻量得多,笔者就安装的MinGW,但是安装MinGW后,如果把它加到Windows系统的PATH环境变量中,则可…...

tensor张量 ------ python特殊的数据结构

点赞收藏关注! 如需转载请注明出处! 张量与数组和矩阵非常相似。 在PyTorch中,使用张量来编码模型的输入和输出,以及模型的参数。 张量可以在GPU或其他硬件加速器上运行。 张量和NumPy数组通常可以共享相同的底层内存&#xff0c…...

openai/chatgpt的api接口,各个模型的最大输入token一览表

chatgpt的各个3.5api模型接口的最大输入量一览表: MODELDESCRIPTIONCONTEXT WINDOWTRAINING DATAgpt-3.5-turbo-1106Updated GPT 3.5 Turbo New The latest GPT-3.5 Turbo model with improved instruction following, JSON mode, reproducible outputs, parallel…...

Spark作业串行与并行提交job

在Scala中&#xff0c;您可以以串行和并行的方式提交Spark作业。看看如何使用for和par.foreach构造对应的例子。 串行Spark作业&#xff08;使用for&#xff09; // 串行Spark作业设置 for (tag <- tags) {spark.sparkContext.setJobGroup(tag.toString, s"Tag: $tag…...

HTTP HTTPS 独特的魅力

目录 HTTP协议 HTTP协议的工作过程 首行 请求头&#xff08;header&#xff09; HOST Content-Length​编辑 User-Agent&#xff08;简称UA&#xff09; Referer Cookie 空行 正文&#xff08;body&#xff09; HTTP响应详解 状态码 报文格式 HTTP响应格式 如何…...

【nlp】2.5(gpu version)人名分类器实战项目(对比RNN、LSTM、GRU模型)工程管理方式

人名分类器实战项目 0 说明1 工程项目设计2 数据预处理data_processing3 创建模型model4 模型测试test5 训练配置config6 模型训练train7 模型对比绘图plotfigure8 模型预测predict9 代码测试demo0 说明 本项目对前一个博客内容2.5(cpu version) 人名分类器实战项目(对比RNN、…...

金蝶云星空对接打通旺店通·旗舰奇门采购退料单查询接口与创建货品档案接口

金蝶云星空对接打通旺店通旗舰奇门采购退料单查询接口与创建货品档案接口 来源系统:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用…...

在线识别二维码工具

具体请前往&#xff1a;在线二维码识别解码工具--在线识别并解码二维码网址等内容...

CICD 持续集成与持续交付——git

git使用 [rootcicd1 ~]# yum install -y git[rootcicd1 ~]# mkdir demo[rootcicd1 ~]# cd demo/ 初始化版本库 [rootcicd1 demo]# git init 查看状态 [rootcicd1 demo]# git status[rootcicd1 demo]# git status -s #简化输出 [rootcicd1 demo]# echo test > README.md[roo…...

光纤的跳线和尾纤

光纤跳线和光纤尾纤在结构上、连接方式、应用场景等方面存在明显的区别。 光纤跳线有0.9、2.0、3.0&#xff0c;通常是区分光缆外径的。0.9光缆外径0.9mm的&#xff0c;2.0光缆外径2mm&#xff0c;3.0光缆外径3mm。 同时分单模光纤跳线和多模光纤跳线。单模一般是黄色&#xff…...

SQL SERVER 2008安装教程

SQL SERVER 2008安装教程 本篇文章介绍了安装SQL Server 2008企业版的软硬件配置要求&#xff0c;安装过程的详细步骤&#xff0c;以及需要注意的事项。 安装步骤 (1). 在安装文件setup.exe上&#xff0c;单击鼠标右键选择“以管理员的身份运行”&#xff0c;如下图所示&#…...

好莱坞罢工事件!再次警醒人类重视AI监管,人工智能矛盾一触即发!

原创 | 文 BFT机器人 关注国外新闻的应该都知道&#xff0c;最近焦点新闻是好莱坞史上最大规模的一场罢工运动。这场维持118天的罢工运动&#xff0c;终于在11月9号早上12点在好莱坞宣布结束。这场罢工运动虽是演员工会和代表资方的影视制片人联盟的茅盾&#xff0c;但直接引发…...

深度学习系列54:使用 MMDETECTION 和 LABEL-STUDIO 进行半自动化目标检测标注

参考https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/label_studio.html&#xff0c;这里进行简要概述&#xff1a; 1. 启动目标检测服务 在mmdetection文件夹中&#xff0c;执行 label-studio-ml start projects/LabelStudio/backend_template --with \ conf…...

WSL2环境下Debian 12的Docker安装与配置

WSL设置相关&#xff1a; wsl -l -v # 查看当前配置情况正常配置如下&#xff1a; NAME STATE VERSION * Debian Running 2如果与以上有差异&#xff0c;按如下步骤进行配置&#xff1a; wsl --set-version 2 wsl --set-default-version 2 wsl --s…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...