
nio
文章平均质量分 89
Young丶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
我在简历里写了TCP长连接架构设计,面试官都被我惊艳了
然后实时计算,得到一个列表排序,这个排序是按照节点数最少的节点排序的。因此在每个接入层节点中的处理上,还有一点非常重要的就是,维持着大量长连接后,如果客户端一直没有请求,或者客户端以为异常导致关闭了连接但是服务端并不知晓,那么这些无用的长连接,服务端肯定是需要清理的,避免占用大量资源。因此,针对 IM 场景,最合理的负载均衡策略,就是根据连接数来负载均衡,客户端新发起连接需要接入的接入层节点一定是连接数最少的,因为每台节点会需要控制最大连接数的限制才能保证最优性能,并且能够及时给压力大的节点减压。原创 2022-12-22 14:58:49 · 48313 阅读 · 0 评论 -
有了Socket协议,为什么还要Websocket协议?
TCP协议本身是全双工的,但我们最常用的HTTP1.1,虽然是基于TCP的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使用支持全双工的websocket协议。在HTTP1.1里。只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用websocket协议。原创 2022-10-13 17:28:25 · 25684 阅读 · 0 评论 -
多路复用 I/O 模型详解, 为什么他能支持更高的并发
阻塞 I/O在这种 IO 模型的场景下,我们是给每一个客户端连接创建一个线程去处理它。不管这个客户端建立了连接有没有在做事(发送读取数据之类),都要去维护这个连接,直到连接断开为止。创建过多的线程就会消耗过高的资源,以 Java BIO 为例BIO 是一个同步阻塞 IOJava 线程的实现取决于底层操作系统的实现在 linux 系统中,一个线程映射到一个轻量级进程(用户态中)然后去调用内核线程执行操作对线程的调度,切换时刻状态的存储等等都要消耗很多 CPU 和缓存资源同步:客户端请求服务端后,服原创 2021-02-20 23:29:13 · 1715 阅读 · 0 评论 -
【NIO】异步模型之Callback -- 封装NIO
在【NIO】IO模型,这节课中,我们提到了5种IO模型。第四种,SIGIO一般都是在进程间使用信号通讯的时候的手段,在Java中不是很适用,我就不深入去讲了。第五种,linux 服务器上的典型代表是 aio,但在Java中也没有对应的内容。不过,有一种非常通用的模型,也应该归到第五种的纯异步模型中去,这就是Callback模型。回调函数Callback函数,翻译成回调函数。假如我们是A,在通知B去做一件事情的时候,告诉他,你做完的时候通过XXX方式通知我你做完了。比如说,这个XXX可能是打电话,可能是微原创 2021-02-03 15:47:39 · 774 阅读 · 0 评论 -
【NIO】Selector
经过前边几节的介绍,我相信大家都掌握了IO多路复用的核心思想了。昨天我给了一个使用C语言进行 linux 编程的IO多路复用的例子。那个例子使用的是 poll 这个系统调用,今天我会给出一个使用Java实现与之完全对等的例子。Selector在Java中,Selector这个类是select/epoll/poll的外包类,在不同的平台上,底层的实现可能有所不同,但其基本原理是一样的,其原理图如下所示:所有的Channel都归Selector管理,这些channel中只要有至少一个有IO动作,就可以通原创 2021-02-03 14:11:25 · 617 阅读 · 0 评论 -
【NIO】IO多路复用
上节,我们讲解了阻塞和非阻塞,我们今天讲第三种IO模型,这就是IO多路复用。引入多路复用的原因实际上,在服务端与客户端一对一通信的时候,同步阻塞式地读写并不会有太大的问题,最典型的就是两个对等机器之间建立了TCP连接,并且通过TCP连接来发送一个大文件,有大量的数据传输。在这种场景中,阻塞式的写法简单高效。但是,在服务器场景下,例如,一个 Web Server,它的特点是客户端很多,连接时间很短,数据发送量很小(一个网页几十到几百K),为了让每一个用户都能得到及时的响应,我们可以使用多线程的方式来实现原创 2021-02-03 14:01:43 · 1043 阅读 · 0 评论 -
【NIO】阻塞与非阻塞
“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发原创 2021-02-03 13:33:31 · 1271 阅读 · 0 评论 -
【NIO】IO模型
这一节,我们要讲解真正的异步编程了。本节的大部分内容,图片都来自《Unix网络编程》这本书。如果有这本书的同学,可以直接去看这本书了,在我看来,目前还没遇到过比这本书讲得更清楚的。如果没有这本书,没关系,看我的文章也一样.说点题外话。做Java的,大多数是做服务端的,而现在绝大多数的IT公司的服务端都会运行在Linux 系统上,所以,掌握一定的 Linux 的知识,是成为一个好的服务端所必需的。学习服务端编程,最好的两本书,《unix环境高级编程》和《unix网络编程》,算是比较经典的。你看,《欢乐颂》里原创 2021-02-03 11:50:07 · 1191 阅读 · 0 评论 -
【NIO】通道Channel
通道式(Channel)是java.nio的第二个主要创新。通道既不是一个扩展也不是一项增强,而是全新的、极好的Java I/O示例,提供与I/O服务的直接连接。Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。通常情况下,通道与操作系统的文件描述符(FileDescriptor)和文件句柄(FileHandler)有着一对一的关系。虽然通道比文件描述符更广义,但开发者经常使用到的多数通道都是连接到开放的文件描述符的。Channel类提供维持平台独立性所需的抽原创 2021-02-03 11:28:48 · 1547 阅读 · 0 评论 -
【NIO】缓存区buffer
io中包含了很多东西,我个人认为最核心的是selector,那里我会使用大量的篇幅去介绍。但在那之前,我们还是从最简单的东西入手。今天只讲一下buffer。在没有使用nio之前,我们只能自己维护一个byte数组或者是char数组来进行批量读写,或者使用BufferedReader,BufferedInputStream来做读写缓冲。在nio里,就可以使用buffer了。学习使用这个buffer要有点耐心,彻底了解它的机制再去用,这玩意的设计不是很友好。我在第一次用的时候,也是发现它的接口各种不符合期望,只原创 2021-02-03 10:59:31 · 1323 阅读 · 0 评论