Это мое основное предложение:
Сервер обновляет список (добавление, удаление и изменение существующих элементов) через интерфейс, который поддерживает очередь с фиксированной длиной операций, которые были применены к списку. Каждой операции присваивается метка времени. Когда очередь заполнена, самые старые операции постепенно удаляются.
Когда пользователю сначала нужно получить список, он просит сервер отправить ему полный список. Сервер отправляет список с текущей отметкой времени.
Один раз в произвольный период времени (10-30 секунд?) Клиент просит сервер отправить ему все операции, которые были применены к списку с момента получения им временной отметки.
Затем сервер проверяет, отображается ли отметка времени в списке (то есть превышает ли она отметку времени первого элемента), и, если да, отправляет клиенту список операций, которые произошли с того времени до настоящего времени, плюс текущая метка времени. Если он слишком старый, сервер снова отправляет полный список.
Похоже, что UDP подходит для этого подхода, так как он не очень важен, если время от времени теряется "цикл обновления".