前言
这个名字起的太大,其实我只是想说明一个设计。这个设计是用于收集并分析用户行为的。
一般我们分析用户行为离不开数据,这些数据可以来自于数据库也可以来自于用户操作日志。这里我介绍的就是基于用户操作日志的行为分析方法。这个方法也可以说是一个设计,该设计包含三个部分。第一部分是用户行为数据收集第二部分是用户行为数据汇总最后是用户行为数据分析。整体结构大概如下图:
图中大概能说明整个框架的运行流程。接下来我从三个部分说明一下
第一部分:用户行为数据收集
假设有A,B,C三台业务服务器在日常提供服务的同时记录了操作序列,操作序列类似
【时间,执行方法,是否成功,执行时间,数据库配置,执行命令,执行参数】。我们以分散的方式或是推得方式来获取用户数据,我们建立众多的客户端每个客户端配置收集文件的列表和文件类型,客户端周期性的读取该文件夹中的文件并发送到消息队列。这里说两点
1:读取那些文件,这是个问题。首先最新的文件不能读取因为业务服务器可能正在往里面写操作序列,其次上次读取过的文件也不能读取,我们如何区分是否读取过那?这里我们用文件的创建时间来区分。
2:为什么要发到消息队列而不是直接发到数据仓库里那?原因有两个,其一是数据仓库可能会成为热点,其次就是如果这里实现了向数据仓库里刷数据那么就有职责不分的嫌疑,毕竟还有文件到列的对应这个问题
第二部分:用户数据汇总
简单的说,就是周期性的读取消息队列中的数据然后刷到数据仓库里面。这里需要说明一个问题,就是如何把MQ中的信息和数据仓库中的列对应,这里我从两个方面来说
1:对应那些信息,
public class UserActionAttribute : Attribute
{
/// <summary>
/// 描述
/// </summary>
public string Describe { get ; set ; }
/// <summary>
/// 数据在MQ中的序号
/// </summary>
public int InMQIndex { get ; set ; }
/// <summary>
/// 列名称
/// </summary>
public string Column { get ; set ; }
/// <summary>
/// 字段类型
/// </summary>
public string DBType { get ; set ; }
public UserActionAttribute( int inMQIndex, string column, string dbType, string describe)
{
Column = column;
Describe = describe;
InMQIndex = inMQIndex;
DBType = dbType;
}
}
其实就是消息队列中的序号,列名称,类型。
2:如何对应和刷数据。我们允许用户自己定义实体EG:
{
[UserActionAttribute( 0 , " ServerName " , " System.String " , " 服务器名称 " )]
public String ServerName;
[UserActionAttribute( 1 , " DateTime " , " System.String " , " 信息发生的时间 " )]
public string DateTime;
[UserActionAttribute( 2 , " MethodName " , " System.String " , " 执行的方法名称 " )]
public string MethodName;
[UserActionAttribute( 3 , " IsSuccess " , " System.String " , " 是否执行成功 " )]
public string IsSuccess;
[UserActionAttribute( 4 , " ConsumeSec " , " System.String " , " 执行花费的时间 " )]
public string ConsumeSec;
[UserActionAttribute( 5 , " DBName " , " System.String " , " 数据库 " )]
public string DBName;
[UserActionAttribute( 6 , " StoredProcedureName " , " System.String " , "方法名称 " )]
public string StoredProcedureName;
[UserActionAttribute( 7 , " Params " , " System.String " , " 执行的参数 " )]
public string Params;
}
到这里我们就可以利用SqlBulkCopy来往数据库中刷数据了。EG
Type classSampleType = classSampleAssembly.GetType(EntityDllFullName);
object [] attribs = null ;
foreach (FieldInfo prop in classSampleType.GetFields())
{
attribs = prop.GetCustomAttributes( typeof (UserActionAttribute), false );
foreach (UserActionAttribute fieldAttrib in attribs)
{
DBSchema schema = new DBSchema(fieldAttrib.InMQIndex, fieldAttrib.Column, fieldAttrib.DBType);
list.Add(fieldAttrib.Column, schema);
}
}
第三部分:用户行为分析
大概是建立多维数据模型然后利用BI公式进行分析,最后得到结果报表。这部分当前正在开发,随后我将补充这部分内容。
后记
希望这个思路对大家有用。