Почему так много программистов абсолютно ненавидят уровни распространенности объектов?

9

Распространенность - это простая методика предоставления свойств ACID объектной модели в памяти, основанной на двоичной сериализации и записи в журнал с опережением записи. Это работает так:

  • Начните со снимка. Сериализуйте объектную модель и запишите ее в файл.
  • Создайте файл журнала. Для каждого вызова в объектной модели сериализуйте вызов и его аргументы.
  • Когда журнал становится слишком большим, вы закрываете, или в противном случае удобно выполнить контрольную точку: написать новый снимок и обрезать журнал.
  • Чтобы выполнить откат или восстановление после сбоя или сбоя питания, загрузите последний снимок и повторите все вызовы, записанные в журнале.

Меры предосторожности, необходимые для выполнения этой работы:

  • Не позволяйте ссылкам изменяемого объекта скрываться или входить в уровень распространенности. Вам нужна какая-то схема прокси или OID, как если бы вы делали RPC. (Это такая распространенная ошибка новичка, ее прозвали « проблема крещения ».)
  • Вся логика, достижимая при вызове, должна быть полностью детерминированной и не должна выполнять значимые для бизнес-логики вызовы ввода-вывода или ОС. Запись в диагностический журнал, вероятно, в порядке, но получение системного времени или запуск асинхронного делегата, как правило, не так. Это делается для того, чтобы журнал воспроизводился одинаково, даже если он восстановлен на другом компьютере или в другое время. (Большая часть кода распространенности предоставляет альтернативный вызов времени для получения метки времени транзакции.)
  • Писательский параллелизм вносит двусмысленность в интерпретацию журнала, поэтому он запрещен.

Это потому что ...

  • люди разработали плохой вкус к ним после попытки использовать его в проекте, который не очень подходил * для него?
  • Резкая пропаганда Клауса Вюстефельда оттеснила людей ?
  • люди, которым нравится модель императивного программирования, не любят отделять ввод-вывод от вычислений , предпочитая вместо этого чередовать вычисления с входами-выходами и потоками?
  • Уровни распространенности настолько концептуально просты и настолько тесно связаны с характеристиками структуры, в которой они обитают, что они обычно создаются специально для проекта, что делает их слишком чуждыми / нестандартными / рискованными?
  • просто слишком сложно говорить прямо, что нужно быть осторожным, чтобы не делать?
  • Головы новичков, кажется, просто взрываются, когда сталкиваются с чем-то, что не является тем же самым двухуровневым приложением на основе базы данных, которое они научились писать в школе? ;)

* В всем наборе данных умещается в оперативной памяти , вам не нужен писатель параллелизм, и вам не нужно делать специальные запросы, отчеты или экспорт в хранилище данных. Извиняясь перед SQLite, распространенность - это улучшение файлов сохранения, а не замена Oracle.

Джеффри Хантин
источник
Ага. Я задавался вопросом, было ли у этого имя. Это всегда имело смысл, у меня просто не было названия для этого.
Greyfade
9
О чем ты говоришь?
TheLQ 23.09.10
Я впервые слышу об этом. Что это?
Джонн
Объяснение добавлено.
Джеффри Хантин
1
Оооо ... Я знаю концепцию, но я никогда не делал этого раньше. Выглядит довольно изящно для меня. Я уверен, что это не то, что многие разработчики "абсолютно ненавидят".
Джонн

Ответы:

6

Я думаю, что проблема в том, что у них ОЧЕНЬ конкретный вариант использования (ваша неподходящая причина). Я построил и работал над системами, которые используют этот подход, и когда у вас есть проблема, которая на самом деле является этой проблемой, это может быть прекрасным решением.

Другая часть заключается в том, что это выглядит очень похоже на некоторые из самых болезненных фрагментов пользовательского хранилища данных, которые вы использовали много лет назад, и имеет некоторые из тех же подводных камней (например, пакетное обновление btreive), которые привносят «слишком индивидуальный» пункт, но также затрудняет поиск частей полки, которые вежливо с ней работают.

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

Билл
источник
11

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

Стивен Эверс
источник
Да, я немного запутался. Они выглядят как отличный инструмент, если вы используете их по правильной причине.
Мэтт Оленик
Я просто говорю это, потому что я получил поразительное количество горя по этому поводу от коллег.
Джеффри Хантин
1
@ Джеффри Хантин: Они звучат лениво и закрыто.
Стивен Эверс
1
Да, и фактическим краеугольным камнем паттерна является c2.com/cgi/wiki?TransactionTape
Джеффри Хантин
4

Ответ на этот вопрос заключается в том, что, хотя теория проста, практика не так.

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

Любой монитор транзакций, такой как CICS, Tuxedo, Weblogic, Websphere, JBOSS или .NET, предоставит все эти средства в чистом и проверенном виде. И любая база данных обеспечит «достаточное» количество транзакций / постоянство для большинства приложений.

В основном это тот случай, когда колесо было изобретено и усовершенствовано очень давно.

Джеймс Андерсон
источник
это и тенденция многих «архитекторов» иметь один излюбленный «аромат», на который они надеются протолкнуть что-либо, независимо от того, насколько неуместен этот дизайн для проблемы, которую необходимо решить.
jwenting
@jwenting Так что это подпадает под пункт «резкой пропаганды»?
Джеффри Хантин
2

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

Уайетт Барнетт
источник