在不暴露后端的情况下在前端和后端站点之间进行有效通信

时间:2016-06-08 12:22:20

标签: php ajax database rest architecture

我试图弄清楚当前的方法是否会引导我进入未来的性能问题,然后再进一步开发此设计,以及是否有更好的方法来实现这一目标。如果我首先提供一些关于设计的背景,我认为这是最有意义的:

当前设计

我目前的环境设计有两个独立的服务器,让我们称它们为前端和后端。

  1. 前端

    此服务器向全世界开放。客户访问此网站以查看我们的产品,进行购买,并且很快就能查看他们的帐户相关信息。

  2. 后端

    此服务器是所有信息保存在数据库中的地方。

  3. 通信

    前端当前需要访问后端的唯一方法是用户使用其许可证进行身份验证并下载我们的产品。为此,前端调用PHP脚本,该脚本通过curl_exec向后端服务器发送JSON请求。来自后端的响应告诉前端如何处理该下载请求(例如许可证无效)。

    推理

    此设计的原因是避免将后端详细信息暴露给用户。客户端,所有用户看到的是发送到前端服务器的请求。如果前端服务器遭到破坏,任何阅读前端如何构建的人都无法访问后端数据库,除非他们确切知道要发送到后端API的参数。即使这样,它也只能访问非常低的信息子集,具体取决于API公开的内容。

    问题

    此跨服务器通信现在唯一发生的时间是用户尝试使用其许可证详细信息下载我们的产品。相对而言,两台服务器之间通过此API的流量相对较低。

    我担心的是我想建立一个用户控制面板"。从这里,他们可以使用他们的许可证/帐户登录,他们可以查看他们的活动许可证,访问他们以前订单的详细信息等。这已经意味着所有这些信息只能通过后端获得,所以我会这样做需要通过API公开它们 - 这很好。这里的问题是用户通过控制面板发出的每个请求(甚至只是刷新页面)都会在两个服务器之间产生大量流量。

    问题

    从开发人员的经验来看,这种通信设计是否具有可扩展性?我担心我正在构建一个瓶颈,这只会导致用户界面变慢,因为前端最终会等待它通过后端传递的大量请求。

    你有什么想法?有没有人面临类似的挑战?你是如何克服这一挑战的?达到这种要求的最佳做法是什么?我希望这个问题不会太模糊。

2 个答案:

答案 0 :(得分:1)

我很乐意听到其他答案,但我会分享我的想法。

首先,让我们给您的服务器打电话:

  1. Application Server
  2. 数据库服务器
  3. 由于数据库查询量的增加,您似乎担心会产生瓶颈。由于您提到这些查询将在页面刷新后执行,因此很明显您没有使用任何类型的缓存。如果您可以缓存数据库查询并仅在数据已更改时使缓存无效(即用户的操作导致数据发生更改,因此应清除缓存),那么您将大幅提高性能。

    如果有人获得对您的应用程序服务器的访问权限,他们很可能能够与您允许应用程序服务器使用的用户访问数据库服务器。您应该为此用户提供使用API​​所需的少量权限。尽管如此,他们仍然可以访问很多,具体取决于您的API允许以及您在应用程序服务器上缓存的内容。

    查看Laravel's cache API,它允许您使用缓存代替数据库查询。如果缓存不存在,则将执行并缓存数据库查询。然后,您将根据用户操作删除必要的缓存。您还可以异步重新缓存数据库请求,这样如果该响应不需要数据,则不会阻止对客户端的响应。

    我希望这会有所帮助。

    <强>更新

    在与您进一步讨论后,我更了解您的困境。您正在尝试通过要求所有API调用在POST请求之后执行额外的步骤来提高应用程序的安全性。我同意这将成为一个瓶颈,因为应用程序可以扩展,因为您无法利用缓存,每个页面请求都会导致数据库查询。

    我在类似情况下所做的是将应用程序服务器和数据库服务器分开,除了数据库服务器实际上只是一个没有任何逻辑/脚本的数据库服务器。例如,PHP甚至没有安装在数据库服务器上。数据库服务器和应用程序服务器仅通过专用网络连接,因此只能通过应用程序服务器访问数据库服务器。已设置安全用户以使用远程数据库。

    由于我的数据库查询需要花费大量时间,因此我尽可能地进行缓存。

    还要考虑使用https://cloudflare.com它是应用程序服务器的反向代理,它在客户端(浏览器)和应用程序服务器之间添加另一个层。这样,只有cloudflare可以访问您的应用程序服务器,并且只有您的应用程序服务器可以通过您创建的安全数据库用户访问您的数据库服务器。

答案 1 :(得分:0)

我不是数据库方面的专家,而是使用prepared statements 会帮助你很多,因为它更安全,最好的部分是..

“绑定参数可以最大限度地减少服务器的带宽,因为您每次只需要发送参数,而不是整个查询”

希望它有所帮助!