码迷,mamicode.com
首页 > 其他好文 > 详细

iNeedle系统之国舜项目

时间:2015-12-02 18:04:51      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

一、简介

本周公司接了一个小项目,是给北京国舜科技股份有限公司做一个HTTP相关的小功能产品。大概实现功能是将交换机的源数据通过解析,分析出HTTP包配对的request和response头,并把每对的request和response头相关字段内容,通过TCP方式发送给对方的指定的服务器。

二、要求

需要一台流量设备来抓取分析交换机中的数据,流量设备通过推送的方式将解析后的数据发送到我们平台,平台基于数据进行分析,关于流量设备有下边几个需求:

1、流量设备

a.需要同时支持双向(流出,流入)流量分析
b.需能支持千兆网峰值流量

2、双方对接方案

采用TCP长连接对接,也就是通过socket以TCP长连接方式向对方服务器发送指定格式的数据内容,对方以相应的格式进行解析即可。

3、发送数据包格式

1:  typedef struct {
2:       unsigned int magic;   // =0x4458434A,即“DXCJ”,用于同步时重新找到一个消息起始点
3:       unsigned int length;  // 负载数据的长度
4:       char *data;           // 实际数据内容
5:  }
6:  // 即之前定义的按照需求文档中2张表的顺序\t分隔的请求+响应数据,长度为length,之后即下一条消息的magic字段

注意:对于magic和length字段需要考虑网络字节序问题,我们设备都是小端字节序,对方要求是大端字节序,网络字节序也是大端字节序,最后转换为网络字节序传输即可。我们这边是用C语言发送数据,对方接收端程序是java语言写的,不过这都无所谓了,底层协议都是标准的,可以相互通信。

4、负载均衡

对方接收数据端会有多个主机进行数据的接收,因此存在多主机负载均衡的问题。可以通过设置配置文件,内容大概以这样的形式:host:port,多个主机就存在多个列表。这个配置文件由双方来协商,可以由对方来配置,也存在对方后续会不定时的添加主机或修改主机的情况。在发送数据时,使用轮询调度(Round-Robin Scheduling)将流量分发到各个节点上。例如,若有3个节点,发送4个消息,按如下顺序: 给节点1发一条消息,再给节点2发一条消息,再给节点3发一条消息,再从节点1开始继续循环,实现简单的负载均衡。

同时需要支持失败重试,比如3个节点有一个节点宕了,那么我这边会尽快启动,启动之前流量由另两个节点处理。待失败节点启动后,再次3台机器同时工作;通过长连接端口来判定节点失败。

5、数据格式

需求的字段有很多,有一部分字段需要额外重新解析,解析完毕各个字段之后需要以指定的格式进行发送;一个请求各字段间依照上述2个表序号顺序使用\t拼接为一整行作为一条消息发送。如果某个字段为空,不做忽略。例如,假如3个字段:Name\tAge\tAddress  如果Age为空,分隔符保留。则输出:Name\t\tAddress即可,如:liming\t\tchangpingqu。

三、实现方式

本功能实际上并不复杂,完全可以在ineedle系统基础之上做一些简单修改,形成数据消息,然后发送给对方即可。关于ineedle后续的额外功能可以摘除,以提高整个ineedle系统的效率。

四、方案设计

iNeedle系统之国舜项目

标签:

原文地址:http://www.cnblogs.com/liwei0526vip/p/5013648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!