Netty

长连接 、短连接、心跳机制与断线重连(转载)

感情迁移 提交于 2020-11-22 01:49:15
概述 可承遇到,不知什么原因,一个夜晚,机房中,大片的远程调用连接断开。 第二天早上,用户访问高峰,大部分服务器都在获取连接,造成大片网络阻塞。 服务崩溃,惨不忍睹的景象。 本文将从长连接和短连接的概念切入,再到长连接与短连接的区别,以及应用场景,引出心跳机制和断线重连,给出代码实现。 从原理到实践杜绝此类现象。 短连接 概念 client与server通过三次握手建立连接,client发送请求消息,server返回响应, 一次连接就完成了。 这时候双方任意都可以发起close操作,不过一般都是client先发起close操作。上述可知,短连接一般只会在 client/server间传递一次请求操作。 短连接的优缺点 管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。 使用场景 通常浏览器访问服务器的时候就是短连接。 对于服务端来说,长连接会耗费服务端的资源,而且用户用浏览器访问服务端相对而言不是很频繁的 如果有几十万,上百万的连接,服务端的压力会非常大,甚至会崩溃。 所以对于并发量大,请求频率低的,建议使用短连接。 长连接 什么是长连接 client向server发起连接,server接受client连接,双方建立连接。 Client与server完成一次读写之后, 它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。 长连接的生命周期 正常情况下

拼多多四面(Java岗):多线程+算法+网络+MySQL+Redis+分布式

心已入冬 提交于 2020-11-21 12:36:38
一面 线程池由哪些组件组成,有哪些线程池,分别怎么使用,以及拒绝策略有哪些 写一题算法,层次遍历树并输出每层的层级 写一道题,二叉树的后序遍历,非递归算法。 什么时候多线程会发生死锁,写一个例子 说一说jdk1.8中,对hashMap的优化,对concurrentHashMap的优化 如何解决hash冲突的,以及如果冲突了,怎么在hash表中找到目标值 有1000个数据存在hashmap中,实际的数量是多少,考虑负载因子和扩容 常见的RPC有哪些?对应的区别和性能比较? 操作系统的用户态和核心态切换条件以及为什么要切换 线程间的通信方式,异步队列,消息延迟获取 二面 MySQL的主从复制怎么做 MySQL的索引,使用B+树索引的好处 MySQL性能查看以及如何优化 Redis是怎么做缓存的 Redis的持久化操作 如何利用redis处理热点数据 TCP三次握手的过程,如果没有第三次握手有什么问题。 分布式锁怎么实现 三面 cap了解么,分别指什么 网络编程nio和netty相关,netty的线程模型,零拷贝实现 Redis是单线程还是多线程?Redis的分布式集群怎么做? 分布式消息队列有哪些(Kafka等)?有使用过哪些?具体应用在什么场景? 负载均衡怎么做的呢,为什么这么做,了解过集群雪崩么。 谈谈高并发场景下削峰,限流的实现? 四面(HR) 为什么跳槽? 期望的薪资是多少?

java IO NIO BIO 最权威的总结

折月煮酒 提交于 2020-11-21 08:41:02
1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/NIO与IO区别 1)Non-blocking IO(非阻塞IO) 2)Buffer(缓冲区) 3)Channel (通道) 4)Selectors(选择器) 2.3 NIO 读数据和写数据方式 2.4 NIO核心组件简单介绍 2.5 代码示例 3. AIO (Asynchronous I/O) 参考 BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。 同步和异步的区别最大在于异步的话调用者不需要等待处理结果

各大互联网企业Java面试题汇总,看我如何成功拿到百度的offer

谁说我不能喝 提交于 2020-11-21 03:33:42
前言 本人Java开发,5年经验,7月初来到帝都,开启面试经历,前后20天左右,主面互联网公司,一二线大公司或者是融资中的创业公司都面试过,拿了一些offer,其中包括奇虎360,最后综合决定还是去百度了。 首先不同面试官面试风格一定不同,我这里就是总结这些天面试Java开发过程中的大多数问题,综合分类有Java基础,框架,多线程,网络通信,数据库,设计模式,算法,等几个模块,由于问题太多,下面先列出问题,之后有时间在写文章解答,或者网上有很多答案,可以自行搜索。 关于专业技能 写完项目接着写写一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西----但是如果你掌握得越多,最终能得到的评价、拿到的薪水势必也越高。 1、基本语法 一、Java基础 1.String类为什么是final的。 2.HashMap的源码,实现原理,底层结构。 3.反射中,Class.forName和classloader的区别 4.session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。 5.Java中的队列都有哪些,有什么区别。 6.Java的内存模型以及GC算法 7.Java7、Java8的新特性(baidu问的,好BT) 8.Java数组和链表两种结构的操作效率

Netty如何实现同一个端口接收TCP和HTTP请求

百般思念 提交于 2020-11-19 14:05:24
前言 在java的网络编程世界里,Netty的地位可谓是举足轻重,说到基于NIO的网络编程,Netty几乎成为企业的首选,本文不会过多介绍Netty的基本使用等知识,本文着重介绍在Netty中如何实现同一个端口,既能接收TCP请求,也能接收Http请求。 由于一些特殊的原因,我要实现一款消息中间件,暂时称为“企业消息总线”吧。简单描述一下场景,对如果有相同或者类似场景的小伙伴可能有帮助。在企业内部,特别是制造业企业,往往会存在生产管理系统和生产控制系统。管理类系统我们都很熟悉了,但是控制类系统更多的是控制,比如控制机器的运行,接收机器的传感器传递上来的数据,然而管理系统如果要收集生产现场的数据,一般都是通过控制系统上传到管理系统,如果管理系统想要控制机器,则需要下发一些数据到控制系统,因此就存在一个管理系统到控制系统之间的通讯需求。一般的控制系统和管理系统之间都是使用TCP进行通讯,当然现在也有支持使用HTTP直接通信的,具体可以参考如下简图 今天只讨论使用TCP进行通讯的模式 需求提出 上面简单介绍了管理系统和控制系统之间的通讯模式,我们都知道,在网络编程里面,比较关注的两点就是 通讯协议 和 序列化协议 。通讯协议一般就是指传输层协议TCP/UDP或者应用层协议HTTP等协议。而序列化的就多了,常见的有protocol buffer,json或者自定义的某协议。

DotNetty 跨平台的网络通信库

隐身守侯 提交于 2020-11-19 05:44:59
长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架。终于微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用时,完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。 DotNetty同时也是开源的,它的源代码托管在Github上: https://github.com/azure/dotnetty 0x01 项目预览 从github上下载最新的代码到本地,使用VS2017或者VSCode打开下载好的代码,可以看到如图所示的代码那结构,其中源码部分有9个项目组成,其中 DotNetty.Common 是公共的类库项目,包装线程池,并行任务和常用帮助类的封装 DotNetty.Transport 是DotNetty核心的实现 DotNetty.Buffers 是对内存缓冲区管理的封装 DotNetty.Codes 是对编解码是封装,包括一些基础基类的实现,我们在项目中自定义的协议,都要继承该项目的特定基类和实现 DotNetty.Handlers 封装了常用的管道处理器,比如Tls编解码,超时机制,心跳检查,日志等,如果项目中没有用到可以不引用,不过一般都会用到 其他还有对Redis的编解码,Mqtt的编解码

Netty(二):Netty为啥去掉支持AIO?

女生的网名这么多〃 提交于 2020-11-18 23:57:16
匠心零度 转载请注明原创出处,谢谢! 疑惑 我们都知道bio nio 以及nio2(也就是aio),如果不是特别熟悉可以看看我之前写的 网络 I/O模型 ,那么netty为什么还经常看到类似下面的这段代码呢? EventLoopGroup ……= new NioEventLoopGroup(); …… …… b.group(……).channel(NioSocketChannel.class)…… …… …… ChannelFuture f = b.bind(PORT).sync(); 不选择bio模型我们知道,那么为什么不选择aio模式呢?而还是选择nio模式呢?这是一个值得思考的问题,我就一直很好奇,因为在 网络 I/O模型 里面介绍的,明显AIO要比NIO模型还要好。 那么为什么Netty还是选择的NIO模型呢? Netty一些组件简单介绍 Netty中这样定义EventLoop的,本篇重点不在这里,后续继续介绍EventLoop。 Will handle all the I/O operations for a [ Channel ] once registered. One [ EventLoop ] instance will usually handle more than one [ Channel ] but this may depend on

netty-池化内存-PoolChunkList

二次信任 提交于 2020-11-18 17:59:43
PoolChunkList 看名字,就知道是用来管理PoolChunk的 属性 private static final Iterator<PoolChunkMetric> EMPTY_METRICS = Collections.<PoolChunkMetric>emptyList().iterator(); private final PoolArena<T> arena;//归属PoolArean private final PoolChunkList<T> nextList;//链接下一个PoolChunkList private final int minUsage;//最小使用率 private final int maxUsage; //最大使用率 private final int maxCapacity;//最大容量 private PoolChunk<T> head;//第一个PoolChunk // This is only update once when create the linked like list of PoolChunkList in PoolArena constructor. private PoolChunkList<T> prevList; 重要方法 //用1-最小使用率,就是最大容量了 private static int

RocketMQ如何应对每天1500亿条的数据处理?

狂风中的少年 提交于 2020-11-18 14:39:52
同程艺龙的机票、火车票、汽车票、酒店相关业务已经接入了 RocketMQ,用于流量高峰时候的削峰,以减少后端的压力。 同时,对常规的系统进行解耦,将一些同步处理改成异步处理,每天处理的数据达 1500 亿条。 在近期的 Apache RocketMQ Meetup 上,同程艺龙机票事业部架构师查江,分享了同程艺龙的消息系统如何应对每天 1500 亿条的数据处理。 通过此文,您将了解到: 同程艺龙消息系统的使用情况 同程艺龙 消息系统的 应用场景 技术上踩过的坑 基于 RocketMQ 的改进 同程艺龙消息系统的使用情况 RocketMQ 集群分为 Name Server 和 Broker 两部分,Name Server 用的是双主模式,一个是考虑性能,另一个考虑安全性。 在纯数据的 Broker 分成很多组,每个组里面分为 Master 和 Slave。 目前,我们的机票、火车票、汽车票、酒店相关业务已经接入了 RocketMQ,用于流量高峰时候的削峰,以减少后端的压力。 同时,对常规的系统进行解耦,将一些同步处理改成异步处理,每天处理的数据达 1500 亿条。 选择 RocketMQ 的原因是: 接入简单,引入的 Java 包比较少 纯 Java 开发,设计逻辑比较清晰 整体性能比较稳定的,Topic 数量大的情况下,可以保持性能 同程艺龙消息系统的应用场景 退订系统

Netty 线程模型与Reactor 模式

微笑、不失礼 提交于 2020-11-18 05:21:49
前言 Netty 的线程模型是基于NIO的Selector 构建的,使用了异步驱动的Reactor 模式来构建的线程模型,可以很好的支持成百上千的 SocketChannel 连接。由于 READ/WRITE 都是非阻塞的,可以充分提升I/O线程的运行效率 ,避免了IO阻塞导致线程挂起, 同时可以让一个线程支持对多个客户端的连接SocketChannel的 READ/WRITE 操作, 从根本上解决了传统阻塞IO的一线程处理一连接的弊端。 高效率的Reactor模式 Reactor 模式 是一种为处理服务请求并发,提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序 (来自维基百科: https://zh.wikipedia.org/wiki/反应器模式 ) 常见的reactor模式有以下三种 单线程reactor 多线程reactor 主从reactor 1、单线程reactor ractor 单线程模式是指所有的I/O操作都在一个NIO线程完成,该线程的职责: 1.作为NIO服务端,接收客户端TCP连接 2.作为NIO客户端,向客户端发送TCP连接 3.READ/WRITE 客户端的请求 不过单线程的reactor 模式无法发挥多核的优势,因此对于高并发量的系统仍然存在瓶颈,主要原因如下: 1