- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在开发一个 Multi-Tenancy 应用程序。在架构方面,我们设计了共享中间层用于业务逻辑,每个租户一个数据库用于数据持久化。也就是说,业务层将为每个租户与数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计大约有 5000 个租户,那么该解决方案需要高资源利用率(每个租户的应用程序服务器和数据库服务器之间的连接),这会导致性能问题。
我们通过保留公共(public)连接池解决了这个问题。为了跨不同数据库维护单个连接池,我们创建了一个名为“App-master”的新数据库。现在,我们总是首先连接到“App-master”数据库,然后将数据库更改为租户特定数据库。这解决了我们的连接池问题。
该解决方案与本地数据库服务器完美配合。但它不适用于 Azure Sql,因为它不支持更改数据库。
提前感谢建议如何维护连接池或更好的方法/最佳实践来处理这种 Multi-Tenancy 场景。
最佳答案
我之前在使用单独数据库的多个租赁方案中遇到过这个问题。有两个重叠的问题;每个租户的 Web 服务器数量以及租户总数。第一个是更大的问题 - 如果您通过 ADO.net 连接池缓存数据库连接,那么任何特定客户连接进入与其数据库有开放连接的 Web 服务器的可能性与您的 Web 服务器数量成反比。有。扩展得越多,任何给定客户就越会注意到每次调用(而不是初始登录)延迟,因为 Web 服务器代表他们与数据库进行初始连接。对非粘性、高度扩展的 Web 服务器层进行的每次调用找到可重用的现有开放数据库连接的可能性将会降低。
第二个问题只是池中存在如此多的连接,以及这可能会造成内存压力或性能不佳的问题之一。
您可以通过建立有限数量的数据库应用程序服务器(简单的 WCF 端点)来“解决”第一个问题,这些服务器代表您的 Web 服务器执行数据库通信。每个 WCF 数据库应用程序服务器都提供已知的客户连接池(东部区域转到服务器 A,西部区域转到服务器 B),这意味着任何给定请求的连接池命中的可能性非常高。这还允许您单独扩展对数据库的访问以访问 HTML 渲染 Web 服务器(数据库是您最关键的性能瓶颈,因此这可能不是一件坏事)。
第二种解决方案是通过 NLB 路由器使用内容特定路由。这些基于内容路由流量,并允许您按客户分组(西部地区、东部地区等)对 Web 服务器层进行分割,因此每组 Web 服务器的事件连接数量要少得多,获得的可能性相应增加一个打开且未使用的连接。
这两个问题通常都是缓存问题,作为完全“不粘”的架构横向扩展得越多,任何调用命中缓存数据的可能性就越小 - 无论是缓存的数据库连接还是读取缓存的数据。管理用户连接以实现缓存命中的最大可能性对于保持高性能非常有用。
关于c# - Multi-Tenancy : Individual database per tenant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25369077/
我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。 我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。当我们对模型进行更改(添加属性)时,
我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。 我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。当我们对模型进行更改(添加属性)时,
我希望将一些信息分发到不同的机器上,以便在没有任何网络开销的情况下实现高效和极快的访问。数据存在于关系模式中,实体之间的关系是“加入”的要求,但根本不是写入数据库的要求(它会离线生成)。 我非常相信
我使用 GrapheneDB 来托管我的 neo4j 数据库 (db)。 问题 我有 N客户并且正在寻找自动分离他们的内容(他们独特的数据库)的方法,以便: 它不重叠数据 操作速度不受影响。 选项 1
当服务器开始工作(Tomcat)时,日志显示此错误: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid b
我在 Oracle 数据库实例中按以下方式创建了一个触发器。 CREATE OR REPLACE TRIGGER after_logon_on_database AFTER LOGON ON DATA
原谅我的无知,我是数据库约定的初学者。 这是我的 SQLite 代码:(由我的数据库浏览器自动生成) CREATE TABLE `ResearchItems` ( `ID` INTEGER NO
是的是的是的,我已经在整个互联网上搜索过这个问题。一些结果发现,甚至来自 Stackoverflow。但是他们中的大多数人说“你应该自动加载数据库”,或者“parent::__construct();
我正在创建一个 Mac 应用程序,它将一些数据保存到 SQLite 数据库中。问题是:当我关闭数据库并再次打开时,数据不存在了。这是我的代码: NSString *sql = [NSString st
我正在建立一个网站,我打算发布各种帖子,比如教程、文章等。我打算用 php 来管理它,但是当涉及到存储每个帖子的内容时,将要显示的文本,更好的选择是:使用单独的文本文件还是将其添加为数据库中的每个条目
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
对不起,这个关键字对我来说没有任何意义...有人可以给我一个定义吗? 提前致谢... 最佳答案 这是一个品牌。 http://pervasive.com/这是他们的数据库产品的链接 http://ww
我已经在 docker 版本 1.10.1 的 docker 镜像中安装了 PostgreSQL 9.4.6。根据这张官方图片: https://github.com/docker-library/p
当我的 android 应用程序尝试读取 android 短信数据库时,我遇到了这个崩溃。读取android短信数据库的代码类似于下面的代码 fragment : String SMS_URI = "
我有一个 public kit repo,我推送了 v1.0.3 并具有以下结构 go -database --database.go --go.mod --go.sum 我需要它 require g
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我们正在使用MySQL数据库在Go中创建一个Web应用程序。我们的用户一次只能拥有一个活跃的客户端。就像Spotify一样,您一次只能在一台设备上听音乐。为此,我制作了一个映射,将用户ID和作为其值的
我已经尝试在 PostgreSQL 中创建数据库好几天了,遇到了几个问题,但似乎卡住了。 我在 PostgreSQL 中手动创建了一个名为 postgres_development 的数据库,因为 b
我正在创建一个 iMessage 应用程序,它需要连接到与我的常规应用程序相同的数据库。 我调用 FirebaseApp.configure() 并对用户进行身份验证,但出于某种原因,在所有 Data
就像std::unordered_map但所有数据都应存储在磁盘上而不是内存中。 按照我的理解,应该做两部分:索引和存储。我已经学习了一些关于索引的数据结构,比如 Linear-Hash 或 B-Tr
我是一名优秀的程序员,十分优秀!