erlang - ejabberd 如何处理消息排序和传递?

标签 erlang xmpp real-time ejabberd instant-messaging

根据 https://datatracker.ietf.org/doc/rfc6120/?include_text=1 10.1。按订单处理 如何确保花名册中所有项目的有序消息传递?

  1. 它是在服务器端还是在客户端完成的?如果它在任何一侧,是否正在超时等待较旧的消息?
  2. 它是否使用增量序列号来保证订购?
  3. 在客户端重新连接时,客户端如何知道要从服务器拉取什么?客户端是否发送名册中所有项目的最后 msgId?或者服务器是否保留每个设备的 QOS 数据和客户端状态?

最佳答案

首先,由于 XMPP 使用 TCP 传输协议(protocol),它确保服务器接收数据的顺序与客户端发送数据的顺序相同。

根据 TCP 文档:

TCP guarantees delivery of data and also guarantees that packets will be delivered in the same order in which they were sent

ejabbred 是一个 XMPP 服务器,通过 TCP 接收的原始数据必须符合 XMPP 协议(protocol),并且是经过验证的 XMPP 服务器。

在XMPP协议(protocol)中,客户端可以在完成 session 发起、资源绑定(bind)、身份验证等后发送消息。

这些消息按照客户端发送的顺序处理并路由到其收件人。如果收件人离线,它会将相同的订单推送并弹出到数据库,以供稍后交付。

这里的顺序保证主要由 TCP 网络堆栈确保。

关于erlang - ejabberd 如何处理消息排序和传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628807/

相关文章:

real-time - Storm 最大喷口待定

android - 以最小延迟播放实时音频流

java - 在带有 aSmack 的 XMPP 中使用 UserSearch 时,getSearchForm 返回 null

web-applications - 我应该使用哪些库或平台来构建在客户端之间提供实时、异步数据同步的 Web 应用程序?

linux - 为什么我必须对来自守护进程的命令执行 sudo 命令?

erlang - 将列表列表转换为元组列表的最佳方法?

java - 如何使用 smack Java 获取 IQ 标签?

c - 如何确定环绕声音频信号的 channel 映射( channel 到轨道分配)

linux - 更改 IP 后 RIAK 节点未启动

erlang - 节点列表的应用环境值怎么写?