REST服务作为2000多个客户端计算机的应用程序服务器。这是个好主意吗?


11

我们将使用javaFx中的UI构建一个系统,该用户界面将部署到2000台以上的计算机(最低数量为2000,但将会更多-可以达到5000台计算机)。

由于其他原因/限制,必须将其安装在计算机上,因此我们无法使用Web浏览器界面进行操作。

2000多台计算机将位于不同的地理位置组。通常,连接是好的,但在更偏远的位置可能不是很好。

我正在考虑使用Spring + Spring Boot + Spring Data(java)构建REST服务集群,而不是直接访问数据库。

REST服务将接受并返回Json。

我认为这是个好主意,因为:

  • 该服务将充当数据库连接池(我认为数据库上的2000多个连接会引起问题);
  • 可能有一个将日志传送到其他只读数据库的数据库来服务某些查询;
  • 随着我们可以添加更多机器来运行REST服务,它将更好地扩展;
  • 出于安全性和带宽节省的原因,可以在压缩中使用HTTPS。
  • 无需重新部署2000多台计算机,就可以对业务实体进行一些集中式更改。
  • 它与其他系统更好地集成(只需将其指向REST服务)。

这真的是个好主意吗?

您可以分享一些正面或负面的经验吗?

谢谢。


1
我认为这是一个明智的主意,尤其是因为REST在设计时就考虑了缓存。您可以考虑使用websocket来减少来自非持久客户端连接的负载,但这取决于API的使用方式。当可以将大量的小型请求/请求事务复用到持久连接上时,WebSocket开始显示其优势。就是说,横向扩展可能更简单...
blz

8
数据库永远不能从公共互联网访问,并且永远位于防火墙之后–因此,通过REST API或类似方法屏蔽数据库是标准过程。这也使您可以更轻松地添加其他安全功能,例如,防止用户编辑他们无权查看或编辑的数据条目。
amon

Answers:


3

这是一个开放式的问题,有很多可能的答案,具体取决于您要执行的操作。不过,由于注释不够大,我将添加一些内容作为答案。

该服务将充当数据库连接池(我认为数据库上的2000多个连接会引起问题);

是的,那是个好主意。您可以保持打开的连接数量较少,并在请求到达服务时重用它们。但是您需要知道如何快速处理请求以及每个请求使用数据库的速度,否则在等待释放数据库连接时,很容易耗尽一个小池,并且其他请求将被阻塞。

缓存可以帮助那里,返回已经获取的数据(就像我说的那样,取决于您要执行的操作-如果查询是唯一的,则不能缓存太多)。

还要注意,池的大小将乘以您放置的服务数量。一些服务,您可以使用大型数据库池;更多的服务,并且您需要减小池的大小,以便总体上来说,您打开数据库的连接数相同。

可能有一个将日志传送到其他只读数据库的数据库来服务某些查询;

数据库很容易成为您的瓶颈。太多的连接和/或太多的查询,您可以中断它。到那时,将服务水平扩展到任意数量都没有关系。所有请求最终将到达同一数据库。

有多种保护它的方法:缓存我已经提到过(取决于您的用例),在其他服务器上复制一些信息以服务您提到的某些查询,CQRS(取决于您的用例),使用关系型与非关系型(再次取决于您的用例),等等。

请注意,尽管如此分配数据时,CAP定理开始适用。请注意这一点,因为您可能需要在一致性和可用性之间进行折衷。

随着我们可以添加更多机器来运行REST服务,它将更好地扩展;

是的,REST服务可以扩展,但是如上所述,如果您不保护数据库,则很容易成为瓶颈。

出于安全性和带宽节省的原因,可以在压缩中使用HTTPS。

是的,还有其他事情……也许您以后想要验证/授权,等等。

无需重新部署2000多台计算机,就可以对业务实体进行一些集中式更改。

是的,但是在一定程度上并不是所有的变化。如果进行重大更改,则也需要更新客户端。因此,请考虑将客户端更新到最新版本的策略,或者是否允许较旧的客户端仍然可以使用该应用程序。

它与其他系统更好地集成(只需将其指向REST服务)。

是的,但这意味着您可能无法控制的客户服务。

如果您进行了重大更改,并且您有一个很好的策略来更新2000+ JavaFX客户端,那么就没问题了。但是,如果存在其他客户端,并且您无法控制它们,则可能需要在REST服务上实现版本控制,并支持多个版本,直到每个人都可以更新到最新版本为止。

就像我说的,这取决于您要做什么。总的来说,你是一个好主意。但是请注意,仅仅因为您将REST服务放在数据库的前面,这些东西就不会免费提供。

只是我的2美分!


很好的答复。我只想向Thiago强调值得考虑尽快在RESTful API中进行版本控制。您可能不需要一开始就做,但是您应该意识到这一点并做好准备。
Daniel Hollinrake
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.