单片应用程序水平可扩展性(重复):如何处理数据库?

Posted

技术标签:

【中文标题】单片应用程序水平可扩展性(重复):如何处理数据库?【英文标题】:Monolithic Applications Horizontal Scalability (duplication) : how are database treated? 【发布时间】:2021-01-07 16:51:46 【问题描述】:

很抱歉这个模糊的问题,但它让我难以置信。 据我了解,单体应用程序可以通过两种方式扩展:垂直和水平。后者涉及通过添加更多副本来复制服务。我怀疑数据库在这种方法中的作用。

假设,例如,我有一个连接到数据库的应用程序 A。假设我复制了这个应用程序,并调用了复制的 A'。 A 和 A' 是否共享同一个数据库,从而使数据库有可能成为瓶颈,或者 A 和 A' 是否拥有自己的数据库,从而有必要实施某种机制来确保两个实例之间的数据一致性数据库?

【问题讨论】:

这需要进一步澄清,您使用的是什么类型的存储,您认为数据库可能成为瓶颈的负载类型? Mavi 我一般都在想,最终如果您多次复制应用程序,它将成为瓶颈。现在我不知道发生这种情况需要什么样的负载,但我猜它会。根据您的评论,我想说这两种方法都可能有利于使用相同数据库的应用程序? 如果你不为它设计,这种设计中的数据库将成为瓶颈。一个例子:如果您有 2 个节点运行同一个应用程序,一个来自美国,另一个来自欧盟,并且它们试图连接到位于其中一个位置的同一个数据库,那么您正在制造问题。在这种情况下,要求真的很重要。您永远不必自己实现数据一致性,几乎所有体面的存储系统都为您提供。您应该了解来自特定区域/实例的读取是否多于写入 - 如果一个故障转移就足够了等等...... 【参考方案1】:

有两种方法可以水平扩展数据库:

    使用提供内置水平缩放的数据库。例如:Cassandra、MongoD 等。 使用应用程序级逻辑将流量路由到适当的数据库服务器。您基本上采用一组用户并将他们划分到多个数据库服务器上。例如,您通常会有一个“元”数据库/表来存储客户端、数据库服务器/连接字符串等,以及一个存储客户端/服务器映射的表。应用程序登录/主屏幕将很常见,并将使用来自此“元”数据库的数据。一旦登录或一旦您获得有关用户的信息,只需将来自每个客户端的请求定向到它们映射到的数据库服务器。即您正在使用基于用户的动态连接字符串。 您可以决定使用其他一些标准来水平分区数据,而不是用户。

【讨论】:

以上是关于单片应用程序水平可扩展性(重复):如何处理数据库?的主要内容,如果未能解决你的问题,请参考以下文章

MQ——消息积压如何处理

STM32单片机如何处理QT上位机串口中发过来的数据?

如何处理 Alamofire 的异步特性 [重复]

Java - 如何处理 $param [重复]

Codeigniter:当我插入数据时出现重复键错误,我该如何处理这个错误?

Java:如何处理两个进程试图修改同一个文件[重复]