Поддържане на база данни в синхрон със снимки във файловата система [PHP/Postgresql/Linux]

ПРЕДИСТОРИЯ

Поддържам и съм в процес на реинженеринг на няколко базирани на PHP уеб приложения и има една тема, за която все още не съм намерил елегантно решение, така че търся информация, която може да ме насочи към по-добър начин за направи го.

ТЕКУЩО СЪСТОЯНИЕ

Няколко от моите приложения позволяват на потребителите да съхраняват изображения в допълнение към много данни. Всички данни завършват в PostgreSQL клъстер, но аз избирам да не съхранявам самите изображения в базата данни за производителност и поддръжка. Изображенията получават своите метаданни, съхранени в базата данни (като оригинално име на файл, ширина/височина и т.н.) и след като транзакцията на базата данни е успешна, премествам изображението във файловата система в директория с изображения (съхранена като .jpg).

ПРОБЛЕМЪТ

Всичко това функционира добре, но тъй като приложенията се използват много и от много хора едновременно и през интернет, а обработката на грешки/изключения на PHP не е най-надеждната във всички сценарии, понякога се притеснявам да не съм може да обвие съхраняването на изображението (във файловата система) в транзакцията на базата данни (тъй като се случва във файловата система). Освен това се притеснявам, защото ако файл с изображение се повреди/промени/изтрие във файловата система, записите на базата данни няма да бъдат правилно актуализирани (няма референтна цялост).

РЕШЕНИЯ

Това, което измислих досега, е:

Вариант A) Съхранявайте действителното изображение (не само метаданни, но целия двоичен файл) в базата данни. -- Не съм фен на това, тъй като в момента базата данни, въпреки че е доста сложна, все още е много малка (не повече от 60 MB). Свързаните изображения общо много много GB, така че това ще увеличи отпечатъка на моята PostgreSQL инсталация по масивен начин. Освен това, това ще усложни моите сценарии за архивиране и репликация на база данни.

Вариант B) Запазете текущия дизайн (изображения във файловата система, данни в postgres) и просто се опитайте да отчетете повредените данни на ниво приложение във всяка точка, където се използват. -- Това прави приложението много по-сложно и податливо на грешки.

Вариант В) Намерих PHP ORM рамка, наречена Flourishlib, която съдържа клас на файлова система, който симулира транзакции на файлова система (основно ако извикате $file ->rename() той проверява дали това би било възможно, но всъщност не преименува, докато не ангажирате транзакцията) -- Това е най-доброто решение, което намерих досега, но вече използвам друга ORM рамка (Propel), която ми харесва много повече за проект с такъв размер, така че ще ми трябват 2 рамки с до голяма степен припокриваща се функционалност.

Аааааа

И така, мисля, че много други хора тук ще са се сблъсквали със същия "проблем" преди и съм сигурен, че някои са измислили някои решения, за които все още не съм се сетил. Оценявайте всякакви насоки, съвети или критики.


person Stackhouse    schedule 07.03.2012    source източник
comment
@symcbean Всъщност не, планът е да се възстановят някои от тези приложения от нулата, като се коригират много други проблеми, които съществуват (приложенията започнаха много по-малки и нарастваха стабилно с течение на времето, но добавянето на нови функции към тях влоши цялостното качество) . Така че, тъй като така или иначе ще правя това, има смисъл (за мен така или иначе) да помисля кои други части не са страхотни и да видя дали има по-добър начин да ги изградя.   -  person Stackhouse    schedule 08.03.2012


Отговори (3)


Според мен това са два отделни проблема.

Първо: Как гарантирате почтеност, което вече сте решили по някакъв начин. Единственото нещо, което бих обмислил, е извършването на операцията на файловата система по време на транзакцията на db и връщане назад, ако нещо се обърка. Замяната тук е в производителността, тъй като операциите на файловата система са доста бавни, но не толкова бавни;) Можете да опитате...

Второ: Как запазвате целостта след външни файлови операции. Тук бих предложил да разгледате inotofy с php PHPInotify. Позволява ви да приложите модел на наблюдател, за да получавате известия, когато нещо се промени във файловата система.

person user1254343    schedule 07.03.2012
comment
Да, вероятно сте прав, че това са 2 отделни проблема. Все още не бях чувал за INotify като PHP разширение, може да има нещо там, но моите приложения (както повечето PHP приложения) не са постоянни приложения, но имат кратък живот, обработвайки заявка, изтласквайки някакъв резултат и умирайки. Така че не мисля, че PHPINotify ще свърши много работа там (въпреки това да имаш лек PHP INotify скрипт, работещ постоянно, без глава, поддържан жив, ако се срине, наблюдаващ файловата система за промени -- това може да е полезно) - person Stackhouse; 07.03.2012

Винаги можете да вземете подгрупа на Flourish от страницата за разширено изтегляне. Просто изберете fFile и той ще избере зависимостите. За съжаление автоматичното откриване на зависимости е станало малко неточно с течение на времето (така че ще включва fEmail, което наистина е незадължително), но можете да го изтриете, оставяйки ви с някои класове на файловата система и някои основни/изключения неща.

person wbond    schedule 14.03.2012

Ето моето предложение за вариант D:

  1. Съхранявайте действителното изображение в базата данни (цялата двоична) с неговите метаданни и хеш (вижте Какво използва ли се хеширането на изображения?).

  2. Изградете микроуслуга, отговаряща за конвертирането на двоично изображение от вашата база данни във вашата файлова система или CDN. Чрез сравняване на хешовете тази микроуслуга може да провери целостта на изображението. Може дори да се погрижи за съхраняването на предишни версии и регистрационни файлове. След като транзакцията е извършена, двоичните данни от базата данни могат да бъдат изтрити, за да се запази нейното тегло.

  3. Проектиране на архитектура на опашка за съобщения (с Amazon SQS например) за стартиране и управление на тази микроуслуга. Той ще работи независимо от вашето основно приложение и ще бъде готов да се справи с повреди, поддръжка на база данни, грешки и т.н.

Надявам се това да помогне, дори след 8 години.

person Jonathan Hell    schedule 10.07.2020