轮询记录状态的替代方案
Alternative for Polling Record State
我们目前有一个使用 MS SQL Server Enterprise 的付款跟踪系统。当客户要求服务时,他必须在24小时内付款,否则我们会给他发短信提醒。我们目前的实施只是记录购买的日期和时间,并不断地轮询记录以找到 "expired" 次购买。
这在数据库上产生了如此多的负载,我们必须实施某种形式的复制,以便将这些操作卸载到另一台服务器。
我在想:有没有办法将 CLR 触发器与某种只触发一次的调度程序结合起来,即在购买创建后 24 小时内触发?
请记住,我们每小时有数万笔交易。
我不确定您认为 SQLCLR 将如何解决这个问题。我认为这根本不需要在数据库中处理。
既然请求时间不变,为什么不将所有请求加载到一个基于内存的存储中,这样你就可以不断地访问它。您将加载请求后 24 小时的时间,这样您只需将这些时间与现在进行比较。如果客户在 24 小时期限之前付款,则您从缓存中删除该条目。否则,轮询过程最终会找到它、处理它并将其从缓存中删除。
或者,类似地,您可以根据请求后的 24 小时时间,在每次请求时使用调度程序并将未来事件加载为 SMS 消息。类似于使用 "AT" 安排操作。同样,如果有人在此时间之前付款,只需删除预定的 task/event/reminder.
您将只存储 24 小时后时间和 RequestID
。如果到达时间,服务将使用 RequestID
返回数据库以获取当前信息。
如果在 24 小时后的时间之前付款,您只需要确保从缓存/调度程序中删除项目。
如果系统崩溃/重新启动,您只需加载所有 a) 未支付的条目,以及 b) 尚未达到其 24 小时后时间的条目。
我们目前有一个使用 MS SQL Server Enterprise 的付款跟踪系统。当客户要求服务时,他必须在24小时内付款,否则我们会给他发短信提醒。我们目前的实施只是记录购买的日期和时间,并不断地轮询记录以找到 "expired" 次购买。
这在数据库上产生了如此多的负载,我们必须实施某种形式的复制,以便将这些操作卸载到另一台服务器。
我在想:有没有办法将 CLR 触发器与某种只触发一次的调度程序结合起来,即在购买创建后 24 小时内触发?
请记住,我们每小时有数万笔交易。
我不确定您认为 SQLCLR 将如何解决这个问题。我认为这根本不需要在数据库中处理。
既然请求时间不变,为什么不将所有请求加载到一个基于内存的存储中,这样你就可以不断地访问它。您将加载请求后 24 小时的时间,这样您只需将这些时间与现在进行比较。如果客户在 24 小时期限之前付款,则您从缓存中删除该条目。否则,轮询过程最终会找到它、处理它并将其从缓存中删除。
或者,类似地,您可以根据请求后的 24 小时时间,在每次请求时使用调度程序并将未来事件加载为 SMS 消息。类似于使用 "AT" 安排操作。同样,如果有人在此时间之前付款,只需删除预定的 task/event/reminder.
您将只存储 24 小时后时间和 RequestID
。如果到达时间,服务将使用 RequestID
返回数据库以获取当前信息。
如果在 24 小时后的时间之前付款,您只需要确保从缓存/调度程序中删除项目。
如果系统崩溃/重新启动,您只需加载所有 a) 未支付的条目,以及 b) 尚未达到其 24 小时后时间的条目。