Пример из реальной жизни: TIBCO Rendezvous.
Данные отправляются через многоадресную передачу с порядковым номером. Клиент, который обнаруживает отсутствующий порядковый номер, отправляет сообщение группе многоадресной рассылки «эй, я пропустил пакет 12345». Сервер повторно многоадресно передает эти данные. На сервере имеется настраиваемый объем данных для буферизации в случае, если клиент запрашивает его.
Проблема:
Представьте себе, что у вас есть один клиент, который отбрасывает половину своих пакетов, и 100 здоровых клиентов. Этот клиент отправляет запрос на повторную передачу для каждого другого пакета. Сервер начинает вызывать достаточную нагрузку на одного из исправных клиентов, так что он начинает отбрасывать пакеты и запрашивать повторные передачи. Дополнительная нагрузка приводит к тому, что другой исправный клиент начинает запрашивать повторные передачи. И так далее. Результатом коллапса заторов.
Tibco предлагает обходной путь, заключающийся в отключении абонента, который отправляет слишком много запросов на повторную передачу. Из-за этого одному абоненту становится сложнее вызвать затор.
Другой обходной путь, ограничивающий риск возникновения перегрузки, - это ограничение объема данных, которые сервер готов повторно передать.
Tibco также должна обеспечить эвристику на клиенте и сервере в отношении того, следует ли выполнять многоадресную или одноадресную передачу запроса на повторную передачу, а также самой повторной передачи. Они не (Для сервера вы можете выполнить одноадресную ретрансляцию, если только один клиент запросил ее в определенном временном окне, для клиента вы можете выполнить индивидуальную передачу запроса на повторную передачу, если сервер сказал вам - в ретранслируемом пакете - что вы единственный, кто запрашивает повторные передачи и, пожалуйста, одноадресные запросы в будущем)
По сути, вам придется выбирать между тем, насколько сильно вы хотите гарантировать, что клиенты будут получать данные, и риском обрыва перегрузки. Вам нужно будет угадать, куда был отброшен пакет и была ли ретрансляция наиболее эффективно отправлена в одноадресной или многоадресной рассылке. Если сервер понимает данные и может принять решение не отправлять повторную передачу, если обновленные данные все равно должны быть отправлены (что делает повторную передачу неактуальной), вы находитесь в гораздо лучшем положении, чем структура, такая как Tibco RV.
Иногда понимание данных может привести к ошибочным предположениям. Например, рыночные данные - на первый взгляд может показаться нормальным не ретранслировать котировку при наличии обновленной котировки. Но позже вы можете обнаружить, что подписчик вел историю котировок, а не просто пытался отслеживать текущую цитату. Возможно, у вас могут быть разные требования в зависимости от абонента, и некоторые клиенты предпочтут одноадресный TCP против многоадресной.
В какой-то момент вам потребуется принять произвольные решения на сервере о том, сколько данных следует буферизовать в случае повторных передач или медленных клиентов.