谈谈Boost网络编程(2)—— 新系统的设计

写文章之前。我们一般会想要採用何种方式,是“开门见山”,还是”疑问式开头“。写代码也有些类似。在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用。在设计新系统之初,我基本的目的是:保证高效率;保证高扩展性。

效率评价以”任务数/秒“做单位。

因为我的系统仅仅是client,不应该占用太多内存以及CPU。所以内存占用率,CPU使用率也被作为一个硬性指标。那么这里就存在疑问的地方:client有必要採用Boost Asio来做吗?我个人认为这取决于client的规模。假设client须要做到高并发。那么应该採用异步IO方式来做;反之则不必。

进一步。我们是怎样做到高效率?我们的设计大体流程例如以下:

注意:这里的任务都是同一份实例。

stream_server:负责接收任务。它实际上包含两部分:stream_server和stream_client。stream_server负责accept新连接。当连接到来时,它创建出stream_client。

这个被创建出的stream_client负责详细的任务解析。任务接收。

stream_client并不保存任务信息,它直接将正确的任务交由task_manager去进一步处理。

stream_server内部保存着各个client实例。这是为了方便以后对并发数的限制。

task_manager实际上包含分发和检測任务超时两个功能。不管是何种功能,task_manager都不保存任务信息。分发时,task_manager将任务分配到相应的runner中去执行;检測超时。则调用各个runner提供的检測超时接口。

runner是唯一真正持有任务实例的地方。从上面我们对stream_server和task_manager的描写叙述,这二者都不持有任务。我们希望通过这种设计,最大限度地实现0拷贝。runner的划分依据业务而来。比方:下载某个文件之后解压,那么我们可分创先出download_runner和decompress_runner:download_runner进行下载,decompress_runner进行解压。这样细分的优点是:假设decompress_runner失败了。那么能够再交由task_manager分发到download_runner进行重试。

换言之,runner能够得到重用。

client是实际运行任务的模块。任务可能是完毕一次HTTP请求(长连接或是短连接由client依据任务来决定),也可能是调用一次shell脚本。为了保证任务的成功率以及原子性,client具有超时控制,以及自己主动重试的功能(重试次数由runner指定)。

写到这里已经非常明显了,假设要做到多任务并发,或者採用多个client同一时候并发。或者採用多个runner同一时候执行任务。这里须要注意的是:runner是同步且被动的。

也就是:runner同一时刻仅仅能执行一个任务,且须要由task_manager主动给予任务。

时间: 2024-10-19 22:11:33

谈谈Boost网络编程(2)—— 新系统的设计的相关文章

谈谈Boost网络编程(3)—— 一些坑

很多时候,我们以为采用了一种新技术(尤其是成熟的技术),过程应该是一马平川的.然而实际上,采用新技术的过程却是掉入了各种坑里.究其原因,或者是使用方式有问题,或者是效率的白白浪费.这一章,我想讲讲,我在使用Boost Asio进程网络编程时,所遇到的各种坑. 其一.CPU占用100%问题. 在没有采用异步编程之前,程序占用100%基本是不敢想象的事情,因为一旦程序占用100%的CPU,那必然是代码中出现了死循环的BUG.但是采用了Boost Asio后,我发现新系统很容易就跑满了CPU.Why?

谈谈Boost网络编程(1)——旧系统的问题

前段时间一气呵成,把公司的陈旧代码完全替换掉了.这其间主要用到了Boost Asio,以及其他Boost库的组件(thread,bind等).这次开发,让我收获颇多. 首先,是技术上的成长.刚入公司时,负责维护的是很陈旧的代码,不过由于当时自己的视野局限,并没有认为其到底有多陈旧.后期随着技术的成长,以及视野的开阔,便有了重构系统的决定.既然说到陈旧,那么这里就简单说一下旧系统的旧在何处: 1)多线程多连接的服务端. 2)多线程多连接的客户端.第1)点和第2)点的缺点是显而易见的,线程和连接绑定

【python网络编程】新浪爬虫:关键词搜索爬取微博数据

上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我们爬取数据提供了一个很好的切入点. 在查阅了一些资料,参考了一些爬虫的例子后,得到大体思路:构造URL,爬取网页,然后解析网页 具体往下看~ 登陆新浪微博,进入高级搜索,如图输入,之后发送请求会发现地址栏变为如下:    http://s.weibo.com/weibo/%25E4%25B8%25A

谈谈Javascript异步编程以及新的实现方法--Promise

最近看到好多文章都在讲promise,为什么现在异步编程会受到如此重视?又为什么异步编程要选择Promise呢? 先来说说第一个问题,异步编程能受到如此重视很大原因是因为javascript正在逐渐走向标准化.规范化(MVC,模块,OOP),所以一些传统编程领域的一些规范化约束发挥的作用也越来越大了,而且javascript本身就是围绕"异步"来进行的,无论是浏览器端还是node服务器端,大多数的API都是通过"事件"来将请求和返回值分离的.简单来说:javascr

涉密网络内部安全过滤系统的设计与实现_爱学术

[摘要]着眼涉密网络内部不同密级间信息流传输提供可靠的安全保证,分析涉密网络内部不同密级间信息流动可能产生的安全威胁,从信息保障总体思路与框架的要求出发,以对象标定为基础,设计了基于WinPcap的信息过滤及监控系统,阐述了系统功能,设定了系统的体系及软件结构,编制了捕获过滤内核,研究了信息流的处理方法,给出了系统的安全策略.同时,对于数据风暴.数据处理等重点问题进行了深入研究.通过模拟论证,该系统可以有效地保证涉密网络内部信息流的安全传输. [作者] 李虎平  李尚柏  钟睿 转载至爱学术:h

全栈必备 网络编程基础

我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地进行网络编程. 关于网络 关于网络,在词典中的定义是这样的: 在电的系统中,由若干元件组成的用来使电信号按一定要求传输的电路或这种电路的部分,叫网络. 作为一名从事过TMN开发的通信

Java网络编程技术2

3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知道自己来自何处,以及打算去哪里.所以本身必须包含IP地址.端口号和数据内容. 3.1 示例程序——用UDP实现的聊天程序 用UDP协议通信不需要使用服务器,所以用于聊天的程序只要写一个,分别在不同的机器上运行就可以了,而无须写成服务端和客户端两种形式. 例9. 用UDP实现的聊天程序示例. pack

C#网络编程初步之TCP

原文:http://blog.csdn.net/mymonkey110/article/details/6841347 阅读背景:本文针对有C#的初学者而写的,主要讲解如何利用C#进行网络编程.如果你已经有一些网络编程的经验(只需要懂得网络编程的基本常识即可),并且理解C#的基本语法,那么这篇文章可以很快地带你进入C#网络编程的世界.如果你的基础不好,也不要紧,我相信这篇文章也会有你需要的内容. 网络编程基础复习: 图1. TCP编程基本模型 相信很多人看到图1应该不会陌生,这是一个利用TCP进

TCP/IP网络编程 学习笔记_4 --OSI七层网络模型

前言:本节将概括性的总结下网络通信的整体框架,其底层流程. 我们之前了解到了套接字的创建及应用,其实我们只是在用套接字这个工具而已,其底层细节对我们是屏蔽的.要通过因特网完成数据传输,其实不光光是软件就能解决的,还需要构建硬件系统等.因此,为了解决这一难题,许多专家聚集在一起,这些人是硬件,系统,路由算法等各领域的顶级专家.他们把网络通信划分很多模块,通过层次化的结构把大问题分成若干小问题逐个攻破.每个层都有一套定义好的通信标准(协议),数据就是这样通过这个层次结构从上到下,再从下到上传输的.示