Надежное чтение с постоянно добавляемой таблицы - PullRequest
0 голосов
/ 13 января 2010

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

id bigint not null primary key
visited datetime not null
ip_address
# Other fields

Это таблица отслеживания, как вы, наверное, догадались. Использование этой таблицы полностью добавляется только для добавления, то есть после изменения был вставлен.

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

while (true) {
    Select rows from tracking table where id > last_id
    Feed rows to stats processing thread
    last_id = max(id from rows)
    sleep some amount of time (~30sec is what I'm currently using)
}

Однако я волнуюсь, что пропущу строки. Разрыв в идентификационных данных может произойти, потому что в то время, когда я выбираю строки из таблицы отслеживания, некоторые из идентификаторов строк имеют были зарезервированы, но данные в этих транзакциях еще не были зафиксированы, и В следующем цикле я уже перешел на новые идентификаторы.

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

Вот различные варианты, которые я подбрасывал:

  1. Перепроектирование таблицы или запроса на что-то вроде времени посещения

  2. Не используете реляционную БД, а какую-то систему очередей данных?

  3. Запросить таблицу с задержкой по времени, т. Е. Идентификатор WHERE> last_id И посещен

Также возможно, что есть вариант, который я не рассматривал. Что лучше способ запроса таблицы, чтобы я не пропустил никаких данных?

1 Ответ

0 голосов
/ 13 января 2010

Вот один из способов, которым вы можете сделать это (что-то вроде вашего # 2):

  1. Копируйте ваши данные в отдельную базу данных "хранилища".
  2. Выполните ETL, чтобы ваши данные нормализовались на вашем складе более оптимально для ваших запросов / статистического анализа. Для каждого типа записи добавьте дополнительный столбец, который будет служить флагом «статуса», указывающим, была ли запись прочитана вашим механизмом анализа.
  3. Попросите ваш анализ обновить столбец "чтение", как только он прочитает запись.
...