构建具有高可扩展性的 RESTful API

Building a RESTful API with high scalability

我正在寻找一个 RESTful API 来负责根据多个移动应用程序发送的数据(存储在 Amazon redshift 数据库中)插入数据。

我已经开发了一个 API,您可以在这里找到:https://github.com/Noeru14/fms. It uses Gin: https://github.com/gin-gonic/gin。如果我打开太多并行连接,它就会崩溃/无法正常工作。

我的一个朋友谈到改用 Node,因为它允许进行非常短的客户端-服务器交互。

我想知道我必须考虑哪些因素才能构建一个 RESTful API,它可以使用 Go 和 Node 每秒处理数十万个请求。你也知道它在 Golang 中是否可行吗?

非常感谢。

在Go中可行,在Node中可行。它也适用于其他语言,如 Erlang 或 Python。但既然你问的是 Node,那么这就是我要回答的内容。

在 Node 中实现高并发最重要的事情是永远不要阻塞事件循环或进行任何阻塞操作(除非它是事件循环的第一个 tick)。这是人们做的第一件事,它破坏了并发性——比如时不时地放一些看似无辜的 fs.statSync()(有关此类错误的示例,请参见 答案中的 this answer 在 Stack Overflow 上)。在第一个 tick 之后使用任何阻塞操作(包括 long 运行 forwhile 循环)总是一个错误,事实上我认为它应该抛出异常。

另一件事虽然不是在所有情况下都是彻头彻尾的错误,但仍然可能损害可伸缩性,那就是在您的应用程序中存储任何状态。如果您需要任何持久状态(并尝试不惜一切代价尽量减少这种需求),那么您应该为此使用数据库。对于需要在请求之间快速共享的数据,如会话数据,您应该使用像 Redis 这样的快速数据库,但前提是您无法通过 JWT 等实现相同的目标。

更喜欢水平而不是垂直可扩展性,因为在某些时候不会有更大的服务器,但总会有更多的服务器。

总结一下:

  1. 从不阻塞事件循环
  2. 在外部进程中执行所有 CPU 繁重的计算
  3. 从不阻塞事件循环
  4. 使用 Redis 或 Memcached 共享状态
  5. 从不阻塞事件循环
  6. 使用集群实现水平可扩展性
  7. 从不阻塞事件循环

我有没有提到从不阻塞事件循环?

首先,使用 "net/http" 包拥有实现简单路由器甚至自定义中间件(如 auth)所需的一切,使用路由框架进行简单路由并不是很有效。您可以将应用程序设计为支持多个服务器上的多个实例。

这是我在 Go 中的一个示例:https://github.com/efimovalex/EventKitAPI/tree/master/consumerapi 使用内存工作池