我们有一个消息系统,其中一个模块以高速率向另一个远程模块发送一些消息。接收模块以特定格式对此消息进行解码,并将其转发到两个线程。一个称为记录器线程,另一个称为转发器线程。
在我们将这条消息发送给这些线程之前,我们需要对这些消息进行某种分组。
请注意,这些消息的速度很快,大约为每秒800。
警报结构如下:
在比赛结束时,我们需要维护一个具有以下细节的结构
struct{
INT COUNT
INT First Alert Timestamp
INT Last Alert Timestamp
INT First Alert ID
INT Last Alert ID
}
对于与8个标准相匹配的每个警报,将创建/挑选一个组,并且计数将与其他详细信息一起递增。
IP地址字段可以是5个字段的结构(INT地址类型,INT地址1,INT地址2,INT地址3和INT地址4),也可以转换为字符串然后存储在结构中。
我们一直在喋喋不休,但却无法找到结构或算法,因此可以解决内存和速度问题。
因此想到找专家寻求帮助。
答案 0 :(得分:0)
用于存储匹配的警报的双链表。使检索第一个和最后一个AlertID变得容易。您可能需要扩展双链表以获得计数字段。
根据您的性能要求,您可以从列表中对警报进行分组,并在标识符上添加哈希值。如果这还不够快,可以实现一个更复杂的树结构,按照标识字段进行分组。
我能提出的最好的建议是以最简单的方式让它工作,每秒800就是一无所获。如果您遇到性能问题,请进行优化。使用测试驱动开发编写类似的东西非常有趣,打败了你的普通crud代码!
答案 1 :(得分:0)
你打算怎么写这个?任何建议都将严重依赖于语言。
最好的方法是从Dictionary<string, ContainerObject>
开始,其中密钥由连接所需的参数组成,以便快速查找。继续使用此字典在内存中,同时您有另一个进程正确记录值来表示数据库或平面文件。
保持简单,800秒不应该是一个问题。然而,沟通手段将成为一个主要因素。这是本地还是远程?如果它是远程的并且来自单一来源,那么如果在个别请求中完成,那么你的复仇将会延迟。