0

我有一项服务,它每秒将数据发布到网络服务器(asp.net core 3.1),我使用 EF Core 3.1 存储到 sql 服务器。到目前为止,我在尝试存储新数据时分别为每个新数据行:

  1. 检查数据库中是否存在数据实体(实体类型.IsUnique()在方法中配置了索引OnModelCreating()
  2. 如果不存在 - 添加单个实体
  3. DBContext.SaveChanges()

但是,这在 sql server 上似乎有点“重”,有很多调用。它在 Azure 上运行,有时似乎数据库出现了一些问题,并且 Web 服务器开始返回 500(据我了解,内部服务器错误)。当有人调用 web 服务器上的另一个控制器并尝试从 sql 服务器检索一些数据(更大的块)时,有时会发生这种情况。(这可能是另一个问题 - 关于 Azure SQL 服务器的可靠性)

在网络服务器上保留一个缓冲区并一次性保存所有内容是否更好,例如:DBContext.AddRange(entities)使用更粗略的时间分辨率(即每分钟)?我不知道如果一个或多个数据重复会发生什么?那些不是重复存储的还是所有插入都被拒绝?(我似乎找不到对此的解释)。

非常感谢您对此事的任何帮助。

编辑 2021-02-08:我尝试扩展一下情况:

我无法控制:MQTT Broker(发布消息)


在我的控制下:

  • MQTT 客户端(目前为 azure webjob),订阅 MQTT Broker
  • ASP.NET 服务器
  • SQL 数据库

MQTT 客户端正在从 mqtt 代理收集来自不同传感器的消息并将其分组为一种(或多或少)可以直接存储在数据库中的格式。

asp.net 服务器充当 mqtt 客户端和 sql 数据库之间的中间人。BUT 还向访问该网站的任何人持续发送“实时”更新。所以目前网络服务器有很多工作(也许问题出现在这里??)

  • 从 MQTT 服务接收数据
  • 将数据存储到数据库/从数据库中检索数据
  • 为访问者提供来自 MQTT 客户端的“实时”数据以及来自数据库的历史数据

希望这有助于理解。

4

1 回答 1

0

我最终得到了一个缓冲服务ConcurrentDictionary,我在我的 asp.net 控制器中使用了它。这样,我可以确保在我的代码中以受控方式处理重复项(根据接收数据的质量更新现有或丢弃)。每分钟我都会将最后几分钟的数据清空到数据库中,以便我始终保留一分钟的数据。奖励:我还可以从缓冲服务更快地向访问者提供当前数据,而不是进入数据库。

于 2021-02-06T08:14:12.590 回答