我正在寻找构建一个RESTful API,负责根据多个移动应用程序(存储在Amazon redshift数据库中)发送的数据插入数据。
我已经开发了一个API,你可以在这里找到:https://github.com/Noeru14/fms。它使用Gin:https://github.com/gin-gonic/gin。如果我打开了太多的并行连接,它就会崩溃/无法正常工作。
我的一位朋友谈到了使用Node,因为它允许真正简短的客户端 - 服务器交互。
我想知道我需要考虑哪些因素来构建一个RESTful API,它可以使用Go和Node每秒处理多达数十万个请求。你也知道它在Golang中是否可行吗?
非常感谢。
答案 0 :(得分:4)
在Go中是可行的,它在Node中是可行的。它也适用于Erlang或Python等其他语言。但是既然你在询问Node,那么我就会回答这个问题。
Node中高并发性最重要的是永远不会阻塞事件循环或进行任何阻塞操作(除非它是事件循环的第一个滴答)。这是人们做的第一件事并破坏了并发性 - 就像偶尔放一点看上去无辜的fs.statSync()
一样(在{strong>答案中看到this answer这类错误的例子 on Stack Overflow)。在第一个滴答之后使用任何阻塞操作(包括长时间运行的for
或while
循环)总是一个错误,事实上我认为它应该抛出异常。
另一件事虽然在所有情况下都不是彻头彻尾的错误,但仍然可能会损害可扩展性,即在应用程序中存储任何状态。如果您需要具有任何持久状态(并尝试不惜一切代价最小化该需求),那么您应该使用数据库。对于需要在会话数据之类的请求之间快速共享的数据,您应该使用像Redis这样的快速数据库,但前提是您无法通过JWT等实现相同的功能。
首选水平而非垂直可扩展性,因为在某些时候不会有更大的服务器,但总会有更多的服务器。
总结一下:
我是否提到永远不会阻止事件循环?
答案 1 :(得分:1)
首先使用“net / http”软件包具有阻止简单路由器甚至自定义中间件(如auth)所需的一切,使用路由框架进行简单路由并不是非常有效。您可以设计应用程序以支持多个服务器上的多个实例。
以下是Go中的一个示例:https://github.com/efimovalex/EventKitAPI/tree/master/consumerapi,它使用内存工作池