Это не полный ответ, но это надежный способ избежать дублирования.Во-первых, когда вы запускаете скрипт обновления, не запускайте его в течение текущей секунды.Запустите его на всем, что, скажем, старше 5 секунд.Таким образом, вы знаете, что если у вас есть одна запись на данную секунду, у вас есть все записи на эту секунду.Сделав это, вы сможете использовать updated_at > :last_seen_updated_at
и избегать дублирования между циклами обновления.
На этом этапе вы можете свободно извлекать пакеты или один большой запрос.По крайней мере, как вы уже описали в таблице, данные, которые вы будете извлекать, в этот момент будут в значительной степени статичными - вполне возможно, что по мере добавления в таблицу будут добавляться другие записи, но все они будут после любого произвольногопоследняя секунда отсечки есть, и поэтому не будет частью вашего запроса.
Что касается проблемы ведомого / ведущего устройства, это может быть немного проблематично, но пока мастер обновляетсястарые записи в первую очередь, все еще довольно легко решить.При настройке порога обновления найдите самый последний временной интервал в локальной записи и вычтите одну секунду.
По-прежнему существует проблема, связанная с тем, что запись, которая была добавлена или обновлена в разделе времени, на который вы обращали внимание, могла бы бытьобновляется снова, пока вы извлекаете.Единственный способ строго предотвратить это - отключиться от сервера и внести изменения в буфер при извлечении, но вы можете значительно сократить частоту, вернувшись и снова запустив скрипт после того, как вы закончили с относительно небольшим количеством добавлений и изменений.это произошло, когда вы выделяли большую группу.Вы можете повторять это столько раз, сколько испытываете паранойя.Кроме того, вы можете подсчитать количество строк предварительного извлечения, извлечь и подсчитать количество извлеченных.Если есть какая-либо разница, вы можете запустить процесс снова, пока не получите одно и то же число до и после.