加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

实例:一个服务器程序的架构介绍

发布时间:2019-01-29 18:45:33 所属栏目:外闻 来源:高性能服务器开发
导读:本文将介绍我曾经做过的一个项目的服务器架构和服务器编程的一些重要细节。 一、程序运行环境 操作系统:Centos 7.0 编译器:gcc/g++ 4.8.3、cmake 2.8.11 mysql数据库:5.5.47 项目代码管理工具:Visual Studio 2013 一、程序结构 该程序总共有 17 个线程

因为每个工作线程都存在一个 m_functors,现在问题来了,如何将产生的任务均衡地分配给每个工作线程。这个做法类似上文中如何将新连接的 socket 句柄挂载到工作线程的 epollfd 上,也是 round-robin 算法。上文已经描述,此处不再赘述。

还有种情况,就是希望任务产生时,工作线程能够立马执行这些任务,而不是等 epoll_wait 超时返回之后。这个时候的做法,就是使用一些技巧唤醒epoll_wait,Linux 系统可以使用socketpair 或 timerevent、eventfd 等技巧。

问题 1 的答案是:业务层产生任务可能会交给数据库任务队列A,这里的业务层代码可能就是工作线程中 do_other_things() 函数执行体中的调用。至于交给这个 9 个数据库线程的哪一个的任务队列,同样采用了 round-robin 算法。所以就存在一个对象 CDbThreadManager来管理这九个数据库线程。下面的伪码是向数据库工作线程中加入任务:

  1. bool CDbThreadManager::AddTask(IMysqlTask* poTask )   
  2. {   
  3.     if (m_index >= m_dwThreadsCount)   
  4.     {   
  5.         m_index = 0;   
  6.     }   
  7.  
  8.     return m_aoMysqlThreads[m_index++].AddTask(poTask);   

同理问题 2 中的消费者也可能就是 do_other_things() 函数执行体中的调用。

现在来说问题 3,业务层的数据产生后,经过 TcpSession 装包后,需要发送的话,产生任务丢给工作线程的 do_other_things(),然后在相关的 Channel 里面发送,因为没有监测该 socket 上的可写事件,所以该数据可能调用 send() 或者 write() 时会阻塞,没关系,sleep() 一会儿,继续发送,一直尝试,到数据发出去。伪码如下:

  1. bool Channel::Send()   
  2. {   
  3.     int offset = 0;   
  4.     while (true)   
  5.     {   
  6.         int n = ::send(socketfd, buf + offset, length - offset);   
  7.         if (n == -1)   
  8.         {   
  9.             if (errno == EWOULDBLOCK)   
  10.             {   
  11.                 ::sleep(100);   
  12.                 continue;   
  13.             }   
  14.         }   
  15.         //对方关闭了socket,这端建议也关闭   
  16.         else if (n == 0)   
  17.         {   
  18.             close(socketfd);   
  19.             return false;   
  20.         }   
  21.  
  22.         offset += n;   
  23.         if (offset >= length)   
  24.             break;   
  25.  
  26.     }   
  27.  
  28.     return true;       

最后,还有一个模块日志线程没有介绍,高性能的日志实现方案目前并不常见。

【编辑推荐】

  1. 效率比风冷高4000倍!技嘉搬出液冷服务器:16块显卡
  2. 基础标配Linux开发服务器的搭建
  3. 聊聊高性能服务器Server之Reactor模型
  4. Shell 在手,天下我有--分析服务器日志不愁?
  5. 深入考察无服务器架构的安全威胁,敏感数据泄露
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读