使用REST和Websockets同步数据

5
我们正在构建类似于 Messenger 的聊天应用。需要满足以下要求:
  • 用户登录
  • 用户应该看到最后 N 条消息,并能够加载更早的消息
  • 新消息也应该被追加
我的解决方案是:
  • 我想使用 WebSockets 结合 REST 来实现此目的。我的想法是客户端应用程序通过消息 ID 决定需要哪些消息。因此,REST 将用于初始获取消息和获取旧消息。
  • 新消息将通过 WebSockets 接收
可能需要处理的问题如下:
  • 应用程序开始订阅 WebSocket 频道以获取新消息并发送请求以获取没有初始消息 ID 的旧消息
  • 调用 GET 请求后,有可能会有新消息到达并存储在数据库中
  • 客户端应用程序开始订阅 WebSocket 频道,因此消息将通过 WebSockets 接收
  • GET 请求不知道这条消息,会获取包含这些新消息的最后 N 条消息,从而导致客户端应用程序具有重复记录并需要过滤这些消息
对于这种情况,您能否给出一些优雅的处理方法的建议?谢谢。
1个回答

3
我将考虑以下方式来解决您的任务:
客户端应该只知道要监听的主题,而不是要从哪个消息ID开始监听。
服务器应决定返回什么(即使时间也应始终在服务器端跟踪)。
WebSocket用作STOMP的传输(简单地说,不要重复造轮子)。WebSocket连接可以在加载客户端应用程序时打开,而不是在进入“侦听消息”状态时打开。但应根据需要订阅主题。
您始终可以同时发送GET请求并启动STOMP订阅(几乎同时,延迟1-2纳秒),并且这些请求始终应在不同的promise中处理。但我会按照以下方式对齐它们:首先启动STOMP订阅,并传递带有订阅开始时间戳的特定消息;其次,执行REST请求以获取在特定时间戳(从STOMP接收)之前的TOPIC的前10-100条消息。
获取最后10条消息(在订阅时刻之前)可以通过REST和STOMP方法进行交付:您始终可以在服务器端对订阅事件做出反应,并提供客户端特定的消息。
关于来自不同“数据通道”的多个相同消息的问题很容易解决:您的客户端(希望不是jquery,而是Angular或React或Vue或任何其他东西)将在控制器中存储所有数据,并通过message-id进行过滤和检查,以确保仅存储唯一的条目。
但是,如果您的系统每秒产生数十万条消息:我猜HTTP协议不适合您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接