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=110.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(单聊)中的 节?或者它可以是任何节? ejabbered 期望在流建立期间接收节有一些顺序。一旦流建立起来,它就会按照接收到的顺序处理节。每个连接都与 erlang 进程相关联,该进程有一个邮箱,该邮箱将接收节放入队列中进行处理。 嗨 Adinarayana,我相信我上次无法很好地提出我的问题。如果我们对服务器有多个新的且几乎并行(但连续)的消息请求,是否有可能以错误的顺序将这些消息推送到邮箱?此外,如果我们想通过推送到队列并从中消费来异步地将这些消息添加到邮箱,那么我们可能会失去秩序并且鉴于分布式系统和规模而难以维护?另外,假设在 10 个名册项目中交换 100 条消息,XMPP 客户端在上线后如何从服务器拉取最新消息? 据我所知,ejabberd 不检查消息的顺序。以错误的顺序获取消息的可能性很小。因为每个客户端都有自己的一组进程,这些进程一个接一个地处理来自 TCP 的消息。并提出您的问题“XMPP 客户端在上线后如何从服务器中提取最新消息?”你的意思是离线消息吗?一旦客户端在线状态,就不需要拉服务器发送离线消息。根据与消息节关联的时间戳,它可能需要重新排列并在将其呈现给 UI 之前。 也许我还不清楚你的问题。您说,“如果我们有多个新的且几乎并行(但连续)的消息请求到服务器,则有可能以错误的顺序将这些消息推送到邮箱”。我根本不明白。

以上是关于ejabberd 如何处理消息排序和传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

大厂都是如何处理重复消息的?

#yyds干货盘点# 如何处理消息丢失问题?

#yyds干货盘点# 如何处理消费过程中的重复消息?

如何处理消费过程中的重复消息?

消息队列如何处理重复消息