当前位置: 首页 > 知识库问答 >
问题:

REST API,具有从服务器到客户端的主动推送通知

阎兴为
2023-03-14

我正在开发一个使用Python编写的REST API的Xamarin应用程序。

Xamarin应用程序提供了虚拟购物清单,用户可以在其中协作购买共享清单上的物品。

为了改善用户体验,我希望能够主动通知用户关于列表中的已完成项目。

通知由API存储在关系数据库中,并有一个标志指示用户是否已经收到通知。

API有一个endpointGET /users/:user_id/通知/,它向数据库查询通知并返回带有这些通知的JSON响应。

  • 实现起来相当简单

>

  • 同步轮询会创建大量http请求

    API服务仍然是无状态的,这使得使用负载平衡器进行水平扩展变得更容易

    API有一个endpointPOST/users/:user_id/notifications/register,它在客户端和API之间创建了一个websocket连接。

    连接存储到一个全局数组,其中每个条目将客户端ID映射到websocket连接。

    创建新通知时,endpoint通过将通知的所有者ID与字典条目进行比较来在连接字典中进行查找。通知通过websocket发送给适当的用户。

    通知像第一种方法一样存储在数据库中。

    当用户调用endpoint时,将首先建立一个新的websocket连接,成功后API会将数据库中所有看不见的通知发送给用户。

    • API可以将通知异步推送到客户端
    • 当用户终止websocket连接时,他的字典条目将被删除

    API使用RabbitMQ服务向客户端发送通知。每个客户端都使用订阅自己的通知队列来阻止消息的广播。

    • API仍然是无状态的

    >

  • 当用户脱机时,需要将通知重新发送到exchange

    队列数量急剧增长

    RabbitMQ服务的额外费用

    多个用户同时联机时RabbitMQ服务的高临时负载

    听听别人的意见会很有趣。

    我相信从后台服务向客户端主动分发通知是一个非常常见的用例。

    最好, D

  • 共有3个答案

    岑元徽
    2023-03-14

    我可以为提供JSON的API推荐一种不同的方法,称为GraphQL

    它支持GraphQL API服务器(使用web套接字)推送的订阅功能。
    GraphQL现在被认为比RESTful API更好,因为它非常灵活,您可以通过一个查询获得所需的准确数据。

    尉迟晔
    2023-03-14

    我认为WebSocket的可伸缩性不是问题。你可以通过pub/sub轻松扩展。长连接的热点是一个严重的问题。

    对于单向通信,我建议服务器发送事件。最后,这通常取决于你的团队对什么有信心。

    佘俊茂
    2023-03-14

    我将使用RabbitMQ并使用事件作为推送通知转发它们。这将在用户未主动连接到网站时起作用,并增强与每个用户体验的互动,这些用户体验将在收到通知后返回网站。有关更多信息,请参阅如何使用Flask后端设置基本的web推送通知功能,或如何在ASP中向浏览器发送推送通知。NET Core或通过Spring Boot、Angular和Firebase云消息传递发送通知。通过这种方式,RabbitMQ不会等到用户重新联机。如果用户在线,您可以通过WebSocket和负载平衡器(如NGINX)将通知直接转发给Xamarin应用程序,NGINX可以以优化的方式处理许多WebSocket。来自客户端的同步API轮询是不太受欢迎的方式,因为它在没有任何更改的情况下用请求重载Web服务器。

     类似资料:
    • 本文向大家介绍WEB应用从服务器主动推送Data到客户端有哪些方 式?相关面试题,主要包含被问及WEB应用从服务器主动推送Data到客户端有哪些方 式?时的应答技巧和注意事项,需要的朋友参考一下 一般的服务器Push技术包括: 基于AJAX的长轮询(long一polling)方式,服务器Hold—段时间后再返回信息; HTTP Streaming,通过iframe和〈script〉#签完成数据的传

    • 本文向大家介绍网页应用从服务器主动推送到客户端有那些方式?相关面试题,主要包含被问及网页应用从服务器主动推送到客户端有那些方式?时的应答技巧和注意事项,需要的朋友参考一下 websocket SSE,EventSource接口 参考 EventSource() 示例

    • 客户端关于推送的方法只有两个,它们分别是: Subscribe 方法 Subscribe(name string, id string, settings *InvokeSettings, callback interface{}) (err error) Subscribe 方法的用处是订阅服务器端的推送服务。该方法有两种方式,一种是自动获取设置客户端 id,另一种是手动设置客户端 id。 参数

    • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

    • 我需要实现一个TCP服务器,它基本上应该在与客户端握手时打开一个套接字。 套接字打开后服务器需要保持套接字打开,并且能够通过打开的套接字将消息从服务器推送到客户端 我查看了一些spring集成示例,但不确定我所看到的示例是否确实参考了我的需求。 1. Spring集成tcp是否有这种能力来保持打开套接字并将消息从服务器发送到客户端? 服务器还应支持传入请求 客户端实现是作为简单Tcp java客户

    • 问题内容: 我想创建一个应用程序,当超级用户单击链接时,用户应该获得通知或类似pdf的内容,以便他们在屏幕上访问。 用例:当教师想与他的学生共享PDF时,他应该能够通知他的学生有关可下载的pdf的信息,并且必须提供一个链接来做到这一点。 问题答案: 当您想在CakePHP中实现此功能(因此我假设它是基于Web的应用程序)时,用户必须打开“活动”页面才能接收推送消息。 值得一看前两个答案,但也只需考