api - 具有从服务器到客户端的主动推送通知的 REST API
问题描述
问题描述
我正在开发一个使用 Python 烧瓶编写的 REST API 的 Xamarin 应用程序。
Xamarin 应用程序提供虚拟购物清单,用户可以在其中协作购买共享清单上的东西。
为了改善用户体验,我希望能够主动通知用户列表中的已完成项目。
可能的解决方案:
来自客户端的同步 API 轮询
通知由 API 存储在关系数据库中,并带有一个标志,指示用户是否已经收到通知。
API 有一个端点GET /users/:user_id/notifications/
,用于查询数据库以获取通知并返回带有这些通知的 JSON 响应。
优点
- 实现起来相当简单
问题
同步轮询会产生大量的 http 请求
API 服务保持无状态,使用负载均衡器进行水平扩展更容易
API 上的 Websocket 端点
API 有一个端点POST /users/:user_id/notifications/register
,它在客户端和 API 之间创建一个 websocket 连接。
该连接被存储到一个全局数组中,其中每个条目都将一个客户端 ID 映射到一个 websocket 连接。
创建新通知时,端点通过将通知的所有者 ID 与字典条目进行比较,在连接字典中进行查找。通知通过 websocket 发送给适当的用户。
通知与第一种方法一样存储在数据库中。
当用户调用端点时,将首先建立一个新的 websocket 连接,一旦成功,API 就会将数据库中所有看不见的通知发送给用户。
优点
- API 可以异步向客户端推送通知
问题
- 当用户终止 websocket 连接时,他的字典条目将持续存在
- 为每个用户永久保留一个 websocket 连接会永久增加 API 的额外开销
- API 的水平可扩展性更加困难,因为服务不再是无状态的(Websocket 连接信息保存在
兔MQ
API 使用 RabbitMQ 服务向客户端发送通知。每个客户端都使用订阅自己的通知队列来防止消息的广播。
优点
- API 保持无状态
问题
用户离线时需要向交易所重新发送通知
排队数量急剧增加
RabbitMQ 服务的额外费用
多用户同时上线时,RabbitMQ 服务临时负载高
最后的话
听听别人的意见会很有趣。
我相信从后端服务到客户端的主动分发通知是非常常见的用例。
最好的,D
解决方案
我会使用 RabbitMQ 并将事件作为推送通知转发。这将在用户未主动连接到网站时起作用,并增强每个用户体验的参与度,当收到通知时将返回网站以获取更多信息,请参阅如何使用 Flask 后端设置基本 Web 推送通知功能或如何发送推送在 ASP.NET Core 中向浏览器发送通知或使用 Spring Boot、Angular 和 Firebase 云消息发送通知,这样 RabbitMQ 不会等到用户重新联机。如果用户在线,您可以通过 WebSockets 和NGINX等负载均衡器将通知直接转发到 Xamarin 应用程序可以以优化的方式处理许多 WebSocket。来自客户端的同步 API 轮询是不太受欢迎的方式,因为它在没有任何更改的情况下使 Web 服务器超载请求。
推荐阅读
- docker - 防止 Docker Compose 创建默认网络
- python - 如何让树莓派显示当前时间
- reactjs - 使用数据数组渲染 React 原生 swiper
- assembly - 将 64 位地址加载到寄存器中
- module - 从模块 Fortran90 对子程序的未定义引用
- flutter - SetState() 在 Flutter 中的 IconButton onPressed 期间不起作用
- python - 如何使用函数的输出作为 matplotlib 图的输入
- c# - FirstOrDefault 或 FirstOrDefaultAsync 核心选择什么
- mongodb - 如何排除在其他集合中有引用的文档?
- python - 如何获取从单独模块加载的回调函数中定义的全局定义变量的值?