3.网络代理组件

来源:互联网 发布:手机淘宝怎么找客服 编辑:程序博客网 时间:2024/06/04 00:04

源代码托管:https://github.com/zhangint/netproxy/

1.方案结构说明

1.1当前方案

这里写图片描述

                图1

在开发过程中,经常会遇到新增业务需要和对端通信,这个时候就需要重新做一个步骤,或者代码复用这个流程:连接,心跳,重连,接收,发送4个线程,数据处理模块,当遇到新的业务时,需重复上面5个步骤。为此写了该组建,只需要向该组件注册请求,通信协议,是否心跳包,心跳回调函数等逻辑,由组件完成通信全部流程,即将业务层和通信层分开。

1.2组件实现方案

将业务层和通信层分开,采用通信代理的方式,业务层只需要向通信代理注册通信请求即可,由通信代理统一对所有的通信进行数据交互,数据投递,心跳维护,重连等,当新增业务时只需要进行注册通信请求即可,焦点放在数据处理上。
这里写图片描述
图2

2.功能介绍

1.服务端和客户端两种代理模式
2.TCP和UDP两种代理协议
3.对频繁交互数据的业务进行动态线程切换,避免当前业务影响到其它业务
4.心跳发包,心跳检测和连接维护
5.对每个通信对象进行的数据统计,速率统计,发送量等信息维护
6.同步和异步数据发送方式
7.代理层同时支持多个代理,支持客户端模式,服务端模式混合模式,TCP和UDP等
8.对外屏蔽套接字,提供一个内部维护的唯一数,当进行重连后外部感知不到,不会影响到业务数据的正常交互
这里写图片描述
图3

3.性能分析

1.采用IO复用模型,(当前为EPOLL模型,支持扩展),提高线程使用率
2.预分配缓冲区和循环队列,避免频繁内存分配和释放
3.对频繁交互的数据动态移动到单线程接收,避免IO复用模型频繁触发,影响到其它业务数据交互
4.采用单独的发送线程模块,和IO接收模型分离
在并发上没有进行测试,尽可能的减少了在网络模块的延时,所以预测不会太低

4 .内部模块组成

这里写图片描述
图4
数据维护模块维护有所有的连接信息,内部唯一值信息等,其它模块都会依赖于它。
代理模块提供对外接口转换等功能。

5.注意事项

1.该组件并没有经过大规模严格测试,可能存在隐藏的bug。
2.数据投递采用了统一数据结构等,如果不遵守数据结构,那么不能使用该组件。
3.该组件只是尽可能的完成通用的通信代理,并不支持特殊的代理方式和规则。

6.类图

这里写图片描述
图5

7.用例说明

7.1参数配置

///线程配置策略,每隔2秒,进行一次速率统计,如果某一个套接字速率超过每秒3000条
///则单独为其创建接收线程,从IO复用模型中剔除,如果速率小于每秒1000条时,销毁线程,将套接字添加到IO复用模型

 ///线程配置策略,每隔2秒,进行一次速率统计,如果某一个套接字速率超过每秒3000条///则单独为其创建接收线程,从IO复用模型中剔除,如果速率小于每秒1000条时,销毁线程,将套接字添加到IO复用模型#define TOTAL_DUR       2#define SINGLE_THRD     3000#define LOW_WARN        1000///单独接收线程缓冲区深度#define QUE_DEEP        2000///接收缓冲区大小#define RECV_SIZE       2048///创建发送线程数量#define SEND_THRDS      1

7.2用例说明

 //注册一个不带心跳检测服务端    std::string ip = "192.168.100.70";    unsigned short port = 5681;    int maxlink = 3000;    m_module = CNetProxy::instance();    //向模块注册一个监听m_sockuniq = m_module->add_a_listener(ip, port, maxlink, &m_recvque);//注册一个带监听检测服务端    std::string ip = "192.168.100.70";    unsigned short port = 5683;    int maxlink = 3000;    m_module = CNetProxy::instance();    //向模块注册一个监听    m_sockuniq = m_module->add_a_listener(ip, port, maxlink, &m_recvque);    m_module->add_ser_heartstyle(m_sockuniq, 3, time_out);//注册一个不发送心跳包的客户端    std::string ip = "192.168.100.70";    unsigned short port = 5680;    CNetProxy* m_module = CNetProxy::instance();       //向模块注册一个客户端    m_sockuniq = m_module->add_a_con(ip, port, &m_recvque);    std::cout<<"client uniq:"<<m_sockuniq<<std::endl;//注册一个发心跳包的客户端    std::string ip = "192.168.100.70";    unsigned short port = 5682;    m_module = CNetProxy::instance();       //向模块注册一个客户端    m_sockuniq = m_module->add_a_con(ip, port, &m_recvque);    m_module->add_cli_heartconf(m_sockuniq, 100*1000, 3, send_heart_pack, time_out);    std::cout<<"client uniq:"<<m_sockuniq<<std::endl;

8.注意事项

  该组件只是一个通信中间代理,只是负责数据转发,涉及到业务层面的组包和分包等,仍需业务逻辑自己处理。 
0 0
原创粉丝点击