您的位置:首页 > 理论基础 > 计算机网络

3.网络代理组件

2015-12-17 15:31 435 查看
源代码托管: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.注意事项

该组件只是一个通信中间代理,只是负责数据转发,涉及到业务层面的组包和分包等,仍需业务逻辑自己处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: