我想为Angular 7应用程序实现一个类似于facebook的通知系统。我目前在后端和套接字io上使用nodejs进行套接字连接。 我了解套接字,事件,可观察对象的原理...但是,我无法确定如何为每个用户创建一个套接字来接收通知。
我考虑过创建一个名为“ notifications”的频道,然后将所有已登录的用户订阅到该频道。当用户执行触发事件的任何操作(需要该应用创建通知)时,我将向所有用户广播该通知,并且仅当已登录用户位于新通知对象的接收器数组中时才显示该通知。 但是我认为这是一种非常糟糕的方法,因为所有用户都将收听此事件,并且只有很少一部分用户会显示该事件。这种方法似乎浪费了我很多资源。有没有合适的方法来解决这个问题,或者我的方法是像Facebook和Instagram这样的公司所使用的方法
答案 0 :(得分:0)
使用WebSockets,可以在客户端和服务器之间建立全双工和持久连接。只要应用程序正在运行,连接就一直保持打开状态(即它是持久的),并且由于它是全双工的,因此可以进行双向同步通信,即现在服务器能够启动通信并将一些数据“推送”到服务器。新数据(客户端感兴趣的数据)可用时,客户端。
WebSockets协议是有状态的,可让您实现发布-订阅(或发布/订阅)消息传递模式(作为基本传输之上的功能),这是实时技术中使用的主要概念。能够以服务器推送的形式获取新更新,而无需客户端按照您的指定重复请求(刷新页面)。
但是,我明白了为什么您对建立具有多个客户端的WebSocket感到困惑。这个想法是要有一个中央实体(最好是分布式系统体系结构)来维护与所有客户端的连接,并充当消息总线来实时执行Pub / Sub所需的路由。
这是非常困难和复杂的,必须处理基于尖峰的缩放只会增加复杂性。通常,您可以使用数据流网络(DSN),而不是从头开始构建这样的体系结构,它是我提到的分布式系统体系结构的抽象,并包装到服务中,您的客户端可以通过该服务插入,进行发布或通过各种渠道订阅数据。
我与Ably's Data Stream Network进行了广泛的合作,它做得非常好,并且还提供协议适配器之类的功能,以便能够插入WebSockets以外的协议(例如MQTT),还可以让您插入任何第三方服务(例如AWS Lambda)以实时调用无服务器功能。根据我的经验,它非常有用且非常容易上手。
这是video from a presentation I did about WebSockets,以及如何为数据构建实时流。
希望这会有所帮助!