zoukankan      html  css  js  c++  java
  • 一种基于Qt的可伸缩的全异步C/S架构server实现(一) 综述

           本文向大家介绍一种基于Qt的伸缩TCP服务实现。该实现针对C/Sclient-服务集群应用需求而搭建。

    连接监听、传输数据、数据处理均在独立的线程池中进行,依据特定任务不同,可安排负责监听、传输、处理的线程数目,从而在高传输负荷、高计算符合上达成取舍。数据处理採用流水线结构。以避免少量客户的密集计算请求影响其它client的处理。

    本文相应的代码符合LGPL协议,可直接从https://github.com/goldenhawking/zpserver下载. 也可从http://download.csdn.net/detail/goldenhawking/7461157 下载

         一、综述

           在很多行业应用中。client-服务架构不可替代。

    在client-服务架构下,服务扮演着重要的角色。

    本文旨在介绍一种较为通用的服务实现形式。这个形式能够依据详细应用需求灵活配置。从而降低反复开发的时间。该服务实现至少支持下列两种需求。

           第一类是转发型服务,主要负责沟通两个client之间的通信,本身不做复杂的处理。这样的服务一般要承受密集的连接,在某些应用中。还要承受沉重的传输负荷。典型的包含即时通信、两个内网之间的视频通信等。

            第二类是计算型服务,主要负责接收client的原始数据。处理后把结果返回。

    这样的服务一般执行在高性能server上,调用后台的并行计算、异构计算资源。处理后把结果返回给client。这些服务的client数量一般不多。但在某些应用中,当输入输出数据量大时,传输负荷也非常重。

    为了满足上述两类需求,服务设计具备例如以下特点。

            1、  可灵活设置监听port

            2、  监听、传输、处理均在独立的线程池中执行。

            3、  可依据须要。灵活设置传输、处理线程的数目。

            4、  对某个单一client的处理。不会显著拖慢全部client的响应。

            5、  须要支持分布式的集群服务,典型的情况是基于若干物理计算机构成的快速局域网实现进程集群。

            6、  可同一时候支持SSL与普通TCP连接。

    这些特点决定了本系统的架构设计。

    (一)系统结构

    服务由下面几个模块组成.


    1、  网络传输模块。负责管理用于监听、传输的套接字,并控制数据流在不同线程中流动。

    数据收发由一定规模的线程池负责,实现方法全然得益于Qt的线程事件循环。被绑定到某个Qthread上的Qobject对象。其信号-槽事件循环由该线程负责。这样,便可方便的指定某个套接字对象使用的线程。

    相同,受惠于Qt的良好封装,直接支持Tcp套接字及SSL套接字。且在执行时可动态调整。(注:编译这个模块须要Qt的SSL支持,即在 configure 时增加  -openssl 选项

    2、  任务流水线模块。负责数据的处理。

    在计算密集型的应用中,数据处理负荷较重,须要和网络传输划分开。

    基于普通线程池的处理模式,也存在队列堵塞的问题——若干个client请求的耗时操作,堵塞了其它client的响应。哪怕其它client的请求非常短时间就能处理完毕。也必须排队等待。採用流水线线程池避免了这个问题。每一个client把须要做的操作进行粒度化,在一个环形的队列中,线程池对单个client,每次仅处理一个粒度单位的任务。单个粒度单位完毕后。该client的剩余任务便被又一次插入到队列尾部。这个机制保证了client的总体延迟较小。

    3、  服务集群管理模块。该模块使用了网络传输模块、任务流水线模块的功能,实现了跨进程的serverßàserver链路。

    在快速局域网中,连接是快速、稳定的。因此,该模块被设计成一种星型无中心网络。随意新增server节点选择现有server集群中的随意一个节点。接入后。通过广播自己主动与其它server节点建立点对点连接。本模块仅仅是提供一个server到server的通信隧道,不负责详细通信内容的解译。对传输内容的控制。由详细应用决定。

    4、  数据库管理模块

    该模块基于Qt的插件式数据库封装QtSql。

    数据库被作为资源管理。支持在多线程的条件下。使用数据库资源。

    5、  框架界面。虽然常见的服务执行时表现为一个后台进程。但为了更好的演示server的功能。避免繁琐的配置,还是须要一个图形界面来显示状态、设置參数。

    本范例中,界面负责轮训server的各个状态。并设置參数。设置好的參数被存储在一个ini文件里,并在服务开启时载入。

    6、应用专有部分模块。上述1-4共四个主要模块均是通用的。

    他们互相之间没有形成联系,不过作为一种资源存在于程序的执行时(Runtime)之中。

    应用专有部分模块依据详细任务需求,灵活的使用上述资源,以实现功能。在范例代码中,实现了一种点对点的转发机制。演示者虚拟出一些工业设备。以及一些操作员使用的client软件。设备与client软件在成功认证并登录后,须要交换数据。改变这个模块的代码,就可以实现自己的功能。

    (二) 设计性能

    项目

    指标说明

    指标值

    备注

    支持的连接类型

    取决于Qt的支持类型

    SSL和Plain

    执行时同一时候支持两类.

    协议

    Ipv4 TCP , IPV6 Tcp

     

    设计单进程连接数

    在48传输线程配置下计算

    10242048

    取决于实际机器的性能和任务形式.

    设计集群规模

    星型集群的规模受到节点数影响。

    100节点,9900个跨server连接。

    局域网中的连接数为节点数*(节点数-1)。

    设计总用户规模

    100节点、每节点2048个用户

    20万

     

    下一篇文章,将開始介绍各个模块的设计思路。先给出范例代码的測试编译环境:

    1、Ubuntu 14.04 + Qt5.2.1 openSSL 自编译版

    2、Win 7 x64 + VCExpress 2013 x64, x86 + Qt 5.2.1 openSSL自编译版

    3、Win XP x86 + VC2010Express x86 + Qt5.2.1openSSL自编译版

    主要界面:



  • 相关阅读:
    atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    atitit。企业的价值观 员工第一 vs 客户第一.docx
    Atitit 实现java的linq 以及与stream api的比较
    Atitit dsl exer v3 qb3 新特性
    Atititi tesseract使用总结
    Atitit 修改密码的功能流程设计 attilax总结
    atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5138850.html
Copyright © 2011-2022 走看看