将HTTP REST API用于聊天应用程序是否可以?

Mad*_*uja 20 android chat xmpp

我们正在Android中构建聊天应用程序.我们正在考虑使用HTTP REST API发送出站邮件.与使用WebSockets或XMPP(这似乎更像是转移聊天消息的事实标准)相比,想知道它是一个好方法还是有任何缺点?

我能想到的一些优点/缺点是:
+ HTTP端点很容易在服务器端水平扩展(这是一个主要问题)
+与HTTP相比,Websockets的学习曲线更陡峭
- 与websockets相比,HTTP消息的负载更大

根据这份文件,似乎Facebook最初使用AJAX来处理聊天消息:

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

ran*_*dom 14

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

支持TCP传输的XMPP还提供HTTP(通过轮询绑定)和websocket传输.通过HTTP和WebSocket传输读取XMPP

从XMPP的角度来理解每种传输的优缺点将会很有趣.

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

XMPP over HTTP轮询

现在不推荐使用的轮询方法实质上意味着XMPP客户端通过HTTP'GET'和'POST'请求定期提取(和发布)存储在服务器端数据库上的消息.


XMPP over HTTP绑定(BOSH)

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

然而,这也带来了一个缺点,即插座在较长的时间内保持打开状态,等待客户的下一个请求

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

如果我们了解BOSH技术是如何工作的,那将是件好事.

BOSH采用的技术(有时称为"HTTP长轮询")比其他HTTP轮询技术减少了延迟和带宽消耗.当客户端发送请求时,连接管理器不会立即发送响应; 相反,它将请求保持打开状态,直到它有实际发送给客户端的数据(或已达成协议的非活动时间长度).然后,客户端立即向连接管理器发送新请求,继续长轮询循环.

如果连接管理器在一段约定的时间[12]之后没有任何数据要发送给客户端,它会发送一个空的响应.这与空白保持或XMPP Ping(XEP-0199)[13]的用途相似; 它有助于保持套接字连接处于活动状态,这可以防止某些中介(防火墙,代理等)无声地丢弃它,并有助于在合理的时间内检测到中断.


XMPP over WebSocket绑定

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

用于实时消息传递的可能更有效的传输是WebSocket,这是一种通过单个TCP连接提供双向全双工通信信道的Web技术.WebSocket绑定上的XMPP在IETF提议的标准RFC 7395中定义.

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


rds*_*rds 9

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

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

一旦客户端向http://chat.example.com/conversations/123发布了一条outboud消息,它将关闭http连接.

缺点是在这种情况下根本不可能接收入站消息.您将需要一个不同的渠道(可能只是谷歌云消息).

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

在服务器上:

  • 套接字是一种相对稀缺的资源
  • 如果他们有一个开放的连接,那么就无法移动客户端进行负载均衡(但是你真的可以移动客户端吗?这取决于层的责任)

在客户端:


小智 6

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

一些概述..

聊天客户端要求

  1. 朋友列表获取

  2. 查看在线/离线朋友

  3. 实时获取聊天消息并发送消息.
  4. 接收交付/阅读等通知

启动聊天客户端后,点1是一次性工作,因此可以通过简单的休息调用完成,因此不会产生复杂的开销.

在p2p客户端的情况下,所有点都需要持久检查来自服务器或其他部分的数据.这将使您创建长或短轮询休息呼叫以监视新数据或其他更新.

HTTP Rest客户端问题

它不是一种保持活动类型的通信,因为你必须进行多个http连接,这将有很多开销,它将变得过于迟缓.因为重新连接在HTTP调用中非常昂贵.

**Web套接字或XMPP**它们是双工通信模式,非常擅长处理增量数据推送,并且您不会再次创建新的http连接,因此它可以提供真正流畅的性能.

另一种解决方案 如果你遇到一些遗留系统,你必须使用其余的api模式.

尝试CometD它是一个websockets和ajax轮询的混合方法,它将为您提供近乎实时的通信,以及通过回退ajax轮询机制在不支持websockets的客户端上工作.它还使用各种优化来避免一次又一次地重新连接.

CometD链接

您也可以尝试Socket.io,这也是一种解决这类用例的神奇技术