Нужна библиотека очередей на основе дисков, желательно для C - PullRequest
2 голосов
/ 09 февраля 2009

У меня есть механизм организации очередей в C на Unix. Он принимает транзакции XML. Некоторые транзакции содержат записи для хранения. Другие транзакции запрашивают эти транзакции. Транзакции хранятся в файле, который является домашней очередью. Сначала во-первых, очень просто. Область заголовка в начале файла, отслеживает следующую позицию для чтения и следующую позицию для записи. Мы используем блокировку файлов, но не семафоры, так как поиск выполняется из удаленных систем. И есть только одна программа, которая обращается к очередям. Он в С. Работал нормально годами.

Теперь мы должны расширить систему. Транзакции будут содержать дополнительный тег XML. Мы должны выборочно получать на основе значений этого тега. Мы идем от простой очереди к приоритетной очереди. В теге может быть много разных значений. Скажите AX, BX, CX, FL и TS. Транзакции добавляются в очередь в порядке поступления. Нам нужно иметь возможность получать их либо в порядке их получения, либо извлекать следующую транзакцию, где тегом является FL. Или тс. Или (CS или FL). Или не AX.

Как лучше всего это сделать?

Простое и быстрое - вот что нам нужно. На ум приходит несколько вариантов:

  1. Используйте что-то вроде Berkely DB, чтобы превратить очередь в своего рода базу данных.
  2. Нажмите на базу данных PostgreSQL, создайте таблицу, которую можно использовать в качестве приоритетной очереди.
  3. Найдите библиотеку C, которая будет делать то, что мы хотим.
  4. Создать собственную очередь приоритетов на диске.

У нас есть некоторые ограничения. Время идет, и это нужно сделать за несколько недель. С для быстрой вставки в систему. Может быть, Python, если мы сможем достаточно быстро танцевать, чтобы преобразовать всю другую бизнес-логику в программе, которая обращается к очереди. Предпочитаю не использовать PostgreSQL, так как у нас нет контроля над системой баз данных, а администратор баз данных имеет неприятные привычки в отношении того, что он считает «своим», и мы не можем гарантировать надежность безотказной работы, даже если это критическая система. Политика, да !! DBA также сказал, что использование таблицы PostgreSQL не является эффективным способом сделать это. Мы предпочитаем что-то локализованное, чтобы мы могли контролировать это. Должен быть молниеносным, чтобы обрабатывать много транзакций в минуту.

Я открыт для любых предложений, даже отдаленных. Чем больше предложений, тем лучше.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2009

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

0 голосов
/ 09 февраля 2009

Похоже, все, что вам действительно нужно, это;

  1. Способ перебора записей при проверке тега.
  2. Способ пометить записи как NULL, поэтому записи, выбранные не по порядку, пропускаются при обычной обработке.

Я бы предложил, чтобы самым быстрым изменением было бы, чтобы каждая запись содержала небольшой заголовок в файле, который содержит эту информацию (длина записи, isValid, tag-info и т. Д.). Затем вы начинаете с первой записи как обычно и перебираете все записи, пока не встретите одну с тегом, и когда вы помечаете эту запись как недействительную, регулярная обработка игнорирует ее.

В долгосрочной перспективе вы можете рассмотреть что-то вроде sqllite, которое свободно доступно, работает с обычными файлами и может быть скомпилировано в ваш исполняемый файл. Для большинства типов поиска записей это, вероятно, будет быстрее, чем то, что вы можете быстро развернуть самостоятельно, и чертовски много более гибко:)

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

...