第一次在问题网站上发帖,但我有一个比较复杂的问题,我已经看了几天了。
Background At work we re implementing a new billing system. However, we want to take the unprecedented move of actually auditing the new billing system against the old one which is significantly more robust on an ongoing basis. The reason is the new billing system is alot more flexible for our new rate plans, so marketing is really on us to get this new billing system in place.
我们花了一大笔钱让IT小组开发了一份报告,每天早上8点运行昨天的数据,比较记录以获取字节计数差异,并生成报告。对我们来说并不是很有用,因为首先它会在第二天运行,其次如果它显示出糟糕的结果,我们无法知道为什么前一天可能有问题。
因此,我们想要建立自己的系统,可以连接到任何可能的数据来源(首先只有新旧系统的用户数据记录(UDR)),并在几乎实时地比较结果。
关于规模的一些注意事项,每个计费系统每天产生大约6百万条记录,总文件大小约为1 GB。
My Proposed set-up Essentially, buy some servers, we have budget for several 8 core / 32GB of RAM machines, so I d like to do all the processing and storage in in-memory data structures. We can buy bigger server s if necessary, but after a couple days, I don t see any reason to keep the data in memory any longer (written out to persistent storage) and Aggregate statistics stored in a database.
每个记录基本上包含平台上的记录ID、关联ID、用户名、登录时间、持续时间、传入字节数、传出字节数以及一些其他字段。
我想使用相当复杂的数据结构进行处理。每个记录都将被分成一个用户对象和一个属于平台A或平台B的记录对象。在顶层,将是一个基于用户名的自平衡二叉搜索树。下一步类似于基于日期的跳跃列表,因此我们将有下一个匹配记录,下一个日期,下一个小时,下一个月,下一个年等等。最后,我们将拥有我们匹配的记录对象,实质上只是一个持有者,引用来自系统A的UDR记录对象和来自系统B的UDR记录对象。
当添加数据时,我会运行多个内部分析,以查看新的计费系统是否出现故障,与旧系统相比是否存在大的差异,并向我们的操作中心发送警报以进行调查。我个人没有任何问题。
Problem The problem I have is aggregate statistics are great, but I want to see if I can come up with a sort of query language where the user can enter a query, for say the top contributors to this alarm, and see what records contributed to the discrepancy, and dig in and investigate. Originally, I wanted to use a syntax similar to a filter in wireshark, with some added in SQL.
例子:
udr.bytesin > 1000 && (udr.analysis.discrepancy > 100000 || udr.analysis.discrepency_percent > 100) && udr.started_date > 2008-11-10 22:00:44 order by udr.analysis.discrepancy DESC LIMIT 10
另一个选择就是使用 DLINQ,但是我已经离开C#游戏一年半了,所以不是100%了解.net 3.5的内容。而且我不确定它能否处理我计划使用的数据结构。真正的问题是,我能否得到任何关于如何获取用户的查询字符串,解析它并将其应用于数据结构(它具有比上述更多的属性),并获取返回的结果列表的反馈。我可以自己处理其余部分。
我已经准备好了,可以硬编码很多可能的查询,只需要将它们视为在某些参数下运行的报告,但如果有一种漂亮干净的方法来处理这种查询语法,我认为这将是一个非常酷的功能添加。