Node.js Websockets与长轮询以获取特定于用户的详细信息

Node.js Websockets与长轮询以获取特定于用户的详细信息,node.js,websocket,Node.js,Websocket,我正在学习服务器端WebSocket,并对某个实现有疑问,这是不是一个好主意,或者是否可以让它工作 假设一个用户正在查看他们加入的网站的个人资料,并且出于某种原因,他们希望他们的帐户会发生某些特定的变化,例如,他们的因果报应点数会根据他们发表的有趣帖子而增加(假设他们的因果报应是私人的) 你可以有一个/karma-websocket端点,并在任何人的业力发生变化时发布到它,但是每个人都可能看到其他人的业力,在这种情况下,它应该是私有的(在客户端过滤掉它是不可接受的,因为我不希望除了目标用户之外的

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

假设一个用户正在查看他们加入的网站的个人资料,并且出于某种原因,他们希望他们的帐户会发生某些特定的变化,例如,他们的因果报应点数会根据他们发表的有趣帖子而增加(假设他们的因果报应是私人的)

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

您可以根据web套接字连接以某种方式存储用户ID,并且只向目标用户发送karma通知,但这感觉不可伸缩(这可能适用于此特定示例,但可能不适用于类似于“将此消息发送给所有称为john的人”的情况),因为您可能需要处理一个非常大的foreach循环)

另一种方法是使用ajax请求进行长时间轮询,并在计时器上执行简单的“get karma for this user”(获取此用户的业力),这将很好地工作,但不太花哨,需要向服务器发送比实际需要更多的请求(例如,您可能轮询1000次,但在此期间业力仅更改一次)

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

如果需求是“为所有用户公开获取最新的karma更改”,那么websockets将是理想的,但我只是看不到一种明显而简单的方法来让它适用于更细粒度的需求


首先谢谢你,我知道在任何情况下,长轮询都比不上webSocket连接进行服务器推送的效率。因此,如果您想将数据从服务器推送到客户端,并让客户端几乎实时地获取数据,那么您需要使用从客户端到服务器的webSocket连接,然后您可以随时向客户端发送数据,客户端将立即接收并处理数据

您的问题的其余部分有点难以理解您反对使用webSocket的原因

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

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