powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Блокировка строк. (Или другие решения)
5 сообщений из 5, страница 1 из 1
Блокировка строк. (Или другие решения)
    #39707825
Строим крупный парсер. Есть БД с id которые необходимо спарсить. И есть десяток клиентов (серверов) которые обращаются к данной таблице, берут себе список id. и начинают парсить.

Суть в том что очень часто клиентами берется один и тот-же id. Это происходит в 50% случаев)

Пробовал решить проблему методом маркеров, типо сделал селект потом прошел циклом и все записи что выдал селект апдейтнул check = 1, А после того как парсер завершил работу по данным записям апдейтнул на check = 0. Данный способ не решил проблему, но уменьшил количество таких случаев на 20-30% что все равно меня не устраивает.

И тут я узнал о блокировках. Но не понимаю как они используются. Необходимо сделать так чтобы при селекте блокировались строки которые выбрались на 10-15 сек. (для чтения). На сколько это возможно? Или может есть другие варианты решения данной проблемы??

Пример запроса клиента:

SELECT `id`,`id_event` FROM `events` WHERE `time_upd` < '$timeobhod' AND `check `='0' ORDER BY `time_upd` LIMIT 300

ps: Движек таблицы innoDB
...
Рейтинг: 0 / 0
Блокировка строк. (Или другие решения)
    #39707866
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван ФамилияЕсть БД с id которые необходимо спарсить. И есть десяток клиентов (серверов) которые обращаются к данной таблице, берут себе список id. и начинают парсить.Партицировать таблицу. Каждый клиент нехай из своей партиции берет данные.
Не вариант?
...
Рейтинг: 0 / 0
Блокировка строк. (Или другие решения)
    #39707878
vkleИван ФамилияЕсть БД с id которые необходимо спарсить. И есть десяток клиентов (серверов) которые обращаются к данной таблице, берут себе список id. и начинают парсить.Партицировать таблицу. Каждый клиент нехай из своей партиции берет данные.
Не вариант?

Я если честно не очень разбираюсь в партицировании. Но на сколько я понимаю это разбиение таблицы на много мелких таблиц. Это мне кажется совсем не удобным.

т.е. каждому клиенту своя таблица?

А если таблиц != клиентов?

Клиентов сейчас 10, но это количество может постоянно меняться. Какие-то могут отваливаться или прибавляться. т.е. необходимо делать мониторинг клиентов. Системе необходимо будет знать их точное количество. А это все как минимум пара крон задач, что мне совсем не нравится.

Поправьте меня если я что-то не понимаю.
В целом это крайний вариант решения задачи, и как по мне он костыльный.
...
Рейтинг: 0 / 0
Блокировка строк. (Или другие решения)
    #39707902
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван Фамилияразбиение таблицы на много мелких таблицСкорее, несколько частей, работающих как единая таблица.


Иван Фамилият.е. каждому клиенту своя таблицаПартиция, а не таблица! Как вариант, конечно, можно и так распределить. Но оно не слишком гибко, скорее всего, получится.
Можно, например, создать 30 партиций и распределить их на 10 клиентов изначально (добавляете в запросе PARTITION(p0,p1,p2) для первого клиента, PARTITION(p3,p4,p5) для второго и т.д). Будет клиентов больше или меньше - перераспределяете, кому с кем работать.
Разумеется, "нагрузку" между клиентами вряд ли удастся выровнять идеально при жестком назначении. Если у клиентов разная производительность или в партициях по каким-то причинам оказывается сильно разное количество записей, то есть смысл динамически (угу, мониторинг и отдельный слой управления) как-то переназначения делать, особенно, еслиИван ФамилияКлиентов сейчас 10, но это количество может постоянно меняться. Какие-то могут отваливаться или прибавляться.

Иван Фамилияи как по мне он костыльныйНичто не идеально в этом мире, увы. Зато работает без блокировок вообще. А это минус сколько-то запросов.
...
Рейтинг: 0 / 0
Блокировка строк. (Или другие решения)
    #39708137
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван ФамилияПробовал решить проблему методом маркеров, типо сделал селект потом прошел циклом и все записи что выдал селект апдейтнул check = 1, А после того как парсер завершил работу по данным записям апдейтнул на check = 0.Почти правильно. Только нужно в поле check записывать не абстрактную 1, а уникальный идентификатор экземпляра парсера. Т.е. выглядит это так - сначала парсер пробудет зарезервировать себе одну запись на обработку:
Код: sql
1.
2.
3.
4.
UPDATE `table`
SET check = @parser_guid
WHERE check IS NULL
LIMIT 1


После этого он проверяет, что запись удалось зарезервировать:
Код: sql
1.
2.
3.
SELECT id
FROM `table`
WHERE check = @parser_guid


Возможных вариантов 3:
1) Возвращается одна запись. Всё нормально, можно её обрабатывать. По завершении обработки этой записи присваивается значение check, указывающее на то, что запись обработана:
Код: sql
1.
2.
3.
UPDATE `table`
SET check = 0
WHERE id = @id


2) Возвращается ноль записей. Это свидетельствует о том, что одновременно другая копия парсера зарезервировала ту же запись. Возвращаемся к началу и повторяем попытку резервирования.
3) Возвращается более одной записи. Это говорит о том, что ранее был сбой, либо о том, что то же уникальный идентификатор по неизвестной причине присвоен и другой копии парсера. Следует остановиться и привлечь внимание оператора. В зависимости от его решения - либо обработать все возвращённые записи (т.е. оператор проверил, что другой копии парсера с тем же GUID нет, и, вероятно, просто при обработке записи произошёл сбой, и вторая запись в предыдущем сеансе запуска либо не была до конца обработана, либо была обработана, но не была помечена как обработанная), либо оставить эти записи для обработки другой копии и перезапуститься с другим GUID.

Методика требует наличия поля штампа времени, в котором автоматически фиксируется время последнего обновления записи. Это позволит выявлять записи, которые были зарезервированы, но из-за сбоя не обработаны (check > 1 и давность штампа более заданного периода). Такие записи возвращаются в пул для обработки сбросом check в NULL процедурой в периодическом EVENT.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Блокировка строк. (Или другие решения)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]