<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[聊聊swoole的心跳]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Fri, 25 Mar 2016 09:37:46 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	来自：桶哥的一篇关于swoole的心跳的文章，作为Swoole顾问（顾得上就问,是为「顾问」）得推一下这篇文章，最后只留下一配置，其实我也不是太明白原理，我在想如果是局域网里还需要心跳？<br/>——————————————————————————————————————————————————————————————————————<br/>swoole提供了一个心跳的功能，很多朋友感到困惑。<br/>心跳是什么？<br/>顾名思义，心跳是判断一个事物生还是死的一个标准，在swoole里，心跳是指用来判断一个连接是正常还是断开的。<br/>从TCP协议说起<br/>我们都知道一个五元组标识一个网络连接，创建一个连接有三次握手，而断开一个连接有四次挥手。不管是服务器还是客户端<br/>发起连接的关闭，都会完整的走完四次挥手的过程，这样，一切很完美，系统回收这个fd，应用层也可以通过onClose回调处理相关的事情.<br/>fd是什么？<br/>fd学名是文件描述符，在unix的哲学就是一切皆文件中，这个fd就是系统层暴露给业务层的用来表示一个五元组网络连接的标识。你可以简单的理解为一个索引，通过对这个fd的操作，系统层可以找到相应的连接而且进行的一系列操作，如发送数据到网瞳，进行连接关闭等等。<br/>为什么要心跳？<br/>刚才提到，如果我们要关闭某个连接，我们可以在业务层对fd发起关闭连接的操作，以swoole为例：<br/>$server-&gt;close($fd);<br/>正常情况下，都会走完整个四次挥手，（swoole会有onClose回调），系统回收fd，以待分配给其他的连接。<br/>那系统为什么要回收fd，因为fd资源是有限的，所以必需重复利用。<br/>但在某些情况下，如突然拔掉网线或蓝翔演习挖断光缆，服务端并不能感知到这个连接的异常，但实际上是这个连接已经失效了，如果没有一个回收机制，这类连接将用光所有的fd，导致系统不再能接受新的连接请求，所以就有了心跳机制。<br/>什么是心跳机制？<br/>心跳机制就是业务层来提供一个连接是否存活的一个方法，让系统能判定一个连接是否失效。一般有两种实现方式：<br/>1： 客户端定时发送一个心跳包，告诉服务器我还活着，服务器定时检测所有客户端列表，看他们最后一个心跳包的时间是否过长，如果过长，则认为已无心跳，判定为死连接，主动关闭这个连接。<br/>2： 服务器定时询问所有的客户端，你们还活着么？如果活着，给我个回馈,没得到回馈的客户端，格杀勿论。<br/>两种心跳方案有什么区别？<br/>第一种方案，对服务器和网络的压力更小，而且更具有灵活性，但需要客户端配合定时发送心跳包。<br/>第二种方案，对服务器和网络压力更大，不建议使用。<br/>心跳在swoole里的实现<br/>swoole采用的是第一种方案<br/>swoole会在主进程独立起一个心跳线程，通过定时轮询所有的连接，来判断连接的生死，所以swoole的心跳不会堵塞任何业务逻辑。<br/>那怎么判断连接的生死了？swoole在connection结构体中有 time_t last_time 字段，用来存放最后一次收包的时间戳，进而通过与这个时间对比来判定是否存活<br/>于是，swoole有两个配置：<br/>heartbeat_check_interval： 服务器定时检测在线列表的时间<br/>heartbeat_idle_time：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;连接最大的空闲时间 （如果最后一个心跳包的时间与当前时间之差超过这个值，则认为该连接失效）<br/>配置建议<br/>建议 heartbeat_idle_time 为 heartbeat_check_interval 的两倍多一点。<br/>这个两倍是为了进行容错，允许丢一个包<br/>而多一点是考虑到网络的延时。<br/>你可以跟据实际的业务来调整这个容错率（允许丢几个包）。<br/>补充<br/>1、系统层面也提供心跳机制，只不过粒度相对比较粗，而且时间稍长，没有应用层灵活<br/>2、swoole还提供ping的功能，通过配置ping值，swoole内核可以判断只是一个心跳包，而不会，也没必要把数据包转发应用层(onReceive)。<br/>3、心跳不只是swoole独有，大多数tcp的网络服务都会考虑到这个问题
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 聊聊swoole的心跳]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>