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

前段时间一气呵成,把公司的陈旧代码完全替换掉了。这其间主要用到了Boost Asio,以及其他Boost库的组件(thread,bind等)。这次开发,让我收获颇多。

首先,是技术上的成长。刚入公司时,负责维护的是很陈旧的代码,不过由于当时自己的视野局限,并没有认为其到底有多陈旧。后期随着技术的成长,以及视野的开阔,便有了重构系统的决定。既然说到陈旧,那么这里就简单说一下旧系统的旧在何处:

1)多线程多连接的服务端。

2)多线程多连接的客户端。第1)点和第2)点的缺点是显而易见的,线程和连接绑定的做法不仅会带来扩展问题,而且也会造成性能缺失。在旧系统中,线程数已经达到了300多个,而实际上线上运行的系统最多只有12个核心,线程数远远大于CPU核心数,这导致了:线程大多时候都在空跑;不必要的上下文切换。

3)客户端和服务端采用父子进程。父子进程通信机制原本是没有错的,但是从系统的业务逻辑来看,采用父子进程通信没有必要。改用一个进程,不仅减少了不必要的任务数据拷贝(线程可以共享数据结构),而且便于前期开发以及后期维护。

4)还有一些不必要的任务拷贝,多余的日志打印等等,这里就不再详细描述了。

你站在桥上看风景,

看风景人在楼上看你。

明月装饰了你的窗子,

你装饰了别人的梦。

借这首诗,只是想说,既然旧系统有问题,那肯定不止我一个人发现了。是的,我们优秀的研发人员实际上已经开发了好的替代产品。这个好的替代产品,采用以下设计:

1)采用epoll来处理网络事件,但不支持纯流数据的接收和发送,只提供了http客户端的封装。

2)采用Round-Robin算法来处理所有的事件:将大任务细分为小任务,并且支持FIFO。但是实际运行时,发现他们采用的Round-Robin算法不是特别完善,比如曾经的测试:持续不断地给程序发送大批量任务,结果导致任务反馈卡住了。

3)部门间沟通困难。由于公司太大了,部门间的沟通变得异常艰难,这首先表现在部门之间的代码无法共享。这就导致,我们希望定制日志文件大小,希望支持socket流的客户端(并且随之支持protobuf)的希望持续落空。

在种种限制和不足里,我最终决定开发新的替代产品。

时间: 2024-10-11 12:19:49

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

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

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

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

写文章之前.我们一般会想要採用何种方式,是"开门见山",还是"疑问式开头".写代码也有些类似.在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用.在设计新系统之初,我基本的目的是:保证高效率:保证高扩展性. 效率评价以"任务数/秒"做单位. 因为我的系统仅仅是client,不应该占用太多内存以及CPU.所以内存占用率,CPU使用率也被作为一个硬性指标.那么这里就存在疑问的地方:client有必要採用Boost Asio来做吗?我个人认

全栈必备 网络编程基础

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

Java网络编程和NIO详解开篇:Java网络编程基础

Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. 对于一个码农而言,了解网络的基础知识可能还是从了解定义开始,认识OSI的七层协议模型,深入Socket内部,进而熟练地

Boost.Asio c++ 网络编程翻译(1)

第一次翻译,希望大家多多指正 实战出精华 Boost.Asio C++ 网络编程 用具体的C++网络编程例子来提升你的技能 John Torjan 用具体的C++网络编程例子来提升你的技能 Copyright ? 2013 Packt Publishing 版权所有,除了在鉴定文章或者评论中进行简单引用,如果没有经过出版者事先的书面授权,该书的任何部分都不能被转载.存储在检索系统中.或者以任何形式和方式传阅. 在这本书准备发行之前,我们已经尽我们最大的努力去保证书中信息的准确性.但是,这本书中包

I/O系统、网络编程、XML

I/O系统 输入流InputStream  File file = new File("E:\\ello"); //找到指定文件 if(file.exists()){//文件是否存在   System.out.println("存在");  }else{   System.out.println("不存在");    if(!file.isDirectory()){    try {     file.createNewFile();//文件不存

Boost.Asio c++ 网络编程翻译(26)

Boost.Asio-其他特性 这章我们讲了解一些Boost.Asio不那么为人所知的特性.标准的stream和streambuf对象有时候会更难用一些,但正如你所见.它们也有它们的益处.最后,你会看到姗姗来迟的Boost.Asio协程的入口,它能够让你的异步代码变的很易读.这是很惊人的一个特性. 标准stream和标准I/O buffer 读这一章节之前你须要对STL stream和STL streambuf对象有所了解. Boost.Asio在处理I/O操作时支持两种类型的buffer: b

Boost.Asio c++ 网络编程翻译(6)

io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个ios_service的实例.ios_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用完成处理程序. 如果你选择用同步的方式来创建你的应用,你不需要考虑我将在这一节向你展示的东西. 你可以用几种不同的方式来使用io_service.在下面的例子中,我们有3个异步操作,2个socket连接和一个计时器等待: 有一个io_service和一个处理线程

Boost Asio 网络编程 基本用法

Boost Asio 网络编程 基本用法 flyfish 2015-2-9 IP地址 boost::asio::ip::address表示IP地址,同时支持ipv4和ipv6. boost::asio::ip::address addr; addr = addr.from_string("127.0.0.1"); assert(addr.is_v4()); OutputDebugStringA(addr.to_string().c_str()); addr = addr.from_st