distributed-system - 为什么要将应用服务器拆分为读写服务器?
问题描述
我正在准备系统设计面试,在查看示例时,我看到类似这样的句子:“因为写操作需要大量时间来处理,这会使服务器端口保持忙碌,我们应该将我们的应用服务器拆分为读写节点。这应该提高我们系统的性能”。我无法接受这个决定。 这是最终的架构
我们有一个 Web 服务器,它将请求重定向到写入或读取节点。它仍然在等待写入节点处理请求,因此端口很忙。所以这意味着我们应该有单独的网络服务器来读写。因此我们需要两个域名:app.com和write-app.com。子域由与处理对主域的请求相同的服务器处理。所以引入一个像write.app.com这样的子域不是一种选择。对于这个解决方案,我们需要购买一个额外的域,设置一个 DNS 负载平衡器,一组 Web 服务器,在不同的节点上维护两个相关的功能(读/写)。在同一个节点上保留一个读/写 API 似乎更简单,但有更多的 Web 服务器和更多可用的实例。这样系统将不那么复杂。
当将读取和写入 API 拆分到不同节点有意义时:
- 更高效地处理写入请求的机器。它具有更强大(更昂贵)的 CPU,可以在写入操作受 CPU 限制而不是 IO 限制的情况下进行更快的计算。读取节点功能不那么强大(更便宜),但足以从数据库中查询数据、执行表示逻辑并发回 HTML。
- 写操作非常耗费资源:占用大量内存、占用 CPU 时间、大量访问磁盘。所以这台服务器上的所有读取请求都会降级。
- 我们的软件仅针对一定数量的节点获得许可,因此我们将使用该软件的机器隔离到单独的节点中。
您将应用服务器拆分为读写服务器的原因是什么?
解决方案
分离为读取和写入 api 允许我们以独立的速率扩展我们的读取基础设施和写入基础设施。
对于读取繁重的系统,我们希望能够设置 100 倍于读取的基础设施,就像我们为写入所做的那样。将 api 分开允许它们在单独的实例中运行并单独扩展。
关于购买额外的域名。这在技术上是不必要的。例如:单个域可以指向可以根据 URI 路由到正确 api 实例的 apigw 或负载均衡器。例如:
app.com/write -> 编写 api
app.com/read -> 读取 api
推荐阅读
- java - 正确的 lambda 过滤器实现
- python-3.x - 如何截取行数据的一部分并在 Python 中只保留前 3 位数字
- postgresql - "\unset ON_ERROR_STOP" 命令在 postgreSQL 中做了什么
- amazon-web-services - AWS 在 S3 存储桶中找到最大文件大小
- python - Keras 拟合 LSTM 在循环中变慢
- php - 如何使用带有多个复选框的 SELECT(sql)?
- sql - Postgres DISTINCT 到单行
- scala - 生产中 kafka-streams 拓扑的演变
- push-notification - 网络推送通知
- excel - 将 excel 映射到 XML - 导入 XML 字段的问题