две недели борьбы ушли не зря
Feb. 11th, 2012 09:06 amзагадка была такая, что вроде в продакшене всё у нас с базами в порядке, а когда я присобачил в фреймуорк чтобы селф-тесты бегали, то эти селф-тесты позорно рушились, причём явление происходило не сразу, а коррелировало с какими-то затратами процессора, с ресурсами памяти...
Короче, я придумал этот аспект,
Что делал - по совету присутствующего товарища
magictoken понатыкал логов в постгрес; ну и свои логи тоже.
Выяснились интересные вещи:
- записи перестают попадать в таблицу после
- лог postgres показывает, что транзакция открывается, данные приходят, транзакция закрывается.
- если не менять код, то наблюдается очень стабильное поведение.
Короче, что выяснилось. В сервере в разных потоках бегают сразу два серверных приложения. Они используют две разные базы данных. В принципе, когда мы получили задание, то в глобальный синглтон складывается рефренс на фабрику "энтити менеджеров" (каждый раз, когда я вижу в коде слово "менеджер", моя рука тянется к кнопке delete). Как только наше приложение садится подождать, пока на его мессагу ответят, просыпается другое приложение (могло бы на другом процессоре работать), и подставляет свой контекст. Мы получаем ответ, просыпаемся, продолжаем движение - складывая наши данные уже в другую базу.
Классический пример ахинеи. Я такую чушь ещё в фортране видал, и в си видал... В Борланде в одной интересной программе пара файлов передавалась в виде имён и рукояток, по иерархии вызовов; иногда, имея имя файла, мы открывали файл снова и передавали новую рукоятку; иногда имена складывалиь в глобальную переменную "имя открытого файла"; таких переменных было несколько - большая программа-то, все хотят а) кешировать, б) делиться знаниями.
Ну и теперь, по какой причине я так долго трахался с этой фигнёй? А отвык на самом деле.
Ну всё, щас я им всё поперелопачу. И логов присандалю, и ООП повпендюриваю, инкапсуляция, адхок полиморфизм, народность.
П.С. Кстати, и в реале менеджеры выполняют похожую роль, кешируют информацию и делятся ею; через пару лет у такого голова полна суеверий и сплетен, и сделать что-либо толковое можно только если ему не говорить. Ну если только он не лезет в твою компетенцию. Инкапсуляция.
Причём, в роли таких "кеширующих менеджеров" вполне может выступать и коллектив коллег (брр, это я Гугл вспоминаю, где мне не давали в джаваскрипте замыкания писать, табулировать списки параметров - аски арт запрещён, а также у них не было нигде места на серверах под 21к моего скрипта).
Короче, я придумал этот аспект,
Health.check("vot tut pocheshite pozhaluista");
, но он не особо помогал. Постепенно локализовал - после queue.wait() вдруг база переставала работать (а данные записывались только частично - но они каждый в своей транзакции). Замена на Thread.sleep() убирала эффект.Что делал - по совету присутствующего товарища
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Выяснились интересные вещи:
- записи перестают попадать в таблицу после
queue.wait()
;- лог postgres показывает, что транзакция открывается, данные приходят, транзакция закрывается.
- если не менять код, то наблюдается очень стабильное поведение.
Короче, что выяснилось. В сервере в разных потоках бегают сразу два серверных приложения. Они используют две разные базы данных. В принципе, когда мы получили задание, то в глобальный синглтон складывается рефренс на фабрику "энтити менеджеров" (каждый раз, когда я вижу в коде слово "менеджер", моя рука тянется к кнопке delete). Как только наше приложение садится подождать, пока на его мессагу ответят, просыпается другое приложение (могло бы на другом процессоре работать), и подставляет свой контекст. Мы получаем ответ, просыпаемся, продолжаем движение - складывая наши данные уже в другую базу.
Классический пример ахинеи. Я такую чушь ещё в фортране видал, и в си видал... В Борланде в одной интересной программе пара файлов передавалась в виде имён и рукояток, по иерархии вызовов; иногда, имея имя файла, мы открывали файл снова и передавали новую рукоятку; иногда имена складывалиь в глобальную переменную "имя открытого файла"; таких переменных было несколько - большая программа-то, все хотят а) кешировать, б) делиться знаниями.
Ну и теперь, по какой причине я так долго трахался с этой фигнёй? А отвык на самом деле.
Ну всё, щас я им всё поперелопачу. И логов присандалю, и ООП повпендюриваю, инкапсуляция, адхок полиморфизм, народность.
П.С. Кстати, и в реале менеджеры выполняют похожую роль, кешируют информацию и делятся ею; через пару лет у такого голова полна суеверий и сплетен, и сделать что-либо толковое можно только если ему не говорить. Ну если только он не лезет в твою компетенцию. Инкапсуляция.
Причём, в роли таких "кеширующих менеджеров" вполне может выступать и коллектив коллег (брр, это я Гугл вспоминаю, где мне не давали в джаваскрипте замыкания писать, табулировать списки параметров - аски арт запрещён, а также у них не было нигде места на серверах под 21к моего скрипта).