3.网络代理组件
2015-12-17 15:31
435 查看
源代码托管:https://github.com/zhangint/netproxy/
在开发过程中,经常会遇到新增业务需要和对端通信,这个时候就需要重新做一个步骤,或者代码复用这个流程:连接,心跳,重连,接收,发送4个线程,数据处理模块,当遇到新的业务时,需重复上面5个步骤。为此写了该组建,只需要向该组件注册请求,通信协议,是否心跳包,心跳回调函数等逻辑,由组件完成通信全部流程,即将业务层和通信层分开。
图2
2.TCP和UDP两种代理协议
3.对频繁交互数据的业务进行动态线程切换,避免当前业务影响到其它业务
4.心跳发包,心跳检测和连接维护
5.对每个通信对象进行的数据统计,速率统计,发送量等信息维护
6.同步和异步数据发送方式
7.代理层同时支持多个代理,支持客户端模式,服务端模式混合模式,TCP和UDP等
8.对外屏蔽套接字,提供一个内部维护的唯一数,当进行重连后外部感知不到,不会影响到业务数据的正常交互
图3
2.预分配缓冲区和循环队列,避免频繁内存分配和释放
3.对频繁交互的数据动态移动到单线程接收,避免IO复用模型频繁触发,影响到其它业务数据交互
4.采用单独的发送线程模块,和IO接收模型分离
在并发上没有进行测试,尽可能的减少了在网络模块的延时,所以预测不会太低
图4
数据维护模块维护有所有的连接信息,内部唯一值信息等,其它模块都会依赖于它。
代理模块提供对外接口转换等功能。
2.数据投递采用了统一数据结构等,如果不遵守数据结构,那么不能使用该组件。
3.该组件只是尽可能的完成通用的通信代理,并不支持特殊的代理方式和规则。
图5
///则单独为其创建接收线程,从IO复用模型中剔除,如果速率小于每秒1000条时,销毁线程,将套接字添加到IO复用模型
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.注意事项
该组件只是一个通信中间代理,只是负责数据转发,涉及到业务层面的组包和分包等,仍需业务逻辑自己处理。
相关文章推荐
- android-async-http AsyncHttpClient介绍和使用
- TCP/IP路由技术(第一卷)中文版勘误表(有错误的地方)
- Android Network ——判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- Wamp下的虚拟主机报错403 Forbidden, You don't have permission to access / on this server.
- HTTP 协议之Gzip压缩原理
- 【iOS与EV3混合机器人编程系列之四】iOS_WiFi_EV3_Library 剖析之一:WiFi UDP和TCP
- spring定时器设置(转自:http://my.oschina.net/LvSantorini/blog/520049)
- android-async-http AsyncHttpClient介绍
- 从网络解析数据时遇到的问题
- [第三方]AFNetWorking3.0网络框架使用方法
- Java HttpClient解析https时报错Could not generate DH keypair
- Java HttpClient解析https时报错Could not generate DH keypair
- AFNetWorking 监听网络连接的状态
- LAMP的部署(一)
- Java+MySQL实现网络爬虫程序
- c++实现bp神经网络分类
- TCP协议
- Eclipse进行Java web开发时,可能会出现这样的错误:The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- 使用Nginx为HTTP服务做负载均衡
- 看完《java网络编程》的总结