У меня есть настройка ejabberd как сервер xmpp между мобильными приложениями, т.е. пользовательское приложение для iPhone и Android.
Но я, похоже, столкнулся с ограничением того, как ejabberd обрабатывает онлайн-статус.
Сценарий:
- Пользователь A является пользователем обмена сообщениями B через свои мобильные телефоны.
- Пользователь B теряет все возможности подключения, поэтому клиент не может отключиться от сервера.
- ejabberd по-прежнему перечисляет пользователя B как онлайн.
- Поскольку ejabberd предполагает, что пользователь B все еще находится в сети, любое сообщение от пользователя A переходит к мертвому соединению.
- Таким образом, пользователь B не получит сообщение и не будет сохранен как автономное сообщение, так как ejabberd предполагает, что пользователь подключен к сети.
- Сообщение потеряно.
- Пока ejabberd не понимает, что соединение устарело, оно рассматривает его как онлайн-пользователя.
И забросьте изменения соединения с данными (от Wi-Fi до 3G до 4G...), и вы обнаружите, что это происходит довольно много.
mod_ping:
Я попытался реализовать mod_ping на 10-секундном интервале.
https://www.process-one.net/docs/ejabberd/guide_en.html#modping
Но, как указано в документации, пинг будет ждать 32 секунды для ответа перед отключением пользователя.
Это означает, что появится 42-секундное окно, в котором пользователь может потерять свои сообщения.
Идеальное решение:
Даже если время ожидания ping может быть уменьшено, это все еще не идеальное решение.
Есть ли способ, которым ejabberd может ждать ответа 200 от клиента перед отбрасыванием сообщения? Если ответа нет, сохраните его в автономном режиме.
Можно ли написать крючок, чтобы решить эту проблему?
Или есть простая настройка, которую я где-то пропустил?
FYI: Я не использую BOSH.