2

我需要编写 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 秒批量插入和刷新列表

我担心在整个过程中我将在内存中保存的信息量非常大。有人对我如何更有效地实现这一目标有任何建议吗?我想将业务逻辑保留在代码中而不是服务器上。

非常感谢!汤姆

4

0 回答 0