|
|
|
Блокировка строк. (Или другие решения)
|
|||
|---|---|---|---|
|
#18+
Строим крупный парсер. Есть БД с 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 16:24 |
|
||
|
Блокировка строк. (Или другие решения)
|
|||
|---|---|---|---|
|
#18+
Иван ФамилияЕсть БД с id которые необходимо спарсить. И есть десяток клиентов (серверов) которые обращаются к данной таблице, берут себе список id. и начинают парсить.Партицировать таблицу. Каждый клиент нехай из своей партиции берет данные. Не вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 16:47 |
|
||
|
Блокировка строк. (Или другие решения)
|
|||
|---|---|---|---|
|
#18+
vkleИван ФамилияЕсть БД с id которые необходимо спарсить. И есть десяток клиентов (серверов) которые обращаются к данной таблице, берут себе список id. и начинают парсить.Партицировать таблицу. Каждый клиент нехай из своей партиции берет данные. Не вариант? Я если честно не очень разбираюсь в партицировании. Но на сколько я понимаю это разбиение таблицы на много мелких таблиц. Это мне кажется совсем не удобным. т.е. каждому клиенту своя таблица? А если таблиц != клиентов? Клиентов сейчас 10, но это количество может постоянно меняться. Какие-то могут отваливаться или прибавляться. т.е. необходимо делать мониторинг клиентов. Системе необходимо будет знать их точное количество. А это все как минимум пара крон задач, что мне совсем не нравится. Поправьте меня если я что-то не понимаю. В целом это крайний вариант решения задачи, и как по мне он костыльный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 16:59 |
|
||
|
Блокировка строк. (Или другие решения)
|
|||
|---|---|---|---|
|
#18+
Иван Фамилияразбиение таблицы на много мелких таблицСкорее, несколько частей, работающих как единая таблица. Иван Фамилият.е. каждому клиенту своя таблицаПартиция, а не таблица! Как вариант, конечно, можно и так распределить. Но оно не слишком гибко, скорее всего, получится. Можно, например, создать 30 партиций и распределить их на 10 клиентов изначально (добавляете в запросе PARTITION(p0,p1,p2) для первого клиента, PARTITION(p3,p4,p5) для второго и т.д). Будет клиентов больше или меньше - перераспределяете, кому с кем работать. Разумеется, "нагрузку" между клиентами вряд ли удастся выровнять идеально при жестком назначении. Если у клиентов разная производительность или в партициях по каким-то причинам оказывается сильно разное количество записей, то есть смысл динамически (угу, мониторинг и отдельный слой управления) как-то переназначения делать, особенно, еслиИван ФамилияКлиентов сейчас 10, но это количество может постоянно меняться. Какие-то могут отваливаться или прибавляться. Иван Фамилияи как по мне он костыльныйНичто не идеально в этом мире, увы. Зато работает без блокировок вообще. А это минус сколько-то запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 17:35 |
|
||
|
Блокировка строк. (Или другие решения)
|
|||
|---|---|---|---|
|
#18+
Иван ФамилияПробовал решить проблему методом маркеров, типо сделал селект потом прошел циклом и все записи что выдал селект апдейтнул check = 1, А после того как парсер завершил работу по данным записям апдейтнул на check = 0.Почти правильно. Только нужно в поле check записывать не абстрактную 1, а уникальный идентификатор экземпляра парсера. Т.е. выглядит это так - сначала парсер пробудет зарезервировать себе одну запись на обработку: Код: sql 1. 2. 3. 4. После этого он проверяет, что запись удалось зарезервировать: Код: sql 1. 2. 3. Возможных вариантов 3: 1) Возвращается одна запись. Всё нормально, можно её обрабатывать. По завершении обработки этой записи присваивается значение check, указывающее на то, что запись обработана: Код: sql 1. 2. 3. 2) Возвращается ноль записей. Это свидетельствует о том, что одновременно другая копия парсера зарезервировала ту же запись. Возвращаемся к началу и повторяем попытку резервирования. 3) Возвращается более одной записи. Это говорит о том, что ранее был сбой, либо о том, что то же уникальный идентификатор по неизвестной причине присвоен и другой копии парсера. Следует остановиться и привлечь внимание оператора. В зависимости от его решения - либо обработать все возвращённые записи (т.е. оператор проверил, что другой копии парсера с тем же GUID нет, и, вероятно, просто при обработке записи произошёл сбой, и вторая запись в предыдущем сеансе запуска либо не была до конца обработана, либо была обработана, но не была помечена как обработанная), либо оставить эти записи для обработки другой копии и перезапуститься с другим GUID. Методика требует наличия поля штампа времени, в котором автоматически фиксируется время последнего обновления записи. Это позволит выявлять записи, которые были зарезервированы, но из-за сбоя не обработаны (check > 1 и давность штампа более заданного периода). Такие записи возвращаются в пул для обработки сбросом check в NULL процедурой в периодическом EVENT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2018, 07:48 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=46&tid=1829588]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 367ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...