长连接

搭建websocket消息推送服务,必须要考虑的几个问题

断了今生、忘了曾经 提交于 2020-04-06 19:22:04
近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高。从早期对websocket的应用仅限于少部分功能和IM等特殊场景,逐步发展为追求支持高并发,百万、千万级每秒通讯的高可用websocket服务。 面对各种新场景对websocket功能和性能越来越高的需求,不同的团队有不同的选择,有的直接使用由专业团队开发的成熟稳定的第三方websocket服务,有些则选择自建websocket服务。 作为一个具有多年websocket开发经验的老程序猿,经历了GoEasy企业级websocket服务从无到有,从小到大的过程,此文是根据过去几年在GoEasy开发过程中踩过的坑,以及为众多开发团队提供websocket服务、与众多开发者交流中的总结的一些经验和体会。 这次主要从搭建websocket服务的基本功能和特性方面做一些分享,下次有机会再从构建一个高可用websocket时要面对的高并发,海量消息,集群容灾,横向扩展,以及自动化运维等方面进更多的分享。 以下几点是个人认为在构建websocket服务时必须要考虑的一些技术特性以及能显著提高用户体验的功能,供各位同学参考: 1.建立心跳机制 心跳机制几乎是所有网络编程的第一步,经常容易被新手忽略。因为在websocket长连接中

HTML5性能优化

丶灬走出姿态 提交于 2020-04-06 05:19:51
HTML5性能优化 在看完这两章内容之后,我意犹未尽,于是乎从网上搜索关键字“Java Web高性能”,在IBM社区找到两篇不错的文章,而让人更意外的是我发现那两篇文章的内容跟《高性能HTML5》前两章高度相似,不知道是谁抄袭谁的,大家可以鉴别下真伪,下面附上地址。 http://dl2.iteye.com/upload/attachment/0097/9373/b0e69540-e703-3530-81bb-c93de7b850a6.pdf http://www.ibm.com/developerworks/cn/java/j-lo-javawebhiperf1/ http://www.ibm.com/developerworks/cn/java/j-lo-javawebhiperf2/ 前面是读后感,下面是我针对最近几天学习到的提高Web性能进行了篇幅不小的总结,一来为新人提供帮助,二来自己做一下笔记,加深记忆。 性能之前端篇 --减少重绘 在HTML页面完成展现之后,动态改变页面元素或调整CSS样式都会引起浏览器重绘,性能的损耗直接取决于动态改变的范围:如果只是改变一个元素的颜色之类的信息则只会重绘该元素;而如果是增删节点或调整节点位置则会引起其兄弟节点也一并重绘。 减少重绘并不是说不要重绘,而是要注意重绘范围:①改动的DOM元素越深则影响越小,所以尽量深入节点改动

数据库“长连接”与“短连接”

只愿长相守 提交于 2020-04-05 20:51:03
什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。 通常的短连接操作步骤是: 连接-》数据传输-》关闭连接 ; 而长连接通常就是: 连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接 ; 这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了 什么时候用长连接,短连接? 长连接主要用于在 少数 客户端与服务端的 频繁 通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。 但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。 总之,长连接和短连接的选择要视情况而定。 首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。 在使用mysql_real_connect连接数据库之后,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库

长连接和短连接

依然范特西╮ 提交于 2020-04-05 20:01:51
概念解释: 长连接: 长时间保持客户端与服务端的连接状态。默认超时时间8小时 短连接: 数据传输完毕立即断开,每次连接只完成一项业务的发送。 短连接的原理: 客户端连接--创建socket认证连接--维护连接--数据传输--关闭连接 #连接-》数据传输-》关闭连接; 长连接的原理: 客户端连接--创建socket认证连接--维护连接--数据传输--维护连接--数据传输.....-关闭连接 #连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接; 长短连接的例子 该使用长连接的情况下使用了短连接 某业务在审计时候发现连接数一直在直线上升: mysql> select count(1) from db_monitor.accesslog; +----------+ | count(1) | +----------+ | 16117 | +----------+ 1 row in set (0.01 sec) mysql> select count(1) from db_monitor.accesslog; +----------+ | count(1) | +----------+ | 23768| +----------+ 1 row in set (0.01 sec) ... 截一段连接的审计图给看看: 查看mysql的进程却只有2-3个连接

Nginx的keeplive

孤者浪人 提交于 2020-04-03 07:04:53
keepalive 当然,在nginx中,对于http1.0与http1.1也是支持长连接的。 什么是长连接呢?我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的,如果客户端与服务端之间网络差一点,这三次交互消费的时间会比较多,而且三次交互也会带来网络流量。当然,当连接断开后,也会有四次的交互,当然对用户体验来说就不重要了。而http请求是请求应答式的,如果我们能知道每个请求头与响应体的长度,那么我们是可以在一个连接上面执行多个请求的,这就是所谓的长连接,但前提条件是我们先得确定请求头与响应体的长度。 对于请求来说,如果当前请求需要有body,如POST请求,那么nginx就需要客户端在请求头中指定content-length来表明body的大小,否则返回400错误。也就是说,请求体的长度是确定的,那么响应体的长度呢?先来看看http协议中关于响应body长度的确定: 对于http1.0协议来说,如果响应头中有content-length头,则以content-length的长度就可以知道body的长度了,客户端在接收body时,就可以依照这个长度来接收数据,接收完后,就表示这个请求完成了。而如果没有content-length头,则客户端会一直接收数据,直到服务端主动断开连接

Mysql实战45讲学习详情----一条SQL查询语句是如何执行的?

人走茶凉 提交于 2020-04-02 19:26:10
大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 select * from T where ID=10; 这条查询语句的执行过程: 外部层:   用户与server层交互的媒介     一.客户端【用于连接数据库,输入命令/语句】       界面化连接数据库       输入 select * from T where ID=10; server层:   Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。     二.连接器【连接器负责跟客户端建立连接、获取权限、维持和管理连接。】       输入连接命令认证身份--mysql -h$ip -P$port -u$user -p         认证通过:连接器会到权限表里查询帐号权限              P:之后所有的权限判断逻辑都会依赖此时读到的权限               这意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。         认证失败:Access denied for user      

31.1.http基础知识简介

瘦欲@ 提交于 2020-04-02 12:11:37
TCP/IP协议 跨网络的主机间通讯 在建立通信连接的每一端,进程间的传输要有两个标志: IP地址和端口号,合称为套接字地址 socket address 客户机套接字地址定义了一个唯一的客户进程 服务器套接字地址定义了一个唯一的服务器进程 SOCKET套接字 Socket:套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年,4.2 BSD实现 Socket API:封装了内核中所提供的socket通信相关的系统调用 Socket Domain:根据其所使用的地址 AF_INET:Address Family,IPv4 AF_INET6:IPv6 AF_UNIX:同一主机上不同进程之间通信时使用 Socket Type:根据使用的传输层协议 SOCK_STREAM:流,tcp套接字,可靠地传递、面向连接 SOCK_DGRAM:数据报,udp套接字,不可靠地传递、无连接 SOCK_RAW: 裸套接字,无须tcp或udp,APP直接通过IP包通信 客户/服务器程序的套接字函数 套接字相关的系统调用: socket(): 创建一个套接字 bind(): 绑定IP和端口 listen(): 监听 accept(): 接收请求 connect(): 请求连接建立 write(): 发送 read(): 接收

HTTP协议分析

你说的曾经没有我的故事 提交于 2020-03-30 18:24:02
实验环境 操作机:Windows XP 实验目的 0、HTTP协议的基本概念及工作流程 1、捕获HTTP数据包的方法 2、分析HTTP的连接数据包 3、HTTP数据包的筛选技术 4、分析HTTP的数据传输数据包 实验工具 wireshark 实验步骤 了解HTTP工作流程 HTTP是一个 无状态 的协议。所谓的无状态指的是客户端 (Web浏览器) 和服务器之间不需要建立持久的连接。这也就意味着当一个客户端向服务器发出请求,然后服务器返回响应之后,连接也就关闭了。服务器并不会保留连接的相关信息,HTTP遵循的是 请求(Request)/应答(Response) 模型。客户端(Web浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有的HTTP连接都被构造成一套请求和应答。在这个过程中要经历4个阶段,包括建立连接、发送请求信息、发送响应信息和关闭连接,如下图所示: 由上图可知, HTTP的工作流程 为: 1、客户端通过TCP的三次握手建立与服务器的连接。 2、当TCP连接成功建立后,客户端向服务器发送HTTP请求。 3、服务器收到客户端的HTTP请求后,将回复响应数据包,并向客户端发送数据。 4、客户端通过TCP四次握手,与服务器断开TCP连接。 HTTP连接数据包的捕获 刚才说了,HTTP需要使用TCP的三次握手来建立连接

TCP的长连接与短连接

被刻印的时光 ゝ 提交于 2020-03-30 04:02:14
1.TCP连接 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图所示: (1)第一次握手:建立连接,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认. (2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态. (3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。 图1.TCP三次握手建立连接 2.TCP断开连接 由于TCP连接时全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 (1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送 (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号。 (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A. (4

RocketMQ之NameSever

旧巷老猫 提交于 2020-03-28 10:47:35
一、NameSever介绍 1.1 NameSever是什么 NameServer 的主要功能是为整个 MQ 集群提供服务协调与治理,具体就是记录维护 Topic 、 Broker 的信息,及监控 Broker 的运行状态,为 client 提供路由能力。 NameServer 之间没有信息同步操作,主要通过 Broker 轮询修改信息。 * Name Server 是一个无状态节点,可集群部署,节点之间无任何信息同步; * Broker 分为 Master 与 Slave,它们是一对多的关系,一个 Master 可以对应多个 Slave。 每个 Broker 与 Name Server 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 Name Server; * Producer与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路由信息,并向提供 Topic 服务的 Broker Master 建立长连接,且定时向 Master Broker 发送心跳。Producer 完全无状态,可集群部署; * Consumer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路由信息,并向提供 Topic 服务的 Master