Как я вычислял миллионную статью русской Википедии

от автора

1000000Сегодня, 11 мая 2013 года, в 01:41:39.8 UTC (05:41:39.8 московского времени) в русском разделе Википедии появилась миллионная статья. По случайному совпадению, русский раздел именно сегодня отмечает своё 11-летие. Статью Life Extension Foundation создал участник UG72. Уже разгорелись споры о том, имеет ли статья право на жизнь, но тот факт, что рубеж взяла именно она, установлен однозначно.

Счётчик статей в Википедии показывает количество статей, в которых есть хотя бы одна ссылка (существуют и две другие настройки правил). Таким образом, на его значение может повлиять как создание и удаление статей, так и переименование и даже любая правка. Добавим к этому то, что в преддверии юбилея участники начинают массово заливать свои заготовки в надежде, что одна из них всё-таки окажется юбилейной статьёй, и то, что счётчик, как не очень важная обычно вещь, обновляется асинхронно. В итоге вычислить нужную статью становится очень непросто. Но всем же интересно!

Выкрутиться всё-таки можно.


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

У фонда Викимедиа есть Тулсервер — набор серверов, на которые копируются базы данных проектов фонда. Шелл-доступ к ним может запросить любой технически грамотный участник. Получив доступ, ресурсы Тулсервера можно использовать для любых действий, полезных для проектов фонда.

Актуальное значение счётчика статей хранится в базе данных; там же, естественно, находится и информация о новых статьях. Поэтому для фиксации юбилейного момента достаточно опрашивать базу данных несколько раз в секунду, следить за изменениями счётчика и логировать их. Лог выглядит примерно вот так:

 06:05:25.02  999397  Касиски,_Фридрих 06:05:25.51  999398  Касиски,_Фридрих 06:09:02.67  999398  Криволапов,_Григорий_Архипович 06:09:03.32  999399  Криволапов,_Григорий_Архипович 06:10:16.17  999399  Лёгкая_промышленность_России 06:10:18.39  999400  Лёгкая_промышленность_России 

Обычно каждая статья появляется в нём дважды: в первый раз меняется показание поля «Последняя созданная статья», во второй — значение счётчика. Таким образом, например, статья Касиски,_Фридрих была 999398-й.

Сегодня ночью в районе юбилея с доступом к Тулсерверу были проблемы. Следящий скрипт продолжал работать и регистрировать новые статьи, однако значение счётчика было другим! Разобраться, почему так происходит, быстро не получилось. Средства мониторинга говорили, что репликация осуществляется корректно и без задержек. Разница показаний счётчиков медленно плавала в районе 100 статей. Поэтому скрипт пришлось срочно переписать, чтобы он брал данные напрямую с сайта. Работающий с базой экземпляр остался запущенным на всякий случай.

У MediaWiki есть прекрасное API, позволяющее вытащить много интересных данных. К API можно сформулировать запрос, который одновременно вернёт значение счётчика и последние новые страницы:

ru.wikipedia.org/w/api.php?format=jsonfm&meta=siteinfo&action=query&siprop=statistics&list=recentchanges&rctype=new

Нужные данные находятся в полях .query.statistics.articles и .query.recentchanges[0].title. С этими данными нужно делать то же самое — постоянно опрашивать их и логировать любые изменения. Асинхронность счётчика при этом становится заметной в меньшем числе случаев.

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

Статью создали. Три лога в районе миллиона выглядят так:

Тулсервер, данные из копии базы

https://toolserver.org/~kalan/ruwiki-1m.txt

 01:36:32.57  999878  Клавдиево 01:36:32.89  999879  Клавдиево ... 01:41:37.88  999908  Ловно 01:41:38.30  999909  Ловно 01:41:38.49  999909  Кручинин,_Владимир_Фёдорович 01:41:38.93  999909  Калямин,_Вячеслав_Иванович 01:41:39.09  999910  Калямин,_Вячеслав_Иванович 01:41:40.69  999911  Калямин,_Вячеслав_Иванович 01:41:40.75  999911  Life_Extension_Foundation 01:41:40.91  999912  Life_Extension_Foundation 01:41:41.95  999912  Фортыгин,_Виталий_Сергеевич 01:41:42.11  999913  Фортыгин,_Виталий_Сергеевич 01:41:43.07  999913  Император_-_сила 01:41:43.29  999914  Император_-_сила 01:41:43.35  999914  Чертова,_Надежда_Андреевна 01:41:43.97  999915  Glock_21 01:41:44.59  999916  Glock_21 01:41:44.65  999916  Володя_Шишкин 01:41:44.69  999917  Володя_Шишкин ... 01:43:17.60  999935  Бобрик_(станиця) 01:43:17.69  999936  Бобрик_(станиця) 

Тулсервер, данные из API

https://toolserver.org/~kalan/ruwiki-1m-2.txt

 01:36:32.67  999966  Клавдиево 01:36:32.93  999967  Клавдиево ... 01:41:38.01  999997  Ловно 01:41:38.67  999997  Кручинин, Владимир Фёдорович 01:41:39.12  999998  Калямин, Вячеслав Иванович 01:41:39.35  999999  Калямин, Вячеслав Иванович 01:41:39.80  1000000  Life Extension Foundation 01:41:41.12  1000000  Фортыгин, Виталий Сергеевич 01:41:41.56  1000001  Фортыгин, Виталий Сергеевич 01:41:41.79  1000000  Фортыгин, Виталий Сергеевич 01:41:42.00  1000001  Фортыгин, Виталий Сергеевич 01:41:42.63  1000002  Император - сила 01:41:43.09  1000003  Чертова, Надежда Андреевна 01:41:43.32  1000004  Glock 21 01:41:44.22  1000004  Володя Шишкин ... 01:43:17.01  1000023  Бобрик (станиця) 01:43:17.22  1000024  Бобрик (станиця) 

Мой сервер, данные из API

http://v.kalan.cc/ruwiki-1m-2.txt

 01:36:32.72  999966  Клавдиево 01:36:32.96  999967  Клавдиево ... 01:41:37.95  999996  Ловно 01:41:38.19  999997  Ловно 01:41:38.68  999997  Кручинин, Владимир Фёдорович 01:41:38.92  999997  Калямин, Вячеслав Иванович 01:41:39.17  999999  Калямин, Вячеслав Иванович 01:41:39.88  1000000  Life Extension Foundation 01:41:41.25  1000000  Фортыгин, Виталий Сергеевич 01:41:41.73  1000001  Фортыгин, Виталий Сергеевич 01:41:42.68  1000002  Император - сила 01:41:42.92  1000002  Чертова, Надежда Андреевна 01:41:43.14  1000003  Чертова, Надежда Андреевна 01:41:43.38  1000004  Glock 21 01:41:44.32  1000004  Володя Шишкин ... 01:43:17.10  1000023  Бобрик (станиця) 01:43:17.34  1000024  Бобрик (станиця) 

По всем трём логам видно, что рубеж взяла именно статья Life Extension Foundation. По статьям Клавдиево (999967) и Бобрик (станиця) (1000024) можно заключить, что разница показаний счётчиков Тулсервера и самой Википедии в интересующем нас отрезке была равна 88. Под номером 1000000−88=999912 находим, опять-таки, статью Life Extension Foundation.

К счастью, вандальные статьи в этот раз снова пронеслись мимо.

ссылка на оригинал статьи http://habrahabr.ru/post/179337/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *