- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
部分服务由第 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 服务器上创建了一个表,将批量更新请求提交到该表,然后由他们的服务进行验证和处理。
问题是:
应该如何更改上述算法以适应这种异步模型?
最佳答案
只有在我正确理解情况的情况下,这个答案才有效:
一般来说,我看不到算法有任何重大变化,但我会尝试解释在这种情况下我会做什么。
选择所有匹配的账户到#TempTable
这可能不是必需的,因为您已经有了用于将您的请求填充到第 3 方表中的表。唯一的问题是同步请求,但要对此进行分析,您必须提供更多详细信息(允许同一客户的多个请求?是否保护重新发出同一请求?)
对于每个客户记录...
这应该是您实现中的唯一变化。它现在的含义是 - 对于在第 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/
我正在尝试运行以下内容:: Press to see code - name: Snapshot BI nodes hosts: [CLUSTER-BI,CLUSTER-BI-REPL
在这里尝试心理重置:我尝试使用 MSMQ 创建一个可靠、持久的堆栈,但没有成功 所以更一般地说: 我有生产者(一个 web 服务,虽然“只有一个”,但也是多线程的)/消费者(多个进程,根据需要设置)。
试图为分布式系统找到一个商业日志框架。此框架必须允许远程服务器上的 .NET 应用程序记录可以在中央位置收集的消息。如果可能,中央位置应将消息存储在 SQL Server 数据库中。 要求: 能够在远
我正在开发 Restful 服务,我们将在数据库中插入/更新新记录。 由于REST使用HTTP进行通信,而HTTP并不可靠,我担心如果连接失败,请求可能无法发送到服务器。 我在 link 中找到的建议
我正在尝试实现一个页面,员工可以在其中登录并添加、修改、更新工作案例。 我有一个选择列表,其中包含从数据库加载的数据(员工姓名)。在这个数据库中,我有基本信息、用户名、ID、密码、电子邮件。 选择列表
我在 C 代码和 Python 代码之间(偶尔)得到略有不同的计算结果,并设法找到了一个例子。在 Python 中,我得到了这个: >>> print "%.55f" %\ ... (-2.49999
例如如果我将计时器设置为每天午夜到期,如果一个“失火”(例如,由于服务器关闭而不会触发回调)会发生什么?我在文档中找不到它。 有没有办法让这个定时器在服务器重启时立即触发回调? PS:我了解 Quar
我有一组不同长度的非零序列,我正在使用 Keras LSTM 对这些序列建模。我使用 Keras Tokenizer 进行分词(分词从 1 开始)。为了使序列具有相同的长度,我使用了填充。 填充示例:
我遇到了一个非常有趣的可靠 session 行为。我正在使用 netTcp 绑定(bind) + 双工 channel + 可靠 session 。 当我尝试在 channel.faulted 上收听
问题: 给定表 table_a 和 table_b,每当 table_a 更新时,我都需要可靠地(并发地)执行这样的操作: SELECT table_a 中的一些行。 在应用程序代码中计算一些内容。
我们目前的设计 环境 Redis 2.8.17 我们已经实现了我们的可靠队列,使用类似于 redis 文档中描述的模式的模式,在 RPOPLPUSH 下 但是,考虑到其阻塞性质,我们正在使用 BRPO
在我们的 WCF 应用程序中,我正在尝试配置可靠的 session 。 服务: 客户:
我使用这个 Delphi 7 代码来检测 Internet Explorer 是否正在运行: function IERunning: Boolean; begin Result := FindWi
我正在准备构建一个应用程序,该应用程序能够向 GPS 设备发送/接收航路点。通过一些谷歌搜索,我发现了很多可能对此目的有用的库: Java Chaeron GPS GPSLib4J Python Py
我有几个关于 WCF 可靠 session 可靠性的问题: WCF 是否在重试期间重新序列化消息? 2。如果 1 是正确的 - 它是否在消息参数被处理后发生? 3. 如果 2 是正确的 - 是否有任何
对于使用 $(this)[0].defaultValue 来确定文本框值是否已从原始值发生变化的一些反馈,我将不胜感激,例如 //keyUp event if($(this)[0].defaultVa
我正在开发一个具有以下特征的实时应用程序: 数百个客户端将同时插入行/文档,每个客户端每隔几秒插入一行。 大部分仅追加;几乎所有的行/文档,一旦插入,就永远不会改变。 只有当数据刷新到磁盘时,客户端才
场景:最终用户(不受信任的)提供了一个字符串,例如 "Hello, {name}!" .在服务器上,我想以 my_string.format(name="Homer") 的形式对该用户提供的字符串进行
我在推送通知方面遇到一些问题。我们使用 Firebase 来推送通知。问题是我可以在一台 iPhone 上正确接收 PushNotifications,但无法在另一台 iPhone 上接收它们。我在
从 python 到 c++,这是我能得到的最接近 python 的装饰器。 这个解决方案感觉有点像 hack,因为在要装饰的函数之后运行的代码在 Timer 析构函数中是隐式调用的。不过它确实有效。
我是一名优秀的程序员,十分优秀!