问题描述
我有一个服务,每秒将数据发布到 web-server (asp.net core 3.1),我使用 EF Core 3.1 将数据存储到 sql server。 到现在为止,当我尝试存储新数据时,分别为每个新数据行:
然而,这在调用相当多的sql server上似乎有点“重”。它在 Azure 上运行,有时似乎数据库有一些问题,并且网络服务器开始返回 500(据我所知,内部服务器错误)。当有人调用 web 服务器上的另一个控制器并尝试从 sql 服务器检索一些数据(更大的块)时,有时会发生这种情况。 (这可能是另一个问题——关于 Azure sql 服务器的可靠性)
在网络服务器上保留一个缓冲区并一次性保存所有内容是否更好,例如:DBContext.AddRange(entities)
具有更粗略的时间分辨率(即每分钟)?我不知道如果一个或多个数据重复会发生什么?那些不是重复存储的还是所有插入都被拒绝? (我似乎找不到对此的解释)。
非常感谢您对此事的任何帮助。
编辑 2021-02-08: 我试着扩展一下情况:
超出我的控制范围:MQTT broker(发布消息)
在我的控制之下:
MQTT 客户端正在收集来自 mqtt 代理的不同传感器的消息并将其分组为可以(或多或少)直接存储在数据库中的格式。
asp.net 服务器充当 mqtt 客户端和 sql 数据库之间的中间人。但也不断向访问该网站的任何人发送“实时”更新。所以目前网络服务器有很多工作(也许问题出在这里??)
希望这有助于理解。
解决方法
我最终得到了一个带有 ConcurrentDictionary
的缓冲服务,我在我的 asp.net 控制器中使用了它。这样我就可以确保以受控方式在我的代码中处理重复项(根据接收到的数据的质量更新现有的或丢弃的)。每分钟我都会将最后几分钟的数据清空到数据库中,以便我始终保留一分钟的数据。额外奖励:我还可以通过缓冲服务更快地向访问者提供当前数据,而不是转到数据库。