gpt4 book ai didi

sql-server - SQL Server 中可靠的异步处理

转载 作者:搜寻专家 更新时间:2023-10-30 20:28:43 25 4
gpt4 key购买 nike

部分服务由第 3 方提供给我们的客户。在其远程服务器上创建的数据被复制到本地 SQL 服务器。我需要在我无法直接访问数据库的第 3 方服务器上执行一些工作。他们为此公开了一组 API。该工作由 SQL Server 代理作业在链接的 SQL 服务器上执行。

业务场景:客户可以收到“徽章”。可以通过在第 3 方服务器上调用 UpdateCustomerBadgeInfo web 方法将徽章提供给客户。

因此,自动化任务的典型要求如下所示:

“找到白天登录次数超过 50 次的所有客户,给他们[has-no-life] 徽章并向他们发送短信通知”

算法将是:

- Select all the matching accounts into a #TempTable  
for each customer record:
- Call UpdateCustomerBadgeInfo() method (via CLR)
- If successfully updated badge info-> Enqueue SMS message (queue table)
- Log successful actions (so that the record will not be picked up next time)

它现在工作方式的最大问题是在 WHILE 循环中处理大型数据集需要花费大量时间。

因此,第 3 方提供商创建了一个解决方案来执行客户数据的批量更新。他们在本地 SQL 服务器上创建了一个表,将批量更新请求提交到该表,然后由他们的服务进行验证和处理。

问题是:

应该如何更改上述算法以适应这种异步模型?

最佳答案

只有在我正确理解情况的情况下,这个答案才有效:

  • 第 3 方服务器用于公开 web 方法来逐个更新客户
  • 现在他们希望从您可以使用的 SQL Server 表中获取此信息以进行 INSERT/UPDATE/DELETE
  • 您可以将与客户相关的请求填入此表,它们将在稍后处理
  • 当客户相关信息更新时,您必须执行一些额外的本地操作(排队 SMS、记录事件)

一般来说,我看不到算法有任何重大变化,但我会尝试解释在这种情况下我会做什么。

  1. 选择所有匹配的账户到#TempTable

    这可能不是必需的,因为您已经有了用于将您的请求填充到第 3 方表中的表。唯一的问题是同步请求,但要对此进行分析,您必须提供更多详细信息(允许同一客户的多个请求?是否保护重新发出同一请求?)

  2. 对于每个客户记录...

    这应该是您实现中的唯一变化。它现在的含义是 - 对于在第 3 方异步处理的每个客户记录。当然,您的第 3 方必须给您一些线索,表明他们确实处理了您的客户请求,否则您不知道该处理什么。因此,当他们验证和处理数据时,他们可以提供例如可为 null 的列“success_time”和“error_time”,让您了解已完成的内容和时间。如果成功,则继续处理。如果没有,您或许也可以为此做些事情。

    但是当你返回异步信息时如何 react (例如 sucess_time IS NOT NULL)?好吧,有多种方法可以做到这一点。就我个人而言,我尽量避免使用触发器,因为它们会使您的生活变得复杂(它们的可见性很差,可能导致复制问题,可能导致交易问题......)如果我真的需要一流的,我会使用它们立即响应。另一种可能性是使用带有自定义激活的异步队列,这意味着 Service Broker。然而,很多人避免使用 SB 技术——它与 SQL Server 的其余部分不同,它有其特殊性,调试不像普通的旧 SQL 语句那么容易等等。另一种可能性是在你这边批处理异步响应使用代理工作。既然你已经在使用一份工作,你应该没问题。基本上,该表应充当同步点 - 您填写请求 (INSERT),第 3 方处理它们 (SELECT)。处理请求后,他们将它们标记为(UPDATE success_time 或 error_time),最后您使用代理作业任务处理该响应(SELECT)。您的处理包括 SMS 消息和日志记录,甚至可能从 3rd 方表中删除。

    另外要提的是这里需要同步方法。首先,不要在没有事务的情况下做任何事情,否则您可能最终会处理虚幻响应和/或跳过有效的等待响应。其次,当您选择响应(在第 3 方处理的行)时,您可以使用 READPAST 提示(跳过锁定的内容)获得一些改进。但是,如果您需要在处理响应后从您的第 3 方表中更新/删除,您可以将 SELECT 与 UPDLOCK 一起使用,以使用 INSERT 和 UPDATE 之间的数据来阻止 temperig 的另一侧。 或者,如果您不完全确定所讨论的表发生了什么,则不使用任何锁定提示。

希望对您有所帮助。

关于sql-server - SQL Server 中可靠的异步处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com