通过在智能数据库代理中定义逻辑,可以更改数据库系统的行为而无需更改客户端或服务器。

智能数据库代理对于很多人来说可能并不熟悉,这很可惜,因为它们可以优雅地解决许多难题。本文介绍了它们是什么,它们做什么以及何时有用。

快速比较

让我从一个看似无关的主题开始:网页。忍受我,一切都在一分钟内完成。

当您在浏览器中打开网页时,您看到的页面可能与所讨论的站点发送的页面不一定完全相同。在您的浏览器(客户端)和网站(服务器)之间,可能有任意数量的系统,它们在传输页面时会对其进行查看,并有可能阻止,修改,删除或插入内容。我们将这些系统称为智能代理:代理是因为它们可以传输流量,而代理则是智能的,因为它们可以根据某种逻辑来潜在地更改该流量。

什么是智能数据库代理?_数据库

其中一些代理可能只是对记录您的活动感兴趣。例如,也许您的ISP只想记录您的浏览习惯并出售该信息。

这些代理中的一些可能会阻止他们认为不安全或不受欢迎的内容或代码-大多数公司网络会阻止色情内容和其他不当内容。

其中一些代理可以通过插入广告,对其进行自定义或添加跟踪代码来修改您正在访问的页面。 

加密不一定能阻止这种情况,因为大多数公司网络都要求您将它们识别为证书颁发机构。因此,他们可以将自己作为(意图明确的)中间人插入并完全访问您所做的一切。

关键是,您在浏览器中看到的网页可能由于多种原因而被修改了,但是大多数人没有意识到-它对他们是透明的。

相同的原理可以应用于通过网络传输的任何结构化数据,包括数据库流量。一个聪明的数据库代理是在一个数据库中的前面坐在一个专门的代理,收到用于数据库的请求,可能会修改这些请求,并将其转发到数据库。然后,数据库用一些数据进行响应,代理再次检查该数据,并在将其转发回客户端之前进行可能的更改。
什么是智能数据库代理?_数据库_02


你为什么想这么做?

出于相同的原因,您可以使用任何类型的代理:control。在数据库的前面拥有智能代理意味着您突然有能力更改数据库客户端的行为方式(通过更改发送给服务器的请求的方式)以及更改数据库服务器的行为方式(通过更改返回客户的方式上的响应)。

由于智能代理在有线协议级别运行,因此您可以更改现有系统的工作方式,而无需修改客户端或服务器。这是智能代理的关键价值:只需很少或不做任何更改即可将其添加到现有系统中。

如果您从未使用过智能数据库代理,这似乎有点怪异,甚至隐约偷偷摸摸,但是在现有系统中安装智能代理将为您带来新的超能力:您可以突然使现有系统的行为有所不同,很少的努力。

两个简单的例子

这听起来似乎有点抽象,但实际上归结为一些非常具体的动作。让我们举两个例子。

变更要求

假设您有一个应用程序会发出查询,结果证明该查询不必要地昂贵。如果您没有源代码,则更改应用程序可能不是一个选择,否则可能会花费很长时间。在这里,智能代理是一个简单的解决方案,因为它可以轻松地在进入数据库的过程中查找有问题的查询:

​select * from customers where country in ('MX', 'US', 'CA')​

并对其进行修改以使其更便宜:

​select * from customers where country in ('MX', 'US', 'CA') limit 50

这是一个简单的示例,但您明白了这一点:客户端发出的请求可以在代理到达数据库之前根据您在代理中定义的逻辑动态更改。

当然,修改后的查询必须与客户端发出的原始查询兼容,但是只要牢记这一点,就可以进行一些巧妙的转换和优化,并且不费吹灰之力就能解决许多类型的问题。

改变回应

另一个示例:捷克共和国刚刚将其名称更改为Czechia,因此我们需要更新数据库以反映这一点。不幸的是,我们有一些旧的应用程序无法适应此更改,因此不能选择更新这些应用程序。我们可以做什么?

这是智能代理的另一种直接的应用程序:我们可以对其进行设置,以便对于有问题的应用程序(仅针对那些应用程序),代理将在结果集中将“捷克语”转换为结果集中的“捷克共和国”回到客户。它可以像定义一个过滤器一样简单:


if (context.row.country === 'Czechia') {

context.row.country = 'Czech Republic';

}


现在,这些应用程序可以继续正常运行,而无需更新它们或破坏数据库。请注意,您将需要对请求进行反向转换。

多种用途

到现在为止,应该清楚的是,只要使用数据库,智能数据库代理就可以改变游戏规则。可能的情况包括:

逻辑执行

由于智能代理可以深度访问数据库中的所有流量,因此它们可以为所有客户端强制执行逻辑,无论它们是如何编写的。是否想确保联邦合同永远不会被删除?还是说出价符合某些条件?可以通过智能数据库代理为所有客户端定义和实施这种细粒度的逻辑。

旧版应用

每个大型组织都有一个应用程序组合,其中许多几乎没有维护,或者不再维护。智能代理可以更改这些应用程序的工作方式,而无需实际更改应用程序或数据库。这不是万能的-代理只能更改应用程序与数据库的交互-但是当它到位时,它可以挽救生命,并以最小的成本延长应用程序的生命周期。

细粒度的访问控制

智能代理可以基于多种因素来更改,限制或拒绝对某些数据的访问:访问行为,一天中的时间,原始点,数据类型等。 

安全性是一个拥挤的领域:有许多解决安全性各个方面的现成产品,如果这些产品能够满足您的需求,那么它们可能是正确的解决方案。智能代理是一种更通用的工具,可以在您需要使用现成的解决方案无法完成的工作时介入。

监控方式

有许多用于监视数据库的解决方案,但是它们往往相对不灵活。智能代理使您可以完全访问进出数据库的所有内容。当您需要执行现成的解决方案无法解决的问题时,智能代理可以快速便捷地完成您需要的事情。也许您想根据某人访问的数据量来限制某人,或者您想要记录某些交互以进行审核。智能代理的这一瑞士军刀方面使它们对于即席解决方案具有吸引力。

外在化逻辑

新的应用程序也可以从智能数据库代理中受益。一旦开始考虑将数据视为潜在的动态实体,您可能会意识到某些逻辑可能不属于应用程序,而是应该被外部化到智能代理中。这使更改此逻辑,在部署时甚至有时在运行时自定义它变得更加容易。

这里有太多可能的用途:合并来自多个系统的数据,为安全性屏蔽数据,动态生成数据以进行测试,增加等待时间以模拟远程访问,透明地加密/解密数据,引入随机故障以进行压力测试您的系统从运行中的现有数据中获取合成数据,列表是无止境的。

所有这些用途都可以概括为一个词:indirection。破解数据库客户端和数据库服务器之间的管道,注入一些逻辑,然后您将创造无限的可能性。智能数据库代理是解决许多其他问题很难解决的优雅解决方案。

表现如何?

根据定义,代理是数据库客户端和数据库服务器之间的额外跃点,通常会增加明显的数据库响应时间。在大多数情况下,这不是问题:大多数应用程序的响应时间可以适当增加,而不会出现明显的差异。代理可能能够缓存或优化请求,以弥补不足。

使用简单的负载均衡器,代理通常可以很好地扩展,因此可伸缩性通常不是问题。

请注意,如果您需要执行到目前为止已概述的工作,则无论如何都必须使用任何解决方案来产生可比的成本。

但这不是真实的数据!

访问数据库中的数据时,您会得到一个直接的答案。数据库通常是记录的来源:如果数据库是这样说的,那么事实就是这样。

这就是为什么智能数据库代理的概念可能会让某些人感到不安的原因。突然,当通过智能代理访问数据库时,您不再知道所获取的数据实际上是数据库中的内容,还是由代理以某种方式对其进行了更改或限制(甚至创建)。

实际上,这很重要:代理成为整个系统的一部分,并且数据库客户端不应该(通常)担心代理所修改的数据是否已被它们修改,这只是他们需要查看的数据。但是如果需要,代理可以在响应中添加某种标记,以使客户端知道响应已被修改。

而且,当然,您始终可以(如果获得授权)绕过代理并直接访问数据库。

一种心态

是否需要智能数据库代理取决于许多因素,每种因素都取决于您的情况。在这个简短的介绍中,我试图传达的是,智能代理打开了新的选项,并允许您执行其他几乎不可能完成的任务。它使您可以以不同的方式考虑您的系统。即使您最终没有使用智能代理,将其作为可能的选择也可以使您成为更好的系统架构师。