【问题标题】:Does Asynchronous processing actually help if in case we have database calls into it?如果我们有数据库调用,异步处理真的有帮助吗?
【发布时间】:2012-01-20 22:31:29
【问题描述】:

在服务器中,如果我有一个异步函数,它将处理一些数据库调用并从表中获取一些记录。如果服务器接收到大量请求,则该数据库调用实际上可能会阻塞,并且我们实际上并没有异步工作。

  1. 当我们在服务器进程中有一些数据库调用时,异步方法有帮助吗?

  2. 如果没有,这些方法会出现什么问题?

我不想将它定制到特定的数据库,因为那样我的问题就会偏离。我只想在这里围绕异步编程范式展开。如果对数据库获取操作的一些优化方式有建议,那么欢迎。我只想知道一开始的正常抓取。

【问题讨论】:

  • 您使用的是什么类型的数据库。如果它是 SQL Server,并且您正在执行大量 SELECTS,例如,您是否在语句中使用了“with NO LOCKS”关键字
  • NO LOCKS 在修改的情况下是非常需要的,但在我解释的情况下只会有很多选择。

标签: c# asynchronous


【解决方案1】:

在负载下的并发应用程序中,异步方法调用可以提高性能和吞吐量,因为调用线程被腾出去做其他工作。

在某些极端情况下它无济于事,但如果您的应用程序花费大量时间来做除了等待来自数据库的数据之外的任何事情,您应该会看到一些好处。这些好处适用于服务器端和 GUI 应用程序。

例如,如果您的应用程序花费 300 毫秒等待数据,并花费 300 毫秒处理数据,并且您正在处理大量同时请求,那么您可能会通过使用异步调用使吞吐量翻倍,因为每个请求数据的线程都将被释放立即启动,然后可以处理先前请求返回的数据。

在实践中您很少会看到这种程度的改进,因为请求不会以均匀的间隔到达,而且通常不会每个请求都需要相同的工作量。不过差异应该很明显。

但是,如果您花 300 毫秒等待数据,而只花 10 毫秒处理数据,您将看不到任何改进。

在 ASP.Net 等环境中,这一点非常重要,因为可用于处理所有传入 Web 请求的线程数量有限:如果所有线程都在数据库服务器上等待,则不会提供任何页面。

在 Windows 窗体应用程序中,使用异步调用来获取数据允许 UI 在获取数据时保持响应,让您可以让用户在他们厌倦等待时选择取消。

明显的缺点是它使调用代码变得更加复杂。

【讨论】:

  • 基本上,您是说异步仅在 GUI 应用程序向用户显示某些内容而不是在服务器端处理的情况下有帮助。我想看看如何在我提到的场景中最好地利用它。
  • 我提供了两个异步可以帮助的例子,但它们不是唯一的。我已经扩展了我的答案,以解释异步如何帮助提高应用程序的性能和吞吐量。
【解决方案2】:

这里有两个潜在问题,第一个可以通过使用异步方法解决,第二个只能通过调整数据库来解决。

使用异步方法将允许您的客户端在等待您的服务器时执行其他处理,即在 UI 的情况下保持响应。

数据库锁定问题只能通过分析负载下的数据库以查看哪些表被锁定以及哪些存储过程或进程导致锁定来解决。

如果您确实需要大量请求,您可能需要研究内存缓存或其他优化。

【讨论】:

  • 这纯粹是服务器端,没有 UI 元素。该思维过程基于服务器接收数百万个请求并对其进行处理。万一,如果服务器有几个数据库调用并且在这种方法的情况下异步有帮助?
【解决方案3】:

在您描述的情况下,使用异步调用肯定会帮助您提高吞吐量。如果您还有其他工作需要调用线程执行。例如,如果线程 1 处理对服务器的请求并进行数据库调用,即使您使用 .BeginInvoke(res) 后紧跟 .EndInvoke(res),您仍然会阻止该调用。

要正确扩展,您需要确保线程 1 有其他工作要做,也许准备另一个页面请求,直到它的数据库调用完成。这可以通过使用共享工作队列或像管道模式这样的顺序队列来完成。查看此问题中的一些链接,了解有关异步设计模式的更多详细信息,以及它们如何帮助您从服务器中获得更好的吞吐量。

设计模式[1]:Resources about Asynchronous Programming Design Patterns

【讨论】:

    【解决方案4】:

    为了简短回答:

    当您有数据库调用时,使用异步处理尤其是有帮助。

    在服务器应用程序中,您应该避免阻塞线程。如果在典型请求中您的服务器访问数据库,那么如果您同步执行此操作,则意味着您的线程大部分时间都被阻塞等待 IO。当有足够多的线程被阻塞时,这将在您的服务器上引入瓶颈并损害可伸缩性,因为没有线程池线程可用于处理新请求,此外,您的 CPU 可能会因为没有线程可用而未得到充分利用工作要做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多