文档章节

大型网站系统架构实践(二)分布式模块之间的通信

迷你卡卡西
 迷你卡卡西
发布于 2015/04/29 12:05
字数 1413
阅读 16
收藏 1

上一篇文章中讲到了分布式部署之后,各个模块要通过网络进行通信,那么如何通信,用什么协议呢?

可选的方案有http tcp/ip(socket)等

http短连接通信方案

基于http协议,xml报文传输

客户端具体框架为httpclient,服务端为struts2

客户端和服务端的通信在内网

该方案我们实行过一段时间,发现存在性能问题,首先是短连接,在并发量较大的时候,开启大量的tcp连接,这样连接资源容易耗尽,客户端首先成为瓶颈,tps上不去。

我总结的几点原因:

1.每次通信都重新开启新的tcp连接,握手协议耗时间

2.tcp是慢启动,TCP 数据传输的性能还取决于 TCP 连接的使用期(age)。TCP 连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐被称为 TCP 慢启动(slow start),用于防止因特网的突

然过载和拥塞

3.http协议是在tcp协议上封装了一层,因此还存在解析协议的消耗,如果直接用tcp协议进行传输,效率将要高一点

据说http1.1可以实现长连接,但是没有用java客户端试过,后续再研究。

Mina长连接通信方案

主要开发任务在客户端,我是用Mina做的长连接异步通信,

我自己编写代码实现了一个,有时间贴出来分享一下,如果有想了解Mina使用技术的,可以先看我的Mina系列博客http://www.cnblogs.com/tangyanbo/p/4297377.html

这里我做了相关的性能测试,下面把测试结果贴出来一下:

短连接测试

场景描述

socket 发送消息到服务端,接收到响应后关闭

结果:

一段时间过后,会出现死掉的现象,连接会被耗尽

服务器cpu

2线程 3000Mhz

服务器cpu使用率

110%

客户端cpu

4线程 2400Mhz

客户端cpu使用率

95%

客户端执行线程数

500

每秒并发数

1800

长连接异步通讯测试

场景描述

客户端开启2个长连接,与服务端通信

服务器cpu

2线程 3000Mhz

服务器cpu使用率

100%-150%

客户端cpu

4线程 2400Mhz

客户端cpu使用率

60%

客户端连接数

2

客户端执行线程数

500

每秒通过事务数

16000

性能明显提升,而且状态稳定,cpu利用率较低

这里大家会有个问题,为什么要用异步通信,不能是同步

这里其实我们先要搞清楚什么是同步通信,什么是异步通信

同步通信

同步通信应该很好理解,这里我们以同一个socket连接为例,即多次请求都是从一个socket连接发送出去的。

Socket客户端发送一个请求,等待响应成功之后,再发送另一个请求,即在同一时间只能发送一个请求,加入我们的场景是这样的,发送的报文较小,服务端处理的速度较快,我们网站的大多数业务请求都是这样的,这样报文在网络中传输的时候,通道是很空闲的,通信的吞吐量将收到影响。

典型的同步通信是jdbc

异步通信

还是以同一个socket连接为例,socket客户端发送一个请求之后,在响应还没到来的时候,可以继续发送另一个请求,具体场景是这样的,业务线程1发送请求,然后线程等待结果,业务线程2发送请求,然后等待结果,以此类推,但是socket输出通道可以一直发送消息,socket输入一直在接收消息,这样业务处理和通信逻辑是分离开来的互不干扰,且充分利用了通信通道,因为网络传输的速度比cpu和磁盘要慢的多,因此解约使用网络资源,将极大的提高系统吞吐量,当然要记住这里的使用场景,高并发,较小的报文传输,如果报文特别大,几十MB,那异步通信就没意义了

NIO 和BIO

Mina是使用的NIO

这个网站上很多资料,我就简单的讲下,我们的场景是适合用NIO的,为什么呢?

我们的场景除了高并发,报文小,还有一个特点,就是客户端部署的点要远远多于服务端,因为越是底层的服务,可重用性越高,那么客户端就相对较多,服务端相对较少。

BIO的缺点

传统的BIO特点,有N个客户端连接服务端,服务端就需要开启N个线程来分别处理客户端的请求,而且很多时候客户端是空闲状态的,那么服务端给它开的线程也将空闲,造成了资源浪费,同时线程数还不够用。

NIO的优点

NIO很好的解决了这个问题,它使得服务端的一个线程可以处理多个客户端连接,只要协调的好,可以用较少的线程处理较多的客户端连接,使线程利用率得到很大的提高。

本文转载自:http://www.cnblogs.com/tangyanbo/p/4387774.html

迷你卡卡西
粉丝 6
博文 18
码字总数 503
作品 0
大连
高级程序员
私信 提问
说说如何实现可扩展性的大型网站架构

网站的可扩展性架构设计,能够在对现有系统影响最小的情况下,系统功能可以可持续扩展及提升的能力。 在此,对容易混为一谈的 “扩展性” 和 “伸缩性” 的概念进行详细说明: 扩展性 表现为...

deniro
2017/11/06
0
0
大型分布式网站架构实战项目分析

一、分布式系统是什么? 1、定义 distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages(分......

烂猪皮
2018/04/27
34
1
分布式系统实战

导言:记得在自己大学毕业的2006年到之后近五年的工作里,源于工作经历和有限的视野,几乎对“分布式系统”没有任何概念。当然,彼时的互联网/移动互联网还未对我们的生活呈覆盖颠覆之势,很...

yaocoder
2017/12/03
0
0
我也要谈谈大型网站架构之系列(4)——分布式中的异步通信

我也要谈谈大型网站架构之系列(4)——分布式中的异步通信   我们知道在面向对象编程中,总会想着各种办法来实现代码的解耦,从而让项目中的各种人员面对自己熟悉的业务进行开发, 做到术...

蜗牛奔跑
2015/06/25
69
0
《大型网站技术架构》——第二章 大型网站架构模式

分层 横向维度 上层对下层的依赖和调用 合理规划层次边界和接口 禁止跨层次的调用及逆向调用 分割 纵向切分 分布式 将不同模块部署在不同的服务器上,通过远程调用协同工作。 问题: 调用通过...

wsjtwmy
2018/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
525
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
28
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
15
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
40
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部