Websockets与用户特定详细信息的长轮询

时间:2018-06-04 18:37:45

标签: node.js websocket

我正在学习服务器端的websockets并且对某个实现有疑问,是否它不是一个好主意,或者是否可以使它工作。

假设某个用户正在查看他们加入的网站的个人资料,并且出于某种原因,他们期望某些特定于其帐户的内容发生变化,例如:他们的业力指向基于他们所做的有趣帖子而增加(假设他们的业力是私人的)。

你可以拥有一个/ karma websocket端点,并在任何人的业力发生变化时发布,但随后每个人都可能看到其他人的业力,在这种情况下,它应该是私有的(在客户端过滤它是不可接受的,因为我不希望除目标用户以外的任何人都收到通知。)

你可以以某种方式将userId存储在Web套接字连接中,并且只将业力通知发送给目标用户,但这并不感觉可扩展(它可能适用于这个特定的例子,但可能不适用于它的某些情况比如“将此消息发送给所有名为john的人”,因为你可以有一个非常大的foreach循环来处理)。

替代方案只是使用ajax请求进行长轮询,在计时器上使用简单的“为此用户获取业力”,这可以正常工作,但不那么花哨,并且需要比实际需要更多的服务器请求(例如,你可能会轮询1000次,但你的业力在那段时间内只会改变一次。)

解决这样一个要求的好方法是什么,通过长时间轮询保持简单,还是有一种我缺少的websocket方式?

如果要求是“公开获取所有用户的最新业力变化”,那么websockets将是理想的,但我只是看不到一种明显而简单的方法来使其适用于更细粒度的要求。

由于

1 个答案:

答案 0 :(得分:1)

首先,我知道长轮询比服务器推送的webSocket连接更有效。因此,如果您想将数据从服务器推送到客户端并让客户端实时获取数据,您将需要使用从客户端到服务器的webSocket连接,然后您可以随时向客户端发送数据和客户端将立即收到并处理。

您的问题的其余部分有点难以理解您对使用webSocket的反对意见。

如果您担心数据被保密(只有特定用户可以看到他们的业力价值),那么这只是一个正确实施的问题来强制执行。建立webSocket连接后,必须对用户进行身份验证,以便确切知道哪个用户正在建立webSocket连接。假设您的网页已经具有某种用户身份验证,那么在建立webSocket连接时可以捎带同样的身份验证,因为cookie是通过启动webSocket连接的http请求传递的。所以,现在让我们假设你有一个经过身份验证的webSocket连接,服务器知道哪个webSocket属于哪个用户。

所以,现在只需要在每个webSocket上发送适当的数据。您的服务器需要实现正确的逻辑,以便为给定用户进行给定的业力更改,找到属于该用户的经过身份验证的webSocket连接,然后仅通过那些webSocket连接发送消息,以警告客户端有新的业力值。