Как ejabberd обрабатывает заказ и доставку сообщений?

Согласно https://datatracker.ietf.org/doc/rfc6120/?include_text=1 и 10.1. Обработка заказов Как обеспечивается доставка сообщений по всем позициям в списке?

  1. Это делается на стороне сервера или клиента? Если это на любой стороне, ожидаются ли новые сообщения вместо старых с тайм-аутом?
  2. Используется ли возрастающий порядковый номер для гарантии заказа?
  3. При повторном подключении клиента, как клиент узнает, что взять с сервера? Отправляет ли клиент последние идентификаторы msgId всех элементов в списке? или сервер хранит данные QOS и состояние клиента для каждого устройства?

person sokc    schedule 28.06.2020    source источник


Ответы (1)


Прежде всего, поскольку XMPP использует транспортный протокол TCP, он гарантирует, что сервер получает данные в том же порядке, в котором их отправляет клиент.

Согласно документации TCP:

TCP гарантирует доставку данных, а также гарантирует, что пакеты будут доставлены в том же порядке, в котором они были отправлены.

ejabbred - это сервер XMPP, необработанные данные, полученные по TCP, должны соответствовать протоколу XMPP и тому же проверяемому серверу XMPP.

В протоколе XMPP клиент может отправлять сообщения после завершения сеанса, привязки ресурсов, аутентификации и т. Д.

Эти сообщения обрабатываются в том порядке, в котором клиент отправляет их и направляет получателям. Если получатели не в сети, он отправляет в базу данных тот же заказ для последующей доставки.

Здесь гарантии упорядочения в основном обеспечивается сетевым стеком TCP.

person Adinarayana Immidisetti    schedule 29.06.2020
comment
Да, Адинараяна, я понимаю это. Я согласен с тобой. Но мой вопрос заключался в том, чтобы обеспечить порядок сообщений. Использует ли клиент отметки времени в качестве идентификатора заказа для отправки на сервер при повторном подключении? Если да, то как сервер управляет этим? Потому что порядок не может быть получен из временных меток, в отличие от инкрементной, постоянно увеличивающейся последовательности. Даже если он инкрементный, как сервер обеспечивает упорядочивание в случае сбоев? как в одном из сообщений падает? Будет ли сервер буферизовать последующие сообщения, пока не придет нужное? - person sokc; 29.06.2020
comment
@sokc Вы имеете в виду xmpp.org/extensions/xep-0198.html? Почему сбрасываются сообщения, если у вас есть надежные TCP-соединения? Означает ли сообщение раздел ‹message› в XMPP (одиночный чат)? или это может быть какая-нибудь строфа? ejabbered ожидает некоторого порядка в получении строфы во время установления потока. как только поток установлен, он обрабатывает строфы в порядке их получения. каждое соединение связано с процессом erlang, у которого есть почтовый ящик, который помещает принимающие строфы в очередь для обработки. - person Adinarayana Immidisetti; 29.06.2020
comment
Привет, Адинараяна, я считаю, что в прошлый раз я не смог правильно сформулировать свой вопрос. Если у нас есть несколько новых и почти параллельных (но последовательных) запросов сообщений к серверу, есть ли вероятность отправки этих сообщений в почтовый ящик в неправильном порядке? Кроме того, есть вероятность, что если мы хотим асинхронно добавлять эти сообщения в почтовые ящики, помещая их в очередь и получая из нее, мы можем потерять порядок, и это будет трудно поддерживать с учетом распределенной системы и масштаба? Кроме того, как клиент XMPP получает последние сообщения с сервера после подключения к сети, если 100 сообщений обмениваются между 10 элементами списка? - person sokc; 13.07.2020
comment
Насколько мне известно, ejabberd не проверяет порядок сообщений. Очень маловероятно, что сообщения будут отправлены в неправильном порядке. поскольку у каждого клиента есть собственный набор процессов, которые обрабатывают сообщения одно за другим от TCP. и переходя к вашему вопросу, как клиент XMPP извлекает последние сообщения с сервера после подключения к сети? Вы имеете в виду сообщения офлайн? Нет необходимости извлекать сервер, отправляет офлайн-сообщение, как только клиент обнаруживает присутствие в сети. на основе временных меток, связанных с разделами сообщений, которые могут потребоваться переупорядочить, и перед их отображением в пользовательском интерфейсе. - person Adinarayana Immidisetti; 14.07.2020
comment
Возможно, мне все еще непонятен ваш вопрос. Вы сказали: «Если у нас есть несколько новых и почти параллельных (но последовательных) запросов сообщений к серверу, существует вероятность того, что эти сообщения будут отправлены в почтовый ящик в неправильном порядке. чего я вообще не понял. - person Adinarayana Immidisetti; 14.07.2020
comment
Привет, Адинараяна. Предположим, Адам и Ева - контакты Ади. И Адам, и Ева могут отправлять сообщения Ади. И сообщения отправляются Ади следующим образом: 1. Адам: m1 2. Ева: m2 3. Адам: m3 и сервер могут получать сообщения в этом порядке 1. Адам: m1 2. Адам: m3 3. Ева: m2 Но, Ади находится в автономном режиме, и когда Ади подключается к сети, XMPP-серверу необходимо отправить m1, m2, m3 на устройство Ади. Так хранит ли ejabbered то, что все сообщения отправляются каждому элементу списка? выяснить, какие новые сообщения? и поскольку m1, m3 сначала достигли серверов, XMPP Server отправит m1 и m3. Но m2 случился раньше m3 - person sokc; 15.07.2020
comment
Действительно ли имеет значение, если m3 предшествует m2 (каждый отправляется другим отправителем), и я чувствую, что это прекрасно, и оба нигде не связаны? XMPP - это протокол, который заботится об отправителе - ›XMPP-сервер -› Получатель. Видите ли вы какую-либо спецификацию, описывающую Sender1 и Sender2 и их порядок обмена сообщениями друг с другом? Даже вы упомянули, что обработка по заказу описывает одного клиента и одного сервера. Ejabbered доставляет сообщения в том порядке, в котором они были получены. - person Adinarayana Immidisetti; 15.07.2020
comment
Но если вы все еще ищете функциональность как таковую, убедитесь, что клиент отправляет другое сообщение только после того, как он получит подтверждение для предыдущего сообщения от сервера. Не забывайте, что ejabbed похожа на мягкую систему реального времени, а не на сложную. - person Adinarayana Immidisetti; 15.07.2020