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

是否可以使用 HTTP REST API for Chat 应用程序?

钱远
2023-03-14

我们正在Android上构建聊天应用程序。我们正在考虑使用HTTP REST API发送出站消息。想知道与使用WebSockets或XMPP(这似乎更像是传输聊天消息的实际标准)相比,这是一种好方法还是有缺点?

我能想到的一些利弊是:

    < li>HTTPendpoint很容易在服务器端水平扩展(这是主要问题) < li >与HTTP相比,Websockets的学习曲线更加陡峭
  • 与WebSocket相比,HTTP消息将具有更大的有效负载

根据本文档,似乎甚至Facebook最初也使用AJAX来处理聊天消息:

https://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf

共有3个答案

张伯寅
2023-03-14

不建议将HTTP Rest API用于聊天或类似的实时应用程序。

一些概述…

聊天客户端要求

>

  • 好友列表抓取

    查看在线/离线好友

    实时获取聊天消息并发送消息。

    接收交付/阅读等通知。

    第 1 点是启动聊天客户端后的一次性作业,因此可以通过简单的Rest调用来完成,因此不需要复杂的开销。

    在p2p客户端的情况下,其余所有的点都需要持续检查来自服务器或其他部分的数据。这将使您创建或长或短的轮询rest调用来监视新数据或其他更新。

    HTTP Rest客户端有问题

    它不是一种保持活动类型的通信,因此您将不得不建立多个HTTP连接,这将产生如此多的开销,以至于它会变得过于滞后。因为在 HTTP 调用中重新连接的成本非常高。

    Web sockets或XMPP,它们是双工通信模式,非常擅长处理增量数据推送,并且您不需要再次创建新的HTTP连接,因此它提供了非常流畅的性能。

    另一种解决方案如果您被某些遗留系统卡住,您必须使用rest API模式。

    尝试CometD,它是WebSocket和ajax轮询的混合方法,它将为您提供近乎实时的通信,并通过依靠ajax轮询机制在不支持WebSocket的客户端上工作。此外,它使用各种优化来避免一次又一次的重新连接。

    CometD链接

    你也可以试试Socket。io,这也是解决这类用例的一项了不起的技术

  • 邢曦
    2023-03-14

    我认为REST方法可以用于聊天。让我们假设:

      < Li > http://chat . example . com/conversations引用所有对话 < ul > < li >获取获取列表 < li>POST创建一个新的
    • GET在此对话中获取消息
    • POST在对话中添加消息

    如果我理解正确的话,你的问题是关于最后一点。

    一旦客户端向http://chat.example.com/conversations/123,发送了出站消息,它将关闭http连接。

    缺点是在这种情况下根本不可能接收入站消息。您将需要不同的渠道(可能只是Google云消息传递)。

    相反,WebSocket和XMPP使连接保持活动状态,因此它们可以无延迟地接收消息。但是它们两者的缺点确实是,这代表了服务器的可扩展性成本;以及客户端电池使用的成本。

    在服务器上:

      < li >套接字是一种相对稀缺的资源 < li >如果客户端具有打开的连接,则无法移动客户端进行负载平衡(但是您真的可以移动客户端吗?这取决于各层级的职责)

    在客户端:

    • 维持网络连接是非常昂贵的,1秒的网络≈5分钟的睡眠。
    • XMPP图书馆不一定在Android上运行得很好。我不知道在机器人上支持网络口袋。
    岳正阳
    2023-03-14

    我们可以使用REST API进行聊天消息传递,但恕我直言,XMPP是更好的选择。让我们考虑一下XMPP可以提供什么。

    XMPP除了支持TCP传输之外,还提供HTTP(通过轮询和绑定)和web套接字传输。通过HTTP和WebSocket传输读取XMPP

    从 XMPP 的角度了解每种运输的优缺点会很有趣。

    XMPP可以以两种方式使用HTTP:轮询[18]和绑定。

    XMPP over HTTP轮询

    轮询方法现已弃用,本质上意味着存储在服务器端数据库的消息由 XMPP 客户端通过 HTTP “GET” 和 “POST” 请求定期获取(和发布)。

    XMPP over HTTP Binding (BOSH)

    绑定方法被认为比轮询方法中的常规HTTP'GET'和'POST'请求更有效,因为它减少了与其他HTTP轮询技术相比的延迟和带宽消耗

    但是,这也带来了一个缺点,即套接字在较长时间内保持打开状态,等待客户端的下一个请求

    使用同步HTTP双向流(BOSH)实现的绑定方法[19]允许服务器在消息发送后立即向客户端推送消息。这种推送通知模式比轮询更有效,因为许多轮询都不返回新数据。

    如果我们了解BOSH技术是如何工作的,那就好了。

    BOSH 采用的技术有时被称为“HTTP 长轮询”,与其他 HTTP 轮询技术相比,该技术减少了延迟和带宽消耗。当客户端发送请求时,连接管理器不会立即发送响应;相反,它会保持请求打开状态,直到它有数据要实际发送到客户端(或者已过商定的不活动时间)。然后,客户端立即向连接管理器发送新请求,继续长轮询循环。

    如果连接管理器在某个约定的时间长度[12]后没有任何数据发送到客户端,它会发送一个空的响应。这与空白保持活着或XMPP ping(XEP-0199)[13]的目的相似;它有助于保持套接字连接处于活动状态,从而防止一些中介(防火墙、代理等)静默地删除它,并有助于在合理的时间内检测中断。

    基于 WebSocket 绑定的 XMPP

    XMPP支持WebSocket绑定,这是一种更有效的传输

    WebSocket可能是实时消息传递的一种更有效的传输方式,这是一种通过单一TCP连接提供双向全双工通信通道的web技术。在IETF提出的标准RFC 7395中定义了基于WebSocket绑定的XMPP。

    说到学习曲线,是的,您可能想使用REST API,但是现在有几个资源可以学习Android和XMPP,以及XMPP服务器软件,您可以通过互联网或局域网使用它们来运行自己的XMPP服务。在您决定您的架构之前,花费这些精力是值得的。

     类似资料:
    • 问题内容: 好的,因此我们正在尝试将3D散点图合并到NetBeans 7.0中的项目中,而我们选择测试的库之一就是Jzy3D。看起来它可以完成我们需要做的所有事情,但是不幸的是,它什么也没做。 我已经正确安装了JOGL,并对其进行了测试并发现它可以正常工作。然后,我包含了与演示中相同的依赖项。我也尝试过直接包括.jars。是的,胶原- rt.jar在库文件夹中。 编辑: 为了使JOGL工作,我们不

    • AccessibilityService在系统的内存管理方面与普通服务有何不同? 我想问的是:系统可以为了节省内存而关闭AccessibilityService吗?如果可以,当您进入AccessibilityService时,您会看到它打开还是关闭?用户是否必须再次手动打开? 使用startForeground是否有助于使AccessibilityService保持活动状态? 在一个类似的问题中,

    • 我问这个问题是因为最近有一些用户的密码更改。我正在试图找出最新的密码,这意味着,我必须尝试两者。这方面的应用程序还没有部署,所以我需要一种方法在Jboss本身中验证这一点。我使用的JBOSS版本为7.2。

    • 不是一个真正重要的问题,但只是好奇。您可以在运行时更改应用程序图标吗?例如,有一个按钮,当您按下该按钮时,您会在flutter中获得不同的应用程序图标(假设应用程序图标已经“设置”)。Android和iOS。 非常感谢任何意见。谢谢

    • 问题内容: 是否可以使用Python为iOS和Android编写跨平台应用程序 问题答案: 对于Android,Google提供了一种称为ASE(Android脚本环境)的工具,它允许脚本语言(包括Python)在Android上运行。在这里更多细节 对于iOS,它可能要复杂得多(我建议您查看最新版本的iOS SDK协议以检查当前法律状态- 苹果倾向于定期允许和禁止此类应用)。在技​​术方面,您可

    • 由于我是JavaFx的新手,当然还有spring jdbc的新手,所以我处于阻塞状态。我的应用程序几乎准备就绪,我甚至使用inno setup为windows创建了安装文件。此安装文件在我的系统上运行良好,但当我在另一个系统上运行时,它不会运行;可能是由于缺少数据库及其服务器。因此,我需要一个独立的应用程序,通过安装程序管理所有数据库和其他需求。经过研究,我发现许多人建议使用Sqlite或hsql