通过重复调用 API 端点而采取的限制操作 - ASP.NET Core 7

问题描述 投票:0回答:1

当我的数据库发生更改时,我有一个外部服务通知到达端点。这会从数据库中提取更新的数据,并通过 SignalR 将其发送到连接的客户端。

此服务可以在几秒钟内发送多个呼叫,但我只想响应最后一个呼叫。我想限制(不确定在这种情况下这是否是正确的词)对数据库的调用和对客户端的通知。这里重要的部分是我想在一个时间范围内响应最终请求,因为我不想错过发送给客户的任何更改。

这是我想避免的问题的示例。这是以死锁错误结束的 API 命中日志(我可以处理该问题,但希望完全避免整个情况)。

RefreshOrderNotifications received at Tue Oct 03 2023 09:34:19 GMT-0400 (Eastern Daylight Time)
RefreshOrderNotifications received at Tue Oct 03 2023 09:34:57 GMT-0400 (Eastern Daylight Time)
RefreshOrderNotifications received at Tue Oct 03 2023 09:34:57 GMT-0400 (Eastern Daylight Time)
RefreshOrderNotifications received at Tue Oct 03 2023 09:34:57 GMT-0400 (Eastern Daylight Time)
Server - Error: Notification Server connection to DB failed. Transaction (Process ID 68) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

我很难概念化如何解决这个问题。由于每个请求都在不同的线程上,因此我不太确定如何跨这些线程进行通信。在这种情况下,静态属性是否有用或明智?我不确定它是否跨线程共享。

如果有帮助的话,我可以忍受对 API 调用的响应有 1-3 秒的延迟。

根据评论添加澄清(所有好问题,谢谢)

  • 除了查询 SQL 服务器并通过 SignalR 发送通知之外,API 调用中没有需要处理的负载。
  • 在端点调用中,除了空的 200 OK 之外,调用者不会得到任何返回信息。呼叫者只是想启动通知。
  • 呼叫会向连接的客户端发送通知。
  • 我试图避免向客户端发送不必要的消息并点击数据库。我想简单地放弃第一个呼叫,然后为感知到的最后一个呼叫发送通知。
asp.net asp.net-core asp.net-web-api throttling
1个回答
0
投票

您可以创建一个包含单个 ConcurrentDictionary 的单例类。 “Key”是您想要“分组”的标准,例如

OrderId
UserId
,值应该是
Task

每当请求/线程击中你时

  • 尝试查看键值对是否存在
  • 如果Key存在,则等待对应的Task
  • 如果Key不存在,则创建Key-Value对并启动Task
  • 任务应使用 Task.Delay() 包含一小段等待时间
  • 任务在延迟后应该进行处理,并在完成时从 ConcurrentDictionary 中删除键值对
© www.soinside.com 2019 - 2024. All rights reserved.