Одна база данных, несколько интерфейсов, поддержка порядка запросов - PullRequest
0 голосов
/ 01 марта 2011

Предполагая, что у меня есть одна база данных, в которой хранится простая история с несколькими внешними интерфейсами, взаимодействующими с ней (по одному внешнему интерфейсу на сервер), мне интересно, каковы общие решения для работы со временем. Как только у меня есть несколько серверов, я не могу предполагать глобальные согласованные часы, и меня интересовали возможные решения для поддержания какого-то порядка между запросами.

Для конкретного примера, скажем, я хочу записывать истории клиентов, где история определяется как упорядоченный по времени набор записей. Таблица записей будет такой же простой, как (customer_id, время, данные), а история будет всеми строками, где customer_id == запрошенный идентификатор. Каждый запрос, отправленный пользователем, будет содержать одну запись, отправленную одному клиенту. В идеале время должно относиться к «фактическому» времени, когда запрос был отправлен клиентом клиенту (поскольку это время видно из пользовательского POV). Точнее, я забочусь только о сохранении порядка между записями для каждого клиента, а не об абсолютном времени.

Мне известны такие решения, как векторные часы и т. Д. ... но это кажется довольно сложным, и я ожидаю, что это будет довольно распространенная проблема?

Решения, которые не приемлемы в моем случае:

  • Изменение запросов, поступающих во внешний интерфейс: мне, к сожалению, приходится работать при условии, что запросы передаются как есть. У меня есть полный контроль над тем, какой протокол связи необходим между интерфейсами и базой данных.
  • Часы сервера синхронизируются
  • Все запросы, которые необходимо заказывать друг другу, обрабатываются одним и тем же интерфейсным сервером

[РЕДАКТИРОВАТЬ]: вопрос может звучать немного как красная сельдь, поэтому вот мое обоснование для того, чтобы задать его: хотя сейчас это не моя проблема, меня интересует возможность перейти на платформу, такую ​​как Google App Движок, который явно говорит, что их серверы не гарантированно синхронизированы по времени. Решение этой проблемы для порядка запросов не кажется мне очевидным, но, может быть, что-то вроде векторных часов на самом деле является единственным "хорошим" решением?

Ответы [ 2 ]

0 голосов
/ 01 марта 2011

Когда вы выполняете любое действие, которое записывает данные истории в базу данных, вы можете записать два набора информации о времени и дате:

  • дата и время, установленные БД при вставке записи
  • дата и время, переданные с данными в качестве законного фрагмента метаданных.

Первый даст вам центральное представление о мире, если вам когда-нибудь понадобится, а второй позволит вам реконструировать дату и время източка зрения клиентов.

Если бы вы были очень заинтересованы, вы могли бы также передать дату и время из браузера пользователей, заполнив некоторый параметр / поле с помощью JavaScript.

0 голосов
/ 01 марта 2011

Как только у меня есть несколько серверов, я не могу предположить, что глобальные непротиворечивые часы

Хорошо, вы можете настроить серверы для синхронизации их часов с сервером времени.Вы также можете настроить сервер базы данных для синхронизации с сервером времени и настроить другие серверы для синхронизации с сервером базы данных так часто, как вам нужно.(Я не говорю, что это отличная идея, просто говорю, что это возможно. Если у вас есть доступ ко всем серверам.)

В любом случае.,,таким образом, внешние интерфейсы - это единственное программное обеспечение, которое у вас есть, которое на самом деле знает, когда приходит запрос.Это верно?

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

Если вы не можете синхронизировать часы сервера, то я думаю, что ваша единственная надежда состоит в том, чтобы каждый интерфейс запрашивал только один конкретный сервер - может быть, ваш сервер баз данных, но, возможно, нет - который час, когдаприходит запрос клиента.Внешний интерфейс может сделать это, запросив дневное время на порту 13 (протокол DAYTIME, RFC-867), запросив время на порту 37 (протокол TIME, RFC-868) или запросив сервер времени на порту 123 (NTP или SNTPпротокол, RFC-1305 и RFC-2030).

Но после прочтения вашего редактирования я думаю, что вы хотите, невозможно.Похоже, вы говорите, что

  • то, что отправляют внешние интерфейсы, не содержит достаточно информации для восстановления «истинного» порядка
  • то, что отправляют внешние интерфейсы, изменить нельзя

Если внешние интерфейсы не могут отправить вам какую-либо другую информацию, векторные часы и интервальные деревья не помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...