我需要编写 ac# 应用程序来监控通过网络接收的不同数据包(xml 格式)。
每分钟可能会收到数万个数据包,每个数据包都需要进行检查以确定适当的操作。
该应用程序将监控建筑物中的工人运动和行动。
数据包类似于以下内容:
Movement
数据包:
<packet>
<datetime>12:01:25</datetime>
<usertag>ABC</usertag>
<movedir>IN</movedir>
<location>90</location>
...
</packet>
Action
数据包:
<packet>
<datetime>12:07:45</datetime>
<usertag>ABC</usertag>
<actionid>1</movedir>
.....
</packet>
应用程序需要:
- 执行预过滤以确保仅处理所需的数据包(不处理重复/不相关的数据包)
- 记录所有用户移动(在超时/下班时间/用户/位置)
- 记录所有动作和动作发生的位置(不是“动作”数据包的一部分,需要从当前位置确定)
- 用户离开某个位置时的附加处理,以确保他们在该位置执行正确的工作顺序(“操作”)并记录此信息
所有信息都需要记录在 SQL Server 数据库中以进行报告。
我的困境是如何以最有效的方式最好地实现上述目标。
由于将有大量数据需要处理和写入 SQL,我的计划是每 X 秒“排队”插入和批量插入(BulkCopy)。
我的想法...
用户线程 1 读取所有数据包(我应该读取内存,即
List<Packet>
写入 DAT 文件吗?)主线程处理上面的迭代集合
- 确定是移动还是动作包
如果运动添加到
List<Movement>
对于其中的每一个,我需要在数据库表上进行查找以将位置代码映射到 ID(我是否应该将此位置列表批量读取到字典中并每 X 秒刷新一次?)
- 如果操作添加到
List<Action>
其中的每一个,我需要对数据库表/内存对象(上图)进行查找,以查看用户当前在哪个位置记录此内容 - 当 Out Movement Complete 获取已执行的操作列表并应用规则(保存在 db 中)以确保执行所有工作
- 每 X 秒批量插入和刷新列表
我担心在整个过程中我将在内存中保存的信息量非常大。有人对我如何更有效地实现这一目标有任何建议吗?我想将业务逻辑保留在代码中而不是服务器上。
非常感谢!汤姆