ejabberd 如何处理消息排序和传递?
Posted
技术标签:
【中文标题】ejabberd 如何处理消息排序和传递?【英文标题】:How does ejabberd handle message ordering and delivery? 【发布时间】:2020-10-19 01:35:24 【问题描述】:根据 https://datatracker.ietf.org/doc/rfc6120/?include_text=1 和 10.1。订单处理 如何确保名册中所有项目的有序消息传递?
-
是在服务器端还是客户端完成?如果它在任何一方,是否在超时的旧消息上等待新消息?
它是否使用递增的序列号来保证订购?
客户端重新连接时,客户端如何知道从服务器拉取什么?客户端是否发送名册中所有项目的最后一个 msgId?或者服务器是否保留每个设备的 QOS 数据和客户端状态?
【问题讨论】:
【参考方案1】:首先,由于 XMPP 使用 TCP 传输协议,它确保服务器以与客户端发送数据相同的顺序接收数据。
根据 TCP 文档:
TCP 保证数据的传递,也保证数据包将 以与发送时相同的顺序交付
ejabbred 是一个 XMPP 服务器,通过 TCP 接收的原始数据必须符合 XMPP 协议,并且是经过验证的 XMPP 服务器。
在 XMPP 协议中,客户端在完成会话发起、资源绑定和身份验证等操作后就可以发送消息了。
这些消息正在按照客户端发送消息和路由到其收件人的顺序进行处理。如果收件人处于离线状态,它会将相同的订单推送并弹出到数据库以供以后交付。
这里的排序保证主要由 TCP 网络堆栈来保证。
【讨论】:
是的,Adinarayana,我明白这一点。我同意你的看法。但我的问题是确保消息的顺序。客户端在重新连接时是否使用时间戳作为订单标识符发送到服务器?如果是这样,那么服务器如何管理它?因为与增量不断增加的序列不同,顺序不能从时间戳派生。即使是增量的,服务器如何在失败的情况下保证排序?就像其中一条消息一样?服务器是否会缓冲后续消息,直到正确的消息到达? @sokc 你指的是xmpp.org/extensions/xep-0198.html吗?当你有可靠的 TCP 连接时,为什么会发生消息丢失? message 是否意味着 XMPP(单聊)中的以上是关于ejabberd 如何处理消息排序和传递?的主要内容,如果未能解决你的问题,请参考以下文章