Разница во времени сервера
Вопрос
Я разрабатываю веб-сайт, который будет получать SMS-сообщения, отправленные на шлюз. Доступ к шлюзу осуществляется через API с запросами в следующем формате:
http://www.smsgateway.com/?login=myusername&password=mypassword&lasttime=1236164238
Обратите внимание, что мне нужно отслеживать время последней загрузки сообщений - возвращаются только сообщения, полученные после этого времени.
Проблема в том, что разница между серверами составляет около 5 минут! Вот что происходит:
-> Пользователь отправляет SMS; временные метки сервера шлюза в 11.00 (скажем, фактическое время 10.55)
-> Мой сервер запрашивает все сообщения, отправленные начиная с 10.56 - получает указанное выше сообщение и добавляет его в базу данных
-> Мой сервер запрашивает все сообщения, отправленные с 10.58 и далее, - получает вышеуказанное сообщение и добавляет его снова, так как оно имеет метку времени в 11:00
-> Мой сервер отправляет еще один запрос в 11.00 - получает сообщение и снова добавляет его в базу данных
Итак, моя проблема в том, что одно оригинальное сообщение принимается 3 раза.
Изменение времени моего сервера выполнимо, но не удаленных серверов. Р>
Как я могу справиться с этим, не проверяя, находится ли сообщение в базе данных?
Решение
Когда вы получаете сообщения, отправленные с 10.56, проверьте время последнего сообщения: Скажи 11:00 утра, затем Следующий звонок отправляется только в 11:00 утра, потому что вы уже получили до 11:00 утра сервера. Таким образом, вы можете уменьшить свои опросы. Даже это будет работать, когда время сервера находится в обратном состоянии.
т.е. проверять время последнего сообщения:
в следующем опросе с момента последнего сообщения.
Другие советы
Ваши базовые настройки очень быстрые, даже если вы синхронизируете часы двух серверов, вы либо потеряете, либо удвоите количество сообщений с общими временными метками (которых может быть много или мало в зависимости от разрешения временных меток и трафика сообщений). Р>
Вам либо понадобится другой API для доступа к сообщениям, либо вам придется запрашивать перекрывающиеся сообщения, запрашивая сообщения начиная с latest_processed_timestamp - 1
и разбирая дубликаты на вашей стороне.