我有一个由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设计的好例子,我可以从中获取灵感,或者你可以给我一些建议?谢谢!
答案 0 :(得分:1)
socket.io是您要寻找的套餐。
它的文档中的namespace部分是一个很好的解决方案,因为命名空间可以受到授权保护。它代表一个连接套接字池。
我将如何做到这一点:
使用此路线为两个用户之间的聊天创建文档:
POST http://api.example.com/v1/chat
当用户向另一个连接的用户发送消息并将其存储到数据库中的用户文档中时,使用socket.io创建命名空间。此路由将创建命名空间和/或发出消息:
POST http://api.example.com/v1/chat/:id/message
在客户端中,您必须再次使用socket.io来侦听命名空间中的消息。
可扩展性更新:
这是一个很好的stackoverflow回答关于实现可扩展聊天服务器的问题:Strategy to implement a scalable chat server
正如您在本文中所看到的,mongodb可能不是存储邮件的最佳解决方案。