前面我们在章节“Socket通讯探索(一)”中如何实现一个tcp连接,但是这仅仅是一个最初级的BIO实现,且没有添加线程池,实际应用中很少采用这种方式,因为不得不考虑当大量的Tcp连接建立的时候,服务端如何安全稳定的运行?为什么呢?

  1、BIO实现方式,是阻塞式的(上一节最后面的实现方式虽然无数据的时候,不会阻塞);

  2、服务端为每条连接都开辟了一个线程进行处理,而且在连接不断开的情况下,线程不会得到释放;

  基于以上情况,当有大量的连接建立的时候,服务端会开辟大量的线程处理并得不到释放,而线程会占用系统资源,这样就会导致系统资源耗尽,没有系统资源的连接请求将会等待处理,更甚至程序直接崩溃,所以最直接的方式是添加线程池防止程序崩溃,大量的连接的处理则还还需要另想他法。

  大家都知道当web应用面临大量的请求时,我们会对其进行集群或分布式等方式部署,同理,我们也可以对socket服务端进行多处部署。

  通常,由于Tcp连接中客户端需要知道服务端的IP跟端口,那么这就意味着客户端需要知道所有的目标服务器的地址和端口,如果有那么一台主机专门用于对我们的服务器进行负载均衡,然后将负载均衡完成后选择的地址跟端口返回给客户端,然后客户端再发起真实的连接请求。具体的请求过程如下图(详细请参考:https://wenku.baidu.com/view/d5769f85d4d8d15abe234e7c):

  

  以上图中的virtual server实际上就是一个负载均衡用的服务器,所有客户端都会优先连接此服务器得到真实服务器连接(real server);该模型具体的通信流程如下:

    ①client向处于侦听的vs发SYN包;

    ②VS按照调度策略选择一个RS,并向RS发SYN包;

    ④RS响应VS的SYN请求,将SYN ACK包返回给VS;

    ④VS将收到的SYN ACK包发给client;

    ④client将5次握手的最后一个ACK包直接发给RS,此时client进入已建立连接状态,RS在收到ACK包后也进入已建立连接状态

    ⑥client和RS直接通信,此过程与VS无关。

  通过以上模型即可完成TCP服务端集群部署,至于具体的实现过程,不在本篇的范畴之内,就目前来说,我只了解这一种实现方式,如果还有其他的方案,大家可以相互交流……

  

Socket通讯探索(二)-socket集群的更多相关文章

  1. Elasticsearch(二)--集群原理及优化

    一.ES原理 1.索引结构ES是面向文档的 各种文本内容以文档的形式存储到ES中,文档可以是一封邮件.一条日志,或者一个网页的内容.一般使用 JSON 作为文档的序列化格式,文档可以有很多字段,在创建 ...

  2. java socket通讯(二)处理多个客户端连接

    通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...

  3. zookeeper学习与实战(二)集群部署

    上一篇介绍了单机版zookeeper安装,这种情况一般用于开发测试.如果是生产环境建议用分布式集群部署,防止单点故障,增加zookeeper服务的高可用. [环境介绍]       三台机器:192. ...

  4. Kubernetes 二进制部署(二)集群部署(多 Master 节点通过 Nginx 负载均衡)

    0. 前言 紧接上一篇,本篇文章我们尝试学习多节点部署 kubernetes 集群 并通过 haproxy+keepalived 实现 Master 节点的负载均衡 1. 实验环境 实验环境主要为 5 ...

  5. Dubbo+zookeeper构建高可用分布式集群(二)-集群部署

    在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...

  6. Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  7. Zookeeper(二) zookeeper集群搭建 与使用

    一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03    1. ...

  8. 转载:【Oracle 集群】RAC知识图文详细教程(二)--Oracle 集群概念及原理

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  9. Hadoop 学习之路(二)—— 集群资源管理器 YARN

    一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部署 ...

随机推荐

  1. 10个很多人不知道的Redis使用技巧

    前言 Redis 在当前的技术社区里是非常热门的.从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redis已经走过了很长的一段路.随之而来的一系列最佳实践,使得大多数人可以正 ...

  2. SendInput模拟键盘操作

    #include <windows.h> int main() { HWND parentHwnd, childHwnd; INPUT input[4]; parentHwnd = Fin ...

  3. 构造UTF8的std::string

    在VC++的世界里,MS比较鼓励使用_UNICODE,std::wstring.而在Web, XML则提倡用UTF8.当在C++的程序里要保存/读取XML数据,就存在wstring与string之间的 ...

  4. CSS颜色表示的几种方式

    在CSS中颜色有很多表示方式,今天列出一些常见的颜色表示方式及它们的用法. ①color:blue;  第一种,调用颜色属性,将颜色的英文输入在冒号后,以分号结束. 这种方法直接了当,但是能表示的颜色 ...

  5. Netty源码分析之ChannelPipeline—入站事件的传播

    之前的文章中我们说过ChannelPipeline作为Netty中的数据管道,负责传递Channel中消息的事件传播,事件的传播分为入站和出站两个方向,分别通知ChannelInboundHandle ...

  6. PySpark Rdd Cheat Sheet Python

  7. CCF_201612-1_最大波动

    http://115.28.138.223/view.page?gpid=T47 水. #include<iostream> #include<cstring> #includ ...

  8. POJ_3663_贪心

    题目描述: 给你一堆数和一个限定的空间大小,要求求出两个数的和小于等于空间大小的对数. 思路: 贪心,先给一堆数从大到小排序. 第一个数取数组第一个,第二个数从第二个开始依次往后取,只要某个第二个数满 ...

  9. Codeforces 1092 F Tree with Maximum Cost (换根 + dfs)

    题意: 给你一棵无根树,每个节点有个权值$a_i$,指定一个点u,定义$\displaystyle value = \sum^v a_i*dist(u,v)$,求value的最大值 n,ai<= ...

  10. 视觉光盘,只有我可以贴全世界唯一,Windows上最高级的DOCKER客户端数字, 夜晚点击一个都没有,值班的小编辛苦了

    继上一篇视觉光盘,只有我可以贴全世界唯一,你永远截不到的图片(小编请用人性化语言解释移出首页) 合体了 晚上的小编, 呆了吗? 我看到了少于150字的随笔不允许发布到网站首页 我决定了用我专业的龟式输 ...