我有一个由express+mongodb驱动的REST API服务器。有几个端点具有不同的资源。其中之一就是聊天API。我已经有了几个基本端点,如:
-
POST http://api.example.com/v1/chat
-创建聊天 -
POST http://api.example.com/v1/chat/:id/message
-发送消息到现有聊天 -
GET http://api.example.com/v1/chat/:id/messages
-在指定的聊天 中获取消息
但是我需要为API消费者提供一种方法来有效地实时获取新消息而无需重新加载页面。
现在,正如你所看到的,它可能只是轮询GET
端点从客户端,但它似乎不是性能。例如,客户端可以有UI,它将显示新的消息计数头(某种通知)。
我正在考虑websockets。例如,是否有可能提供像/chat/:id/subscribe
这样的端点,它将代理套接字的服务器并在客户端连接到它?
是否有一些这样的API设计好的例子,我可以从中得到灵感,或者你可以给我一些建议?谢谢!
插座。这就是你要找的包裹。
文档中的名称空间部分是一个很好的解决方案,因为名称空间可以被授权保护。它表示一个连接的套接字池。
我是这样做的:
为两个用户之间的聊天创建一个文档,使用以下路由:
POST http://api.example.com/v1/chat
使用socket创建命名空间。当用户向另一个已连接的用户发送消息并将其存储到数据库中的用户文档中时,将执行IO操作。该路由将创建一个命名空间和/或发出消息:
POST http://api.example.com/v1/chat/:id/message
在客户端,你必须使用socket。
UPDATE FOR SCALABILITY:
这是一个很好的stackoverflow回答关于实现可扩展聊天服务器的问题:实现可扩展聊天服务器的策略
正如你在这篇文章中看到的,mongodb可能不是存储消息的最佳解决方案。