Muduo网络库实战(二):实现服务器与客户端的连接

1. 方案的确定

1)基本需求

用户1000+, IO压力不大;

多个客户端打开网站,输入查询字符串strclient,发送给服务器=》服务器接收客户端发过来的数据并处理,将结果返回给客户端;

2)并发网络服务程序设计方案

详见:《Muduo_网络库使用手册》的1.6节-《详解Muduo多线程模型》

@ muduo中TcpServer模式的选择:多线程模式

模式一:单线程,accept与TcpConnection用同一个线程做IO;

模式二:多线程,accept与EventLoop在同一个线程,另外创建一个EventThreadPool,新到的链接会被round-robin方式分配到线程池中;

=》问题

单线程和多线程运行时候的区别?

=》分析:采用多线程而不是多进程的原因

鉴于dealdata(假设服务器处理客户端数据的函数为dealdata)是一个计算密集型的任务,其瓶颈在CPU。为了让单线程程序充分利用CPU资源,简单的方法是在同一台机器上部署多个dealdata进程,让每个进程占用不同的端口。这样就把难题推给了客户端,因为客户端需要自己做负载均衡,然而鉴于本项目的用户较少(约1000),服务器进程不需要开很多,所以部署复杂均衡似乎小题大做;

@ 并发网路服务程序的选择:方案8

=》分析

方案6:在收到客户端的请求后,不在reactor线程计算,而是创建一个新线程去计算,以充分利用多核CPU。这个方案的特点是out-of-order,即同时创建多个线程去计算同一个连接上收到的多个请求,那么算出的结果的次序是不确定的;(这不满足本项目的需求)

方案8:为弥补方案6中每个请求创建线程的缺陷,根据用户的多少,使用固定大小的线程池。全部的IO工作都在一个reactor线程完成,而计算任务交给threadpool;因为计算任务彼此独立,而且IO的压力不大,这种方案很适用;

=》问题

公司用户1000人,如果1000人同时连接,muduo库的压力测试怎样?算不算IO压力不大的情形;

2.实战

在muduo的sudoku程序的基础上重新更改并进行测试;

时间: 2024-10-08 09:52:48

Muduo网络库实战(二):实现服务器与客户端的连接的相关文章

Muduo网络库实战(一):安装和配置

1. 参考资料 <Muduo_网络库使用手册> 2. 实战记录 1) muduo依赖项安装 centos安装cmake命令:# yum install cmake centos安装libboost库:推荐使用源码安装,因为命令安装后发现muduo编译出错: (链接:boost命令安装&&源码安装) 备注: tar.bz2 解压命令 tar -jxvf *.tar.bz2 2)muduo安装位置 cd muduo源文件夹 =>../build文件夹中

Muduo网络库源码分析(一) EventLoop事件循环(Poller和Channel)

从这一篇博文起,我们开始剖析Muduo网络库的源码,主要结合<Linux多线程服务端编程>和网上的一些学习资料! (一)TCP网络编程的本质:三个半事件 1. 连接的建立,包括服务端接受(accept) 新连接和客户端成功发起(connect) 连接.TCP 连接一旦建立,客户端和服务端是平等的,可以各自收发数据. 2. 连接的断开,包括主动断开(close 或shutdown) 和被动断开(read(2) 返回0). 3. 消息到达,文件描述符可读.这是最为重要的一个事件,对它的处理方式决定

muduo网络库使用心得

上个月看了朋友推荐的mudo网络库,下完代码得知是国内同行的开源作品,甚是敬佩.下了mudo使用手冊和035版的代码看了下结构,感觉是一个比較成熟并且方便使用的网络库.本人手头也有自己的网络库,尽管不敢说是一个多强大的网络库,但毕竟在外网也稳定运营了几年,多组同一时候在线也跑过30w左右,单组server也能跑上w人.做游戏server几年的经验,感觉稳定性才是网游server最核心最重要的环节,效率还在其次,这也是眼下网游server普遍採用分组架构决定的,从运营的角度来看,有时候一组serv

muduo网络库预备知识点

TCP网络编程的三个半事件 非阻塞网络编程中应用层要使用缓冲区 发送方应用层为什么使用缓冲区 接收方应用层方为什么使用缓冲 如何设计使用缓冲区 什么是Reactor模式 non-blocking IO IO multiplexing muduo推荐的模式 线程池大小的阻抗匹配原则 Eventloop采用level trigger的原因 前面都在分析muduo/base中的源码,这些是辅助网络库的.在分析网络库前,先总结一下相关知识点. TCP网络编程要关注哪些问题?muduo网络库总结为三个半事

java 网络编程 TCP协议 java 服务器和客户端 java socket编程

一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程:        先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请求,服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求.客户端输入字符串后按回车键,向服务器发送数据.服务器读取数据后回复客户端数据.这次请求处理完毕,启动的线程消亡.如果客户端接收到 "OK" 之外的返回数据,会再次

Muduo网络库源码分析(六)TcpConnection 的生存期管理

TcpConnection是使用shared_ptr来管理的类,因为它的生命周期模糊.TcpConnection表示已经建立或正在建立的连接,建立连接后,用户只需要在上层类如TcpServer中设置连接到来和消息到来的处理函数,继而回调TcpConnection中的 setConnectionCallback和setMessageCallback函数,实现对事件的处理.用户需要关心的事件是有限的,其他都由网络库负责. TcpConnection中封装了InputBuffer和OutputBuff

muduo网络库学习笔记(10):定时器的实现

传统的Reactor通过控制select和poll的等待时间来实现定时,而现在在Linux中有了timerfd,我们可以用和处理IO事件相同的方式来处理定时,代码的一致性更好. 一.为什么选择timerfd 常见的定时函数有如下几种: sleep alarm usleep nanosleep clock_nanosleep getitimer / setitimer timer_create / timer_settime / timer_gettime / timer_delete timer

Muduo网络库源码分析(五)Acceptor和TcpServer类

首先,我们先提一下对Socket的封装(不复杂,所以简单说一下). Endian.h : 封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中). SocketsOps.h/ SocketsOps.cc :封装了socket相关系统调用. Socket.h/Socket.cc(Socket类): 用RAII方法封装socket file descriptor. InetAddress.h/InetAddress.cc(InetAddress类):网际地址socka

muduo网络库学习笔记(9):Reactor模式的关键结构

Reactor模式简介 Reactor的意思是"反应堆",是一种事件驱动机制.它和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为"回调函数". moduo库Reactor模式的实现 muduo中Reactor的关键结构包括:EventLoop.Poller和Chann