Использование рекомендаций в уведомлениях Cumulocity в реальном времени

Согласно http://cumulocity.com/guides/reference/real-time-notifications/ клиент, который инициирует рукопожатие для получения уведомлений в реальном времени, может включить рекомендацию в тело запроса. Этот совет может иметь тайм-аут ("Максимальное время в миллисекундах между отправкой сообщения о подключении и ответом от сервера") и интервал ("Период, после которого сервер закрыть сеанс, если не получено следующее сообщение о подключении от клиента.»). Я не понимаю эти параметры и то, как они применяются к моим длительным соединениям с опросом.

  1. зачем серверу интересоваться тайм-аутом, который клиент использует для своего соединения? Предполагается немедленно отправлять уведомления по мере их поступления (т.е. «в режиме реального времени»). И это действительно так, как и ожидалось. Даже когда я указываю очень короткий тайм-аут, но на самом деле использую гораздо более длительный тайм-аут для моего подключения, я все равно получаю уведомления, которые происходят между этими двумя моментами времени без каких-либо проблем. И когда я указываю большой тайм-аут, я все равно сразу получаю уведомления. Это имело бы смысл для ленивых уведомлений, но я не вижу упоминания о них в документации. Так в чем смысл этого значения?
  2. в чем смысл интервала? Если я укажу короткий интервал, но буду ждать гораздо дольше между двумя последовательными вызовами подключения, тогда сервер не "закрывает сеанс", если это будет означать, что мой clientID становится недействительным, и мне нужно сделать новое рукопожатие. Может быть, это просто гарантированное минимальное время, в течение которого сервер должен поддерживать сеанс? т.е. максимальное время, в течение которого клиент хочет, чтобы ему было разрешено ждать между подключениями [и ожидание дольше может работать или не работать, на усмотрение серверов]? Это также не время, после которого очереди фактически очищаются, потому что, если я запускаю уведомление, когда я не подключен, и повторно подключаюсь по истечении интервала времени, то это уведомление все еще доставляется нормально.

Если мы сравним это с уведомлениями SmartREST, то увидим, что там должно работать наоборот, что, ИМХО, имеет больше смысла: сервер отправляет совет клиенту, чтобы сказать ему, как он должен настроить себя. Значение в этом случае все еще может быть несколько двусмысленным, но, по крайней мере, обработка может быть более прямой (= просто делайте так, как советует сервер):

  1. тайм-аут: не используйте более длительные тайм-ауты, потому что сервер не хочет держать соединения открытыми дольше, чем X. Не используйте более короткие тайм-ауты, потому что серверу может потребоваться время X для создания всех уведомлений для ответа.
  2. интервал: не переподключайтесь быстрее, чем Y, потому что внутренняя рассылка уведомлений сервера даже не работает так быстро. Не ждите дольше, чем Y, прежде чем переподключаться, потому что внутренние очереди не буферизуют уведомления дольше, чем Y. (В справочнике CometD эти два параметра называются interval и maxInterval, так что ясно, что они независимы.)

Почему «направление совета» меняется на противоположное в двух сценариях? Как (если вообще) я должен использовать совет для регулярных рукопожатий с уведомлением в реальном времени?

Большое спасибо за любые разъяснения по этому поводу.


person rob retro    schedule 30.08.2017    source источник


Ответы (1)


[Отказ от ответственности: я являюсь руководителем CometD и специалистом по сопровождению протокола Байё]

Хотя определение timeout верно, определение interval неверно. Правильное определение приведено в спецификации протокола Байё, здесь.

Для ясности то, что вы называете выше «подключением», на самом деле является сообщением на канале /meta/connect, который является механизмом сердцебиения протокола Байё.

Смысл timeout — суть длинного опроса. При длительном опросе сервер проводит опрос при отсутствии событий для ретрансляции клиенту. Как долго сервер проводит опрос (опять же, при отсутствии событий), указывает параметр timeout. Вот почему это тайм-аут: он ожидает событий, а если нет, то истекает тайм-аут и все равно отвечает клиенту (пустым ответом).

Параметр timeout обычно настраивается на сервере, но клиент может переопределить его (временным образом в каждом отправляемом совете), и сервер должен учитывать значение клиента. Обычно это делается реализацией клиента, а не приложениями — параметр timeout непрозрачен для приложений.

Значение interval заключается в том, сколько времени клиент ждет после получения ответа /meta/connect, прежде чем выдать другой запрос /meta/connect. Параметр interval можно настроить как на сервере, так и на клиенте.

Эти два параметра работают вместе для настройки длинного опроса.

Например, вы можете просто добиваться обычного опроса каждые 3 секунды, используя пару (timeout=0, interval=3000). Сервер увидит, что клиент запросил timeout=0, и должен принять это во внимание, чтобы немедленно ответить, даже если нет доступных событий. В свою очередь, клиент будет ждать 3 секунды, прежде чем отправить еще один запрос /meta/connect.

С другой стороны, длинный опрос имеет, например, пару (timeout=10000, interval=0), где сервер удерживает /meta/connect не более 10 секунд, если нет событий для ретрансляции клиенту.

Перегруженный сервер может послать клиентам совет с interval=500, чтобы уменьшить нагрузку, с которой он справляется. Все клиенты будут ждать 500 миллисекунд на стороне клиента, прежде чем отправить еще одно сообщение /meta/connect, давая серверу время на восстановление.

Параметр timeout влияет на тайм-аут простоя TCP-соединения: если timeout слишком велико, некоторые серверы (или сетевые компоненты) могут закрыть TCP-соединение до того, как сервер сможет ответить на /meta/connect. Контейнеры сервлетов Java никогда не закрывают TCP-соединение для ожидающих запросов (в соответствии со спецификацией сервлета), но Apache|Nginx перед контейнером сервлетов Java, настроенным на обратный прокси-вызов, может закрыть TCP-соединение раньше, чем указано в timeout.

Параметр interval влияет на то, как долго сервер должен хранить в памяти сеанс для клиента, который, кажется, ушел. Если interval слишком велико, сервер может истечь сеанс для этого клиента.

Если продукт Cumulocity интерпретирует interval так, как указано в их документации, то это нарушение протокола Байё. Я скорее думаю, что это ошибка документации.

person sbordet    schedule 04.09.2017