当我的数据库发生更改时,我有一个外部服务通知到达端点。这会从数据库中提取更新的数据,并通过 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 秒的延迟。
根据评论添加澄清(所有好问题,谢谢)
您可以创建一个包含单个 ConcurrentDictionary 的单例类。 “Key”是您想要“分组”的标准,例如
OrderId
或 UserId
,值应该是 Task
每当请求/线程击中你时