我们正在Android中构建一个聊天应用程序。我们正在考虑使用HTTP REST API发送出站消息。是否想知道与使用WebSockets或XMPP相比,它是一种好方法还是有缺点(这似乎是传输聊天消息的事实上的标准)?
我可以想到的一些优点/缺点:
+ HTTP端点很容易在服务器端水平扩展(这是一个主要问题)
+ Websockets的学习曲线比HTTP陡峭
-与websocket相比,HTTP消息的有效负载更大
根据本文档,似乎Facebook最初也使用AJAX处理聊天消息:
https://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf
我们可以使用REST API进行聊天消息传递,但是恕我直言,XMPP是更好的选择。让我们考虑一下XMPP提供的功能。
XMPP除了支持TCP传输外,还提供HTTP(通过轮询和绑定)和websocket传输。通过HTTP和WebSocket传输读取XMPP
从XMPP的角度了解每种传输方式的利弊是很有趣的。
XMPP可以通过两种方式使用HTTP:轮询[18]和绑定。
XMPP over HTTP轮询
现在已弃用的轮询方法实质上意味着XMPP客户端会通过HTTP“ GET”和“ POST”请求定期获取(并发布)存储在服务器端数据库中的消息。
XMPP over HTTP绑定(BOSH)
绑定方法被认为比轮询方法中的常规HTTP'GET'和'POST'请求更有效,因为与其他HTTP轮询技术相比,它减少了延迟和带宽消耗
但是,这也带来了一个缺点,那就是套接字将保持打开状态延长时间,以等待客户端的下一个请求
绑定方法是使用双向HTTP上的双向流(BOSH)实现的,[19]使服务器可以在消息发送后立即将消息推送到客户端。这种通知的推送模型比轮询更有效,在轮询中,许多轮询都不返回新数据。
BOSH所采用的技术有时称为“ HTTP长轮询”,与其他HTTP轮询技术相比,它减少了延迟和带宽消耗。当客户端发送请求时,连接管理器不会立即发送响应。而是将请求保持打开状态,直到它有实际要发送给客户端的数据为止(或者已经达到约定的不活动时间)。然后,客户端立即向连接管理器发送新请求,继续进行长轮询循环。
如果连接管理器在约定的时间长度[12]之后没有任何数据要发送到客户端,则它将发送一个为空的响应。这与空白保持活动或XMPP Ping(XEP-0199)[13]的目的相似。它有助于使套接字连接保持活动状态,从而防止某些中介(防火墙,代理等)无声地丢弃它,并有助于在合理的时间内检测到中断。
通过WebSocket绑定的XMPP
XMPP支持WebSocket绑定,这是一种更有效的传输方式
WebSocket是一种可能更有效的实时消息传输方式,它是一种Web技术,可通过单个TCP连接提供双向全双工通信通道。在IETF提出的标准RFC 7395中定义了基于WebSocket绑定的XMPP。
说到学习曲线,是的,您可能很想使用REST API,但是现在有一些资源可以学习Android和XMPP以及可以用于通过Internet运行自己的XMPP服务的XMPP服务器软件。或在局域网上。在决定您的体系结构之前,花点功夫是值得的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句