Concurrency 在执行数据库读写操作的应用程序中实现高并发性?

Concurrency 在执行数据库读写操作的应用程序中实现高并发性?,concurrency,architecture,software-design,Concurrency,Architecture,Software Design,我正在为一个应用程序设计一个中间层,该应用程序每几秒钟将收到多达5000个请求,并且需要从数据库中检索信息。我一直在考虑使用(我在RESTAPI设计中使用scala),因为他们说它是完全异步的,构建在Akka上。然而,任何解决方案的主要瓶颈似乎都发生在对数据库的读/写过程中。许多数据库无法支持从如此规模的数据库同时读/写。那么,对于这样的应用程序,如何实现如此高的并发性呢?我猜Facebook/Twitter/(其他大公司的名字)可能已经在他们的应用程序中实现了这一点,因为数百万人可能同时使用它

我正在为一个应用程序设计一个中间层,该应用程序每几秒钟将收到多达5000个请求,并且需要从数据库中检索信息。我一直在考虑使用(我在RESTAPI设计中使用scala),因为他们说它是完全异步的,构建在Akka上。然而,任何解决方案的主要瓶颈似乎都发生在对数据库的读/写过程中。许多数据库无法支持从如此规模的数据库同时读/写。那么,对于这样的应用程序,如何实现如此高的并发性呢?我猜Facebook/Twitter/(其他大公司的名字)可能已经在他们的应用程序中实现了这一点,因为数百万人可能同时使用它们

正如Tim的评论所说,缓存可能对您的情况有帮助,也可能没有帮助。如果不是,我还建议您研究水平可伸缩的数据库,例如,如果您想要事务性SQL db。否则,就有很多没有sql的选择,如la等。如果你真的想坚持使用传统的sql系统,你必须垂直扩展你的服务器(购买最昂贵的硬件)并使用它。

一个巨大的组件是你的数据模型和查询访问模式。如果每个查询都增加一个必须同步的共享计数器,那么会有大量的争用,但是如果每个查询都是另一端完全独立的数据,那么频谱上的争用就会少很多

我认为我会考虑以下几个方面:

数据模式和访问模式(上文讨论)

语言选择 这一点很重要,因为如果您处于web服务器上下文中,并且在默认情况下使用prefork,则每个进程都可能有自己的数据库连接。在python或ruby这样的环境中,您可能需要数百个进程来处理负载。与akka或其他基于异步网络的运行时(node、python gevent/asyncio、go等)相比,在akka或其他基于异步网络的运行时中,具有小线程池的单个实例可以处理大量请求。每个人都有自己的权衡

分布式系统

根据您的数据模式和访问模式,每秒向RDBMS发送5000个请求是完全可以实现的。这可能需要相对坚固的硬件,但我个人已经做了很多次了。要达到更大的规模,需要更多的计算机来分配工作/负载。如果您的工作负载非常繁重,并且您可以支持可能过时的读取,那么a是一种选择。在混合中使用另一台机器时,读操作分布在两台机器上,但写操作仍然指向一台机器(先导)。缓存是另一种选择

在更高的工作负载下,需要进行某种分区,以克服单机的限制

许多大型竞争者都有水平扩展数据库的解决方案。这也有许多缺点,需要仔细规划



我建议的一件事是,如果在不久的将来预计每秒有5000个请求,那么从所需的最少硬件(单实例)开始,查询模式和操作在分布式数据库中会变得指数级地复杂。

好吧,您可以考虑在数据库上使用某种缓存,这可能有助于读取和/或写入。说到这里,你想要的数据库是什么?比如MySQL或AWS Aurora。