Уважаемые представители коллективного разума, помогите пожалуйста разобраться.
Задача:
Есть проект, в который входит несколько клиентских приложений (WinForms) для работы с одними и теми же данными — общая БД.
Сейчас принято решение иметь так же одно серверное приложение содержащее либо только слой доступа к данным, либо еще всю или часть бизнес-логики. В сервере в качестве DAL будет использоваться NHibernate с включенным кэшем.
(Решение о централизованном сервере может быть изменено в случае наличия удовлетворительных аргументов.) Общая проблема:
Наличие коллизий при работе разных клиентов с одними и теми же данными. Т.е., например, оба клиента получили объект, изменили его и отправили обновлять на сервер — в результате произойдет только одно изменение.
Решение N1:
В БД на каждую сущность завести поле с версией сущности, что отразить в маппинге NHibernate.
Основная последовательность:
Клиенты запрашивают у сервера объекты, сервер отдает клиентам отцепленные от кэша сессии объекты. Клиенты их модифицируют и передают для обновления серверу. Сервер пытается прицепить отцепленные объекты и проапдейтить их. В случае если версия объекта не изменилась, апдейтит их, иначе — бросает исключение, клиент его ловит и сообщает пользователю об изменении объекта, пользователь обновляет свой объект и снова пытается его модифицировать, это повторяется пока не будет достигнут успех. Проблемы решения N1:
1. Вполне может потребоваться некое DTO (представляющее из себя смесь части данных разных объектов) в узких местах, как это DTO реализовывать и как отслеживать его версии? В принципе это не очень критично, но все же очень интересно.
2. Не понятно как реализовать пользовательский интефейс:
а) либо делать кнопку "Save", которую пользователь должен нажимать для применения изменений, что на мой взгляд не удобно т.к.:
— пользователь может забыть это сделать;
— возникает необходимость хранить список изменений или передавать все потенциально измененные объекты;
— не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет
очень не рад вспоминать что он делал и переделывать.
б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе,
не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать.
3. Не может ли произойти параллельное увеличение версии объекта на 1 без обнаружения коллизии? Т.е. сервер получает два запроса на обновление одного и того же объекта и пытается (параллельно, в разных потоках) увеличить версию объекта с 1.0 до 1.1, при этом увеличение происходит одновременно и безконфликтно, в результате чего опять-таки происходит только одно измение, которое затирает результат другого изменения. Понятно, что на практике это очень маловероятно, но все же. Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности.
Решение N2:
Сразу скажу, что это решение я до конца не понял, однако как альтернативу то же хотелось бы рассмотреть.
Решение заключается в том, чтобы каждый объект требуемый клиенту маршалить из сервера на клиент по ссылке. Решение нацелено на то, чтобы устранить проблему неактуальности данных на клиенте. Т.е. получается, что на клиенте всегда будет ссылка на актуальный объект. При этом, как я понимаю, на клиенте перед каждой операцией нужно будет лочить объект и проверять, что его состояние не изменилось с момента последнего чтения, после чего обновлять и разлочивать. Проблемы (и вопросы) решения N2:
1. до конца не понятен механизм разруливания коллизий и возможные сложности;
2. как работать с временем жизни объектов?
3. как быть, если клиент на некоторое время отвалиться от соединения с сервером?
4. будут ли маршалиться NHibernatе'овские прокси?
Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки.
зы Спасибо за внимание!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re: Архитектура приложения с несколькими клиентами и одним с
Здравствуйте, Ocenochka, Вы писали:
O> 2. Не понятно как реализовать пользовательский интефейс: O> а) либо делать кнопку "Save", которую пользователь должен нажимать для применения изменений, что на мой взгляд не удобно т.к.: O> — пользователь может забыть это сделать;
Дык отслеживайте изменения, например если клиент хочет закрыть форму или перейти на другую закладку, то проверяйте, были ли сделаны изменения, и если да — сообщайте об этом пользователю с предложением сохранить/не сохранять/отменить действие.
O> — возникает необходимость хранить список изменений или передавать все потенциально измененные объекты;
Смотрите тему http://rsdn.ru/forum/design/3367411.flat.aspx
O> — не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет O> очень не рад вспоминать что он делал и переделывать.
Не нужно все переделывать, нужно оставить введенные изменения пользователя и сообщить ему в чем конкретно ошибка.
O> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать.
Это просто неправильно так делать.
Re: Архитектура приложения с несколькими клиентами и одним с
Ocenochka, вы чего-то не договариваете. Давайте про предметную область,
потому что непонятно вообще с чего городить весь этот огород с
собственным сервером баз данных.
Posted via RSDN NNTP Server 2.1 beta
Всё, что нас не убивает, ещё горько об этом пожалеет.
Re: Архитектура приложения с несколькими клиентами и одним с
Здравствуйте, Ocenochka, Вы писали:
O>Уважаемые представители коллективного разума, помогите пожалуйста разобраться.
O> Задача: O> Есть проект, в который входит несколько клиентских приложений (WinForms) для работы с одними и теми же данными — общая БД. O> Сейчас принято решение иметь так же одно серверное приложение содержащее либо только слой доступа к данным, либо еще всю или часть бизнес-логики. В сервере в качестве DAL будет использоваться NHibernate с включенным кэшем. O> (Решение о централизованном сервере может быть изменено в случае наличия удовлетворительных аргументов.) O> Общая проблема: O> Наличие коллизий при работе разных клиентов с одними и теми же данными. Т.е., например, оба клиента получили объект, изменили его и отправили обновлять на сервер — в результате произойдет только одно изменение.
Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
O> Решение N1: O> В БД на каждую сущность завести поле с версией сущности, что отразить в маппинге NHibernate. O> Основная последовательность: O> Клиенты запрашивают у сервера объекты, сервер отдает клиентам отцепленные от кэша сессии объекты. Клиенты их модифицируют и передают для обновления серверу. Сервер пытается прицепить отцепленные объекты и проапдейтить их. В случае если версия объекта не изменилась, апдейтит их, иначе — бросает исключение, клиент его ловит и сообщает пользователю об изменении объекта, пользователь обновляет свой объект и снова пытается его модифицировать, это повторяется пока не будет достигнут успех.
И ты предлагаешь держать открытой сессию, пока клиент редактирует объект? Масштабируемость будет нулевая.
O> Проблемы решения N1: O> 1. Вполне может потребоваться некое DTO (представляющее из себя смесь части данных разных объектов) в узких местах, как это DTO реализовывать и как отслеживать его версии? В принципе это не очень критично, но все же очень интересно.
А зачем остлеживать его версии? Одного concurrency token не достаточно (за него вполне можно взять rowversion поле)?
O> 2. Не понятно как реализовать пользовательский интефейс: O> а) либо делать кнопку "Save", которую пользователь должен нажимать для применения изменений, что на мой взгляд не удобно т.к.:
Только так и надо делть.
O> — пользователь может забыть это сделать;
Ему можно напомнить.
O> — возникает необходимость хранить список изменений или передавать все потенциально измененные объекты;
Тебе в любом случае придется changeset формировать, вопрос только в том где и как это делать.
O> — не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет O> очень не рад вспоминать что он делал и переделывать.
Я скажу по секрету, что ты сможешь нарваться на конфликты изменений, которые не будут отловлены твоим механизмом.
O> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать.
Это буде работать мееееееееееееееедленно. ты ведь забыл что кроме отправки на каждое действие данных на сервер тебе придется передавать изменения на все клиенты или хранить раздельно клиентские сессии.
O>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности.
В таком решении ты найдешь тысячи граблей, с которыми будешь долго бороться.
O> Решение N2: O> Сразу скажу, что это решение я до конца не понял, однако как альтернативу то же хотелось бы рассмотреть. O> Решение заключается в том, чтобы каждый объект требуемый клиенту маршалить из сервера на клиент по ссылке. Решение нацелено на то, чтобы устранить проблему неактуальности данных на клиенте. Т.е. получается, что на клиенте всегда будет ссылка на актуальный объект. При этом, как я понимаю, на клиенте перед каждой операцией нужно будет лочить объект и проверять, что его состояние не изменилось с момента последнего чтения, после чего обновлять и разлочивать. O> Проблемы (и вопросы) решения N2: O> 1. до конца не понятен механизм разруливания коллизий и возможные сложности; O> 2. как работать с временем жизни объектов? O> 3. как быть, если клиент на некоторое время отвалиться от соединения с сервером? O> 4. будут ли маршалиться NHibernatе'овские прокси?
Это худший вариант развития событий.
1)На любое дергание объекта придется бегать на сервер
2)Все изменения надо передавать клиентам
3)Проблемы с контролем времени жизни
O> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки.
Оба неадекваты на 99%
Re: Архитектура приложения с несколькими клиентами и одним с
Concurrency control — штука довольно сильно зависящая от предметной области. Мне вот как-то везёт на задачки, когда либо ответственность за изменение данных расписана по людям (и пересечений нет), либо подходит last wins.
Лично я за явный save + возможные проверки перед сохранением. Из опыта людям реально привычно работать в режиме "набросал-поправил-сохранил".
Задача получения изменений в принципе решается легко для внесённых/изменённых строк. С удалёнными строками либо передача всех локальных id на сервер, либо хранение id удалённых строк в вспомогательных табличках на сервере.
На второй вариант забейте сразу.
Re: Архитектура приложения с несколькими клиентами и одним с
Здравствуйте, Ocenochka, Вы писали:
O>Уважаемые представители коллективного разума, помогите пожалуйста разобраться.
O> Решение N2: O> Сразу скажу, что это решение я до конца не понял, однако как альтернативу то же хотелось бы рассмотреть. O> Решение заключается в том, чтобы каждый объект требуемый клиенту маршалить из сервера на клиент по ссылке. Решение нацелено на то, чтобы устранить проблему неактуальности данных на клиенте. Т.е. получается, что на клиенте всегда будет ссылка на актуальный объект. При этом, как я понимаю, на клиенте перед каждой операцией нужно будет лочить объект и проверять, что его состояние не изменилось с момента последнего чтения, после чего обновлять и разлочивать. O> Проблемы (и вопросы) решения N2: O> 1. до конца не понятен механизм разруливания коллизий и возможные сложности; O> 2. как работать с временем жизни объектов? O> 3. как быть, если клиент на некоторое время отвалиться от соединения с сервером? O> 4. будут ли маршалиться NHibernatе'овские прокси?
O> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки.
O>зы Спасибо за внимание!
День добрый. Не знаю насколько практично маршалить все объекты по ссылке, не разу с таким не сталкивался, но как то настараживает
По существу. Ваши два решения мне напоминают решения с песимистической и оптиместической блокировкой.
В первом случае мы оптимистично надеемся, что никто кроме нас не будет редактировать объект и проверяем это только перед применением изменений. При этом все изменения мы применяем в одной транзакции, чтобы не получилось, что часть изменений прошла, а часть нет. Думаю в NHibernate транзакции есть...
Во втором случае, мы перед тем как приступить к редактированию лочим объект и не отпускаем его до завершения редактирования. В таком случае, мы всегда уверены, что никто не изменил наш объект в то время как мы его редактировали. Возможный выход клиента залочившего объект и не отпустившего блокировку лечится установкой таймаутов.
Минусы первого решения, нужно с минимальными трудозатратами будет показывать пользователю как изменился объект, чтобы он решил перетирать сохраненые другим пользователем данные или нет. Эту проблему вы и сами озвучали.
Минусы второго решения, пользователи не очень любять наблюдать сообщение : "данный объект редактирует другой, пользователь. дождидесь завершения."
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, MozgC, Вы писали:
O>> 2. Не понятно как реализовать пользовательский интефейс: O>> а) либо делать кнопку "Save", которую пользователь должен нажимать для применения изменений, что на мой взгляд не удобно т.к.: O>> — пользователь может забыть это сделать; MC>Дык отслеживайте изменения, например если клиент хочет закрыть форму или перейти на другую закладку, то проверяйте, были ли сделаны изменения, и если да — сообщайте об этом пользователю с предложением сохранить/не сохранять/отменить действие.
Не очень понимаю как отслеживать изменения. Допустим на клиенте грид с коллекцией объектов. При редактировании в отдельную коллекцию складывать отредактированные объекты? А как порядок редактирования учитывать?
O>> — возникает необходимость хранить список изменений или передавать все потенциально измененные объекты; MC>Смотрите тему http://rsdn.ru/forum/design/3367411.flat.aspx
Прочитал. Понял не много и легче не стало. Врапперы над сущностями и их коллекциями — это круто. Не совсем представляю как это будет в случае с несколькими клиентами. DataSet то же не хотелось бы, не то, чтобы я сильно религиозен, но мозги придется перекраивать сновательно.
O>> — не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет O>> очень не рад вспоминать что он делал и переделывать. MC>Не нужно все переделывать, нужно оставить введенные изменения пользователя и сообщить ему в чем конкретно ошибка.
А последовательность изменений не учитывать? Если пятая операция из 10 не прошла, то, на мой взгляд, логично откатить все 10. Соответственно, пользователю прдется переделывать все 10.
O>> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O>> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать. MC>Это просто неправильно так делать.
Не правильно делать категоричные заявления без аргументов Ясно, что производительность и отзывчивость могут пострадать, если клиентов будет много, а сервер далеко, но есть подозрение, что дело не в этом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ромашка, Вы писали:
Р>Ocenochka, вы чего-то не договариваете.
Конечно, я целое тз на ~100 стр. недоговариваю тз писал не я и я в него его еще толком не углублялся, однако основные моменты с несколькими клиентами уже известны.
Р>Давайте про предметную область, потому что непонятно вообще с чего городить весь этот огород с собственным сервером баз данных.
Предметная область, на мой взгляд, не имеет значения. Могу сказать, что это не чистые финансы, но такие объекты как "Клиент" и "Счет" имеются.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
Прошу кратко аргументировать. Или дать ссылку на развернутое объяснение желательно с минимумом терминологии (она у каждого своя) и с примерами.
O>> Решение N1: O>> В БД на каждую сущность завести поле с версией сущности, что отразить в маппинге NHibernate. O>> Основная последовательность: O>> Клиенты запрашивают у сервера объекты, сервер отдает клиентам отцепленные от кэша сессии объекты. Клиенты их модифицируют и передают для обновления серверу. Сервер пытается прицепить отцепленные объекты и проапдейтить их. В случае если версия объекта не изменилась, апдейтит их, иначе — бросает исключение, клиент его ловит и сообщает пользователю об изменении объекта, пользователь обновляет свой объект и снова пытается его модифицировать, это повторяется пока не будет достигнут успех. G>И ты предлагаешь держать открытой сессию, пока клиент редактирует объект? Масштабируемость будет нулевая.
Зачем? Можно их в новой сессии апдейтить. Только проверять сначала версию.
O>> Проблемы решения N1: O>> 1. Вполне может потребоваться некое DTO (представляющее из себя смесь части данных разных объектов) в узких местах, как это DTO реализовывать и как отслеживать его версии? В принципе это не очень критично, но все же очень интересно. G>А зачем остлеживать его версии? Одного concurrency token не достаточно (за него вполне можно взять rowversion поле)?
Как раз с помощью rowversion и отслеживать — средствами nhibernate.
O>> 2. Не понятно как реализовать пользовательский интефейс: O>> а) либо делать кнопку "Save", которую пользователь должен нажимать для применения изменений, что на мой взгляд не удобно т.к.: G>Только так и надо делть.
Мой мозг требует аргументов
O>> — не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет O>> очень не рад вспоминать что он делал и переделывать. G>Я скажу по секрету, что ты сможешь нарваться на конфликты изменений, которые не будут отловлены твоим механизмом.
Можно на маленьком примере пояснить? Как могут конфликты не быть отловлены, если каждая сущность имеет версию?
O>> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O>> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать. G>Это буде работать мееееееееееееееедленно. ты ведь забыл что кроме отправки на каждое действие данных на сервер тебе придется передавать изменения на все клиенты или хранить раздельно клиентские сессии.
А почему нельзя на клиентов выгружать "оторваные" данные и пытаться их апдейтить с учетом версии? Без наличия обратной связи, т.е. чтобы на клиентах разрешались неактуальные данные пока не потребуется внести изменения.
O>>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности. G>В таком решении ты найдешь тысячи граблей, с которыми будешь долго бороться.
Пока не вижу у нас единого взгляда на это решение, учитывая заданные мне вопросы.
G>Это худший вариант развития событий. G>1)На любое дергание объекта придется бегать на сервер G>2)Все изменения надо передавать клиентам G>3)Проблемы с контролем времени жизни
Я и сам не склонен к этому варианту.
O>> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки. G>Оба неадекваты на 99%
Предлагайте!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Sinix, Вы писали:
S>Ух какая благодарная тема-то
Ох и не говорите Это со стороны может весело, а мне делать надо и сроки есть
S>Concurrency control — штука довольно сильно зависящая от предметной области. Мне вот как-то везёт на задачки, когда либо ответственность за изменение данных расписана по людям (и пересечений нет), либо подходит last wins.
К сожалению, не мой случай, хотя может пересечений между разными клиентами будет не так много...
S>Лично я за явный save + возможные проверки перед сохранением. Из опыта людям реально привычно работать в режиме "набросал-поправил-сохранил". S>Задача получения изменений в принципе решается легко для внесённых/изменённых строк. С удалёнными строками либо передача всех локальных id на сервер, либо хранение id удалённых строк в вспомогательных табличках на сервере.
Тут логика понятно, но как это реализовывать? На клиенте держать список(списки) изменений — это ладно. А на сервер передавать то же этот список? Или на сервере только методы по редактированию, а клиент сам знает логику работы со списком измененных и дергает нужные методы сервера?
Предлагаю сделать шаг назад и убрать все принятые архитектурные решения относительно единого сервера и наличия NHibernate. Задача:
Есть несколько клиентских приложений для работы с общими данными. Нужно исключить коллизии при одновременной работе пользователей. Вариант 1.
Разрешить на клиентах иметь оторванные от БД данные и проверять их актуальность при изменении. Вариант 2.
Пытаться всеми силами держать на клиентах только актуальные данные.
В первом варианте недостатком является "относительно небольшая" возможность введения пользователя в заблуждение и необходимость контролировать версии оторванных от БД объектов при применении изменений.
Во втором случае контроль коллизий остается, а заблуждение пользователя устаняется необходимостью работы с DataSet'ами и написание общирной инфраструктуры для поддержания данных на клиенте в актуальном состоянии.
Мне ближе первый вариант, поэтому хотелось бы обсудить его, хотя второй вариант то же интересен, если кто-то скажет что успешно его реализовывал и поделится реализацией некоторых непонятных моментов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Ocenochka написав(ла): > Предметная область, на мой взгляд, не имеет значения. Могу сказать, что > это не чистые финансы, но такие объекты как "Клиент" и "Счет" имеются.
И ты ради таких объектов, как "Клиент" и "Счет", собрался городить весь
геморрой с трехзвенкой? Зачем? У тебя шансов нарваться на коллизию ноль
целых ноль десятитысячных.
Posted via RSDN NNTP Server 2.1 beta
Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> К сожалению, не мой случай, хотя может пересечений между разными клиентами будет не так много...
Гммм... а что у вас за случай-то такой страшный?
[offtop]
Спорно конеш, но пересечение больших unit of work чаще всего говорит о бардаке на предприятии.
[/offtop]
O> Тут логика понятно, но как это реализовывать?
Сервер сам решает, можно ли перезаписывать данные и кидает исключение в случае чего.
Или фильтр UPDATE...WHERE...ver=@oldVersion и проверять @@ROWCOUNT.
Клиент ловит исключение — дальше по обстоятельствам. Скорее всего, диалог пользователю -> частичный Upsert и продолжение/перезапуск транзакции (лично я за перезапуск).
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ромашка, Вы писали:
Р>И ты ради таких объектов, как "Клиент" и "Счет", собрался городить весь Р>геморрой с трехзвенкой? Зачем? У тебя шансов нарваться на коллизию ноль Р>целых ноль десятитысячных.
Расскажите это заказчику, к которому будут идти недовольные клиенты
К тому же, вероятность зависит от многих параметров, таких как степень перекрещивания данных
между клиентскими приложениями и частота вносимых изменений.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Ocenochka, Вы писали:
O>> К сожалению, не мой случай, хотя может пересечений между разными клиентами будет не так много... S>Гммм... а что у вас за случай-то такой страшный?
Даже не знаю как рассказать... Довольно специфично, думаю никто тут не сталкивался с этой предметной областью. Давайте считать, что это продажа билетов на самолеты с дополнительными услугами. Например, клиенту можно продать кроме самого полета еще и обед, а можно скидку сделать. При этом число доп. услуг ограничено и билеты мужду двумя точками могут иметь разную стоимость и разную траекторию полета. Примерно так. Т.е. продажа пакетов взаимосвязанных услуг.
Не хочется завязываться на конкретные условия, т.к. они часто изменчивы и то, что не нужно сегодня может потребоваться завтра, а переписывать из-за этого всю архитектуру... сами понимаете.
S>[offtop] S>Спорно конеш, но пересечение больших unit of work чаще всего говорит о бардаке на предприятии. S>[/offtop]
Потенциально, размер "unit of work" не большой и зависит, как я понимаю, от количества сделанных пользователем изменений до нажатия кнопки "Save".
O>> Тут логика понятно, но как это реализовывать? S>Как варинант (выше уже писали): S>http://msdn.microsoft.com/ru-ru/library/ms182776.aspx S>Запоминать rowersion и передавать этот обратно при сохранении изменений. S>Сервер сам решает, можно ли перезаписывать данные и кидает исключение в случае чего. S>Или фильтр UPDATE...WHERE...ver=@oldVersion и проверять @@ROWCOUNT. S>Клиент ловит исключение — дальше по обстоятельствам. Скорее всего, диалог пользователю -> частичный Upsert и продолжение/перезапуск транзакции (лично я за перезапуск).
Здравствуйте, Ocenochka, Вы писали:
O> Вариант 1. O> Разрешить на клиентах иметь оторванные от БД данные и проверять их актуальность при изменении.
Они все равно будут оторваные, вопрос только в том, насколько часто обновляются. Возможно достаточно ручного обновления, как сделано в браузере. Частота обновления определяется требованиями. Актуальность при изменении придется проверять в любом случае. Ибо вариант сохранения изменений в удаленном кем-то другим объекте все равно весьма вероятен. Что делать в таких случаях все равно определяют требования к приложению.
O> Вариант 2. O> Пытаться всеми силами держать на клиентах только актуальные данные.
Что значит акутальные? Актуальные они только в базе, за ее пределами уже актуальности нет.
Здравствуйте, Ziaw, Вы писали:
O>> Вариант 1. O>> Разрешить на клиентах иметь оторванные от БД данные и проверять их актуальность при изменении. Z>Они все равно будут оторваные, вопрос только в том, насколько часто обновляются. Возможно достаточно ручного обновления, как сделано в браузере. Частота обновления определяется требованиями. Актуальность при изменении придется проверять в любом случае. Ибо вариант сохранения изменений в удаленном кем-то другим объекте все равно весьма вероятен. Что делать в таких случаях все равно определяют требования к приложению.
Согласен, имелось ввиду, что за счет значительного уменьшения времени обновления (обратная связь) данные будут крайне редко находится в неактуальном состоянии.
O>> Вариант 2. O>> Пытаться всеми силами держать на клиентах только актуальные данные. Z>Что значит акутальные? Актуальные они только в базе, за ее пределами уже актуальности нет.
Значит, что будет механизм обратной связи от БД — в случае изменеия данных на сервере клиенты будут об этом уведомляться.
Здравствуйте, Ocenochka, Вы писали:
O> Значит, что будет механизм обратной связи от БД — в случае изменеия данных на сервере клиенты будут об этом уведомляться.
Не завидую человеку редактирющему постоянно обновляемый документ. Не завидую программисту пишущему УИ для этого.
Вобщем я к чему — это сложно написать и с этим будет неприятно работать, какие плюсы это дает, чтобы перевести такие минусы?
Здравствуйте, Ziaw, Вы писали:
O>> Значит, что будет механизм обратной связи от БД — в случае изменеия данных на сервере клиенты будут об этом уведомляться. Z>Не завидую человеку редактирющему постоянно обновляемый документ. Не завидую программисту пишущему УИ для этого. Z>Вобщем я к чему — это сложно написать и с этим будет неприятно работать, какие плюсы это дает, чтобы перевести такие минусы?
Плюс один — наличие актуальных данных на клиентах. Вообще-то, я согласен, но хочется рассмротреть все варианты пока есть возможность.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka
O>Даже не знаю как рассказать... Довольно специфично, думаю никто тут не сталкивался с этой предметной областью. Давайте считать, что это продажа билетов на самолеты с дополнительными услугами.
Хотите расскажу страшную тайну?
РЖД довольно долго резервировало за отдельными регионами диапазоны билетов и переодически делало синхронизацию. Учитесь
А для вашего сценария давно придуманы блокировки намерения: вы говорите серверу "я зарезервировал этот ресурс тогда-то" и периодически обновляете время "захвата". Захват кем-то другим возможен по истечении интервала, который заведомо больше интервала обновления. Для красоты можно прикрутить сборку мусора по расписанию.
То есть вы говорите "я собираюсь использовать такие-то ресурсы, честное слово", а все остальные клиенты радостно вам верят и ничего не портят
Аппсервер вам ничем не поможет в плане когерентности данных. Наоборот отхватите проблем. // Не-не, никакого холивара. Я говорю только о concurrency management силами аппсервера.
O>Потенциально, размер "unit of work" не большой и зависит, как я понимаю, от количества сделанных пользователем изменений до нажатия кнопки "Save".
Некорректно выразился. Важен не размер а продолжительность.
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Sinix, Вы писали:
O>>Даже не знаю как рассказать... Довольно специфично, думаю никто тут не сталкивался с этой предметной областью. Давайте считать, что это продажа билетов на самолеты с дополнительными услугами. S>Хотите расскажу страшную тайну? S>РЖД довольно долго резервировало за отдельными регионами диапазоны билетов и переодически делало синхронизацию. Учитесь
А как насчет поддержания в актуальном состоянии базы внутри региона? Если разные кассы параллельно продают билеты из одного зарезервированного диапазона?
S>А для вашего сценария давно придуманы блокировки намерения: вы говорите серверу "я зарезервировал этот ресурс тогда-то" и периодически обновляете время "захвата". Захват кем-то другим возможен по истечении интервала, который заведомо больше интервала обновления. Для красоты можно прикрутить сборку мусора по расписанию.
Не совсем представляю как применить это в моем случае. У меня резервирование равносильно продаже, потому как регион только один.
S>Аппсервер вам ничем не поможет в плане когерентности данных. Наоборот отхватите проблем. // Не-не, никакого холивара. Я говорю только о concurrency management силами аппсервера.
Аппсервер по-идее должен помочь быстродействию наличием единого и непротиворичивого кэша.
Вообще, я сам пока не вижу причин, почему на каждом клиенте не иметь свой кэш, раз уж все равно данные оторваны от БД. А кэш обновлять по мере необходимости. Или вообще не иметь кэша — все равно все операции редактирования (insert/update/delete) нужно будет отправлять в БД по требованию.
O>>Потенциально, размер "unit of work" не большой и зависит, как я понимаю, от количества сделанных пользователем изменений до нажатия кнопки "Save". S>Некорректно выразился. Важен не размер а продолжительность.
Подолжительность то же не большая — обновить массив из 10-100 (ну максимум 1000) объектов в БД.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>>>Потенциально, размер "unit of work" не большой и зависит, как я понимаю, от количества сделанных пользователем изменений до нажатия кнопки "Save". S>>Некорректно выразился. Важен не размер а продолжительность.
O> Подолжительность то же не большая — обновить массив из 10-100 (ну максимум 1000) объектов в БД.
Речь не о скорости обновления, а о том что пользователь мог начать редактировать и уехать на обед не закончив.
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, samius, Вы писали:
O>> Подолжительность то же не большая — обновить массив из 10-100 (ну максимум 1000) объектов в БД. S>Речь не о скорости обновления, а о том что пользователь мог начать редактировать и уехать на обед не закончив.
Придет с обеда и не сможет сделать "Save", потому что другие клиенты уже отредактируют данные и их версия изменится. В терминологии это звучит как песимистическая блокировка. В оптимистической блокировке можно таймаут сделать и опять-таки обламать ушедшего на обед. Другими словами, в моем случае такой клиент не прав. Общие данные не будут большими документами, а только бизнес-сущностями с несколькими, ну может десятками, свойств.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> А как насчет поддержания в актуальном состоянии базы внутри региона? Если разные кассы параллельно продают билеты из одного зарезервированного диапазона?
Гммм... вообще-то это был стёб на тему как делать не надо — разделение на диапазоны работало крайне отвратительно (никакого отношения к РЖД не имею, источник тоже давно оттуда ушёл — в 2004-м вроде).
O> Не совсем представляю как применить это в моем случае. У меня резервирование равносильно продаже, потому как регион только один.
У вас дело в том чтобы не продать один и тот же ресурс несколько раз, так?
Так вот. Когда вы начинаете обслуживать реального клиента (человека), вы ставите блокировку намерения ("щас продам!") и периодически её изменяете.
Если вам не удалось поставить блокировку — вы не можете ничего продать и всё
Учтите, что тут не совсем блокировка с точки зрения СУБД, это тупо флажок "зарезервировано для продажи".
O> Аппсервер по-идее должен помочь быстродействию наличием единого и непротиворичивого кэша.
Зачем вам единый кэш сдался и как аппсервер может тут помочь? Вам надо чтобы продавцы видели все свободные ресурсы в каждый момент времени?
Аппсервер даёт выигрыш в масштабировании за счёт того что все сессии не хранят состояние. Как только вы начинаете согласовывать состояния разных клиентов, вы получаете обратно проблемы с блокировками и прощай масштабируемость. Быстродействие одного клиента от аппсервера не выиграет никак.
S>>Некорректно выразился. Важен не размер а продолжительность. O> Подолжительность то же не большая — обновить массив из 10-100 (ну максимум 1000) объектов в БД.
Ухх... продолжительность не save а всего сеанса обслуживания — вам же придётся держать блокировку намерения всё время чтобы никто не отобрал у вас ресурс.
O> Вообще, я сам пока не вижу причин, почему на каждом клиенте не иметь свой кэш, раз уж все равно данные оторваны от БД. А кэш обновлять по мере необходимости. Или вообще не иметь кэша — все равно все операции редактирования (insert/update/delete) нужно будет отправлять в БД по требованию.
Всё что я писал не отменяет кэша — это просто способ захвата свободных ресурсов без удержания сессии.
Приведите в общем последовательность действий когда вы получите конфликт при сохранении. И посмотрите что будет если резервировать ресурсы по мере необходимости.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Придет с обеда и не сможет сделать "Save", потому что другие клиенты уже отредактируют данные и их версия изменится. В терминологии это звучит как песимистическая блокировка.
При пессимистической блокировке другие клиенты не смогут отредактировать документ, пока уехавший на обед не сделает Save или Cancel. А тот сценарий который ты описал — оптимистический.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Мы уже победили, просто это еще не так заметно...
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
Тем, что требует DTO для передачи данных?
Я на досуге подумал и пришел к такому выводу. Различие между тонкой и жирной моделью лишь в способе получения DTO. То, что называется тонком моделю по сути моделью не является, это DTO, моделью для которых служит БД. Поэтому зачастую с тонкой моделью легко уживается логика в БД (логика в модели). В жирной модели между БД и приложением появляется еще один слой — модель предметной области, которая реально является моделью, которую разработать не проще чем модель физического процесса и оправдывает она себя лишь на каком-то пороге сложности предметной области.
У нее полно минусов, она очень неоптимально использует СУБД, нам требуется трекать изменения сделанные клиентом, чтобы проапдейтить эту модель. Но, грамотно построенная, она не позволяет нарушить ни одного бизнес правила и дает максимально полный интерфейс для работы над собой.
Вобщем Фаулер и Эванс не пропагандируют overarchitect, они лишь рассказыват как подняться на еще одну ступеньку в борьбе со сложностью продукта. Любой такой шаг не бесплатен и любой оправдан лишь в тех случаях, когда без него гораздо хуже.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Ocenochka, Вы писали:
O>> А как насчет поддержания в актуальном состоянии базы внутри региона? Если разные кассы параллельно продают билеты из одного зарезервированного диапазона? S>Гммм... вообще-то это был стёб на тему как делать не надо — разделение на диапазоны работало крайне отвратительно (никакого отношения к РЖД не имею, источник тоже давно оттуда ушёл — в 2004-м вроде).
В начале подумал, что стеб, а потом решил, что "не мог же ржд работать не правильно"
O>> Не совсем представляю как применить это в моем случае. У меня резервирование равносильно продаже, потому как регион только один. S>У вас дело в том чтобы не продать один и тот же ресурс несколько раз, так?
А так же в том, чтобы не продать ресурс, который был изменен.
S>Так вот. Когда вы начинаете обслуживать реального клиента (человека), вы ставите блокировку намерения ("щас продам!") и периодически её изменяете. S>Если вам не удалось поставить блокировку — вы не можете ничего продать и всё S>Учтите, что тут не совсем блокировка с точки зрения СУБД, это тупо флажок "зарезервировано для продажи".
В моем случае, не критично, если кассир скажет, что билет есть, начнет процедуру введения данных пользователя а в итоге (при нажатии на кнопку "Save") обломится, потому что-то кто-то успеет продать этот билет раньше. Таких случаев наверняка будет не много. Хотя лочить продаваемый билет при начале ввода данных то же хороший вариант, только требующий дополнительных усилий.
O>> Аппсервер по-идее должен помочь быстродействию наличием единого и непротиворичивого кэша. S>Зачем вам единый кэш сдался и как аппсервер может тут помочь? Вам надо чтобы продавцы видели все свободные ресурсы в каждый момент времени?
Да
S>Аппсервер даёт выигрыш в масштабировании за счёт того что все сессии не хранят состояние. Как только вы начинаете согласовывать состояния разных клиентов, вы получаете обратно проблемы с блокировками и прощай масштабируемость. Быстродействие одного клиента от аппсервера не выиграет никак.
Под масштабированием подразумевается увеличение числа клиентов?
S>>>Некорректно выразился. Важен не размер а продолжительность. O>> Подолжительность то же не большая — обновить массив из 10-100 (ну максимум 1000) объектов в БД. S>Ухх... продолжительность не save а всего сеанса обслуживания — вам же придётся держать блокировку намерения всё время чтобы никто не отобрал у вас ресурс.
Если правильно понял, то подразумевается что-то вроде продолжительности оформления продажи? Нет, не большая продолжительность.
O>> Вообще, я сам пока не вижу причин, почему на каждом клиенте не иметь свой кэш, раз уж все равно данные оторваны от БД. А кэш обновлять по мере необходимости. Или вообще не иметь кэша — все равно все операции редактирования (insert/update/delete) нужно будет отправлять в БД по требованию.
S>Всё что я писал не отменяет кэша — это просто способ захвата свободных ресурсов без удержания сессии. S>Приведите в общем последовательность действий когда вы получите конфликт при сохранении. И посмотрите что будет если резервировать ресурсы по мере необходимости.
Кажется я понял, вы предлагаете пессимистическую блокировку вместо оптимистической? Т.е. не редактировать данные с последующей попыткой их обновить с неизвестным исходом, а лочить данные на время обновления, чтобы другие считали их занятыми, чтобы таким образом свести к минимуму обломы при обновлении измененных данных?
Т.е. придется обновлять данные не только после процедуры оформления, но и перед, чтобы убедиться, что ресурс не занят и занять его?
Да, в случае длительных операций с большим числом ввода данных от пользователя это имеет смысл, согласен.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, IB, Вы писали:
O>> Придет с обеда и не сможет сделать "Save", потому что другие клиенты уже отредактируют данные и их версия изменится. В терминологии это звучит как песимистическая блокировка. IB>При пессимистической блокировке другие клиенты не смогут отредактировать документ, пока уехавший на обед не сделает Save или Cancel. А тот сценарий который ты описал — оптимистический.
Ясно, спасибо, различие и плюсы обоих случаев уловил.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
G>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос. Z>Тем, что требует DTO для передачи данных?
Думаю в большинстве случаев можно передавать объекты domain model. Логика не должна, на мой взгляд, в них содержаться.
Z>Я на досуге подумал и пришел к такому выводу. Различие между тонкой и жирной моделью лишь в способе получения DTO. То, что называется тонком моделю по сути моделью не является, это DTO, моделью для которых служит БД. Поэтому зачастую с тонкой моделью легко уживается логика в БД (логика в модели). В жирной модели между БД и приложением появляется еще один слой — модель предметной области, которая реально является моделью, которую разработать не проще чем модель физического процесса и оправдывает она себя лишь на каком-то пороге сложности предметной области. Z>У нее полно минусов, она очень неоптимально использует СУБД, нам требуется трекать изменения сделанные клиентом, чтобы проапдейтить эту модель.
Тут все об одном и том же — о производительности, с чем я согласен, однако, всем известно, что проще купить лишний сервер, чем поддерживать запутанную архитектуру. Поэтому я и написал, что в моем понимании адекватность реализации оценивается не скоростью работы, а в первую очередь временем написания/отладки/поддержки.
Z>Но, грамотно построенная, она не позволяет нарушить ни одного бизнес правила и дает максимально полный интерфейс для работы над собой. Z>Вобщем Фаулер и Эванс не пропагандируют overarchitect, они лишь рассказыват как подняться на еще одну ступеньку в борьбе со сложностью продукта. Любой такой шаг не бесплатен и любой оправдан лишь в тех случаях, когда без него гораздо хуже.
Согласен, однако рассуждения на эту тему плохо вписываются в топик
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> В начале подумал, что стеб, а потом решил, что "не мог же ржд работать не правильно"
А почему? Наоборот очень полезно искать косяки у авторитетов — у них как правило и косяки покруче обычных.
O> В моем случае, не критично, если кассир скажет, что билет есть, начнет процедуру введения данных пользователя а в итоге (при нажатии на кнопку "Save") обломится.
Неее, это со стороны как жуткий отстой смотрится: "ой, у нас система не работает" против "вы знаете, все билеты разобраны"
Усилия здесь окупятся — там работы на 5 минут — добавить метод TryReserveResource и обновлять блокировку по памяти.
O>>> Аппсервер по-идее должен помочь быстродействию наличием единого и непротиворичивого кэша. S>>Зачем вам единый кэш сдался и как аппсервер может тут помочь? Вам надо чтобы продавцы видели все свободные ресурсы в каждый момент времени?
O> Да
А зачем им — пользователь должен выбирать? Тогда в 2 этапа — при начале обслуживания забираете свободные ресурсы, а потом перебором пытаетесь лочить
O> Под масштабированием подразумевается увеличение числа клиентов?
Да
O> Если правильно понял, то подразумевается что-то вроде продолжительности оформления продажи? Нет, не большая продолжительность.
Ага. Тогда всё вообще классно — достаточно в принципе загрузки данных в начале работы + проверки при сохранении.
O> Кажется я понял, вы предлагаете пессимистическую блокировку вместо оптимистической? Т.е. не редактировать данные с последующей попыткой их обновить с неизвестным исходом, а лочить данные на время обновления, чтобы другие считали их занятыми, чтобы таким образом свести к минимуму обломы при обновлении измененных данных?
Тут не совсем пессимистическая блокировка — последняя подразумевает удержание сессии и полную невозможность поломать состояние. А вариант с "зарезервировано" дешевле в плане масштабируемости, но уязвимей к некорретному изменению данных. Но да, нечто похожее.
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
G>>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос. Z>>Тем, что требует DTO для передачи данных?
O> Думаю в большинстве случаев можно передавать объекты domain model. Логика не должна, на мой взгляд, в них содержаться.
Мы до сих пор говорим о жирной модели? Этот термин был придуман IB и означал модель, классы которой содержат логику, в отличии от тощей, в которой объекты служат лишь хранилищем данных.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinix, Вы писали:
O>> В начале подумал, что стеб, а потом решил, что "не мог же ржд работать не правильно" S>А почему? Наоборот очень полезно искать косяки у авторитетов — у них как правило и косяки покруче обычных.
Мне поиска косяков у себя хватает Хотя иногда все же пускаюсь в рассуждения относительно того как сделано у "авторитетов", но скорее для развлечения и поиска дыр, чем действительно с желанием досконально рзобраться ибо в абсолютном большинстве случаем до правды докопаться не удается.
O>> В моем случае, не критично, если кассир скажет, что билет есть, начнет процедуру введения данных пользователя а в итоге (при нажатии на кнопку "Save") обломится.
S>Неее, это со стороны как жуткий отстой смотрится: "ой, у нас система не работает" против "вы знаете, все билеты разобраны"
Скорее так: "Ой, а этот билет только что кто-то уже купил, хотите другой?". К тому же это будет происходить крайне редко, скорее всего.
S>Усилия здесь окупятся — там работы на 5 минут — добавить метод TryReserveResource и обновлять блокировку по памяти.
Вообще да, согласен.
O>>>> Аппсервер по-идее должен помочь быстродействию наличием единого и непротиворичивого кэша. S>>>Зачем вам единый кэш сдался и как аппсервер может тут помочь? Вам надо чтобы продавцы видели все свободные ресурсы в каждый момент времени? O>> Да S>А зачем им — пользователь должен выбирать? Тогда в 2 этапа — при начале обслуживания забираете свободные ресурсы, а потом перебором пытаетесь лочить
Ну да, как то так.
O>> Под масштабированием подразумевается увеличение числа клиентов? S>Да
Ясно, согласен.
O>> Если правильно понял, то подразумевается что-то вроде продолжительности оформления продажи? Нет, не большая продолжительность. S>Ага. Тогда всё вообще классно — достаточно в принципе загрузки данных в начале работы + проверки при сохранении. O>> Кажется я понял, вы предлагаете пессимистическую блокировку вместо оптимистической? Т.е. не редактировать данные с последующей попыткой их обновить с неизвестным исходом, а лочить данные на время обновления, чтобы другие считали их занятыми, чтобы таким образом свести к минимуму обломы при обновлении измененных данных? S>Тут не совсем пессимистическая блокировка — последняя подразумевает удержание сессии и полную невозможность поломать состояние. А вариант с "зарезервировано" дешевле в плане масштабируемости, но уязвимей к некорретному изменению данных. Но да, нечто похожее.
А как можно некорректно изменить данные, которые имеют версию? Два лока сделать одновременно ведь не удасться даже теоретически, на сколько я понимаю.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
G>>>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос. Z>>>Тем, что требует DTO для передачи данных? O>> Думаю в большинстве случаев можно передавать объекты domain model. Логика не должна, на мой взгляд, в них содержаться. Z>Мы до сих пор говорим о жирной модели? Этот термин был придуман IB и означал модель, классы которой содержат логику, в отличии от тощей, в которой объекты служат лишь хранилищем данных.
Нет, я говорил о тонкой модели Другую пока не признаю, всю не примитивную логику не связанную непосредственно со свойствами выношу в отдельные сервисы или вообще отдельно, чтобы моделировать сложную предметную область, хотя с таким пока сталкиваться не приходилось — обходился всегда тонкой моелью.
Здравствуйте, Ocenochka, Вы писали:
O> Вариант 1. O> Разрешить на клиентах иметь оторванные от БД данные и проверять их актуальность при изменении.
O> В первом варианте недостатком является "относительно небольшая" возможность введения пользователя в заблуждение и необходимость контролировать версии оторванных от БД объектов при применении изменений.
Если я правильно понимаю, что вам предстоит делать, то я бы мог предложить такое развитие первого варианта.
При запросе данных о билетах у вас уже сразу есть естественный фильтр по направлению полета или даже по конкретному рейсу. Результат запроса с учетом этого фильтра вы можете кешировать, но автоматически обновлять его не надо. Предоставьте просто возможность обновить его целиком по требованию пользователя. Но при этом, когда пользователь начнет редактировать/бронировать конкретый билет, вы на автомате обновите информацию только по этому билету (может быть и блокировку на него сразу навесите — это повкусу). Главное не надо стараться обновлять постоянно все закешированные данные.
Здравствуйте, ilvi, Вы писали:
O>> Вариант 1. O>> Разрешить на клиентах иметь оторванные от БД данные и проверять их актуальность при изменении.
O>> В первом варианте недостатком является "относительно небольшая" возможность введения пользователя в заблуждение и необходимость контролировать версии оторванных от БД объектов при применении изменений.
I>Если я правильно понимаю, что вам предстоит делать, то я бы мог предложить такое развитие первого варианта. I>При запросе данных о билетах у вас уже сразу есть естественный фильтр по направлению полета или даже по конкретному рейсу. Результат запроса с учетом этого фильтра вы можете кешировать, но автоматически обновлять его не надо. Предоставьте просто возможность обновить его целиком по требованию пользователя. Но при этом, когда пользователь начнет редактировать/бронировать конкретый билет, вы на автомате обновите информацию только по этому билету (может быть и блокировку на него сразу навесите — это повкусу). Главное не надо стараться обновлять постоянно все закешированные данные.
Ocenochka написав(ла): > *Задача:* > Есть несколько клиентских приложений для работы с общими данными. Нужно > исключить коллизии при одновременной работе пользователей. > *Вариант 1.* > Разрешить на клиентах иметь оторванные от БД данные и проверять их > актуальность при изменении. > *Вариант 2.* > Пытаться всеми силами держать на клиентах только актуальные данные.
Вариант 3.
Разрешить на клиентах иметь оторванные от БД данные, но при возможности
их изменения не давать их изменять другим клиентам. То есть, открывая на
изменение объект "Счет", лочить его на уровне бизнес-логики или БД.
Перед открытием проверять не залочен ли он.
> Мне ближе первый вариант, поэтому хотелось бы обсудить его, хотя второй > вариант то же интересен, если кто-то скажет что успешно его реализовывал > и поделится реализацией некоторых непонятных моментов.
Тут все равно остается вопрос про актуальность данных при критических
операциях. Например, перед формированием, скажем, налоговой накладной
необходимо проверять, не изменились ли атрибуты объекта "Клиент".
Posted via RSDN NNTP Server 2.1 beta
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Ocenochka, Вы писали:
O> однако, всем известно, что проще купить лишний сервер, чем поддерживать запутанную архитектуру.
Поубивал бы тех, кто пустил эту фразу в народ
Мало того, что перекладывание своих проблем на кошелек заказчика, так еще святая вера в то, что просто добавление еще одного сервера улучшит производительность. А какие изменения в архитектуру ПО вы собираетесь вносить, чтобы ваше приложение хотя бы не стало медленей работать от добавления еще одного сервера?
Здравствуйте, ilvi, Вы писали:
O>> однако, всем известно, что проще купить лишний сервер, чем поддерживать запутанную архитектуру. I>Поубивал бы тех, кто пустил эту фразу в народ I>Мало того, что перекладывание своих проблем на кошелек заказчика,
А разработчики, типа, бесплатно будут ковыряться в кривой архитектуре? Хорошо, если найдете адекватного и согласного копаться в существующем решении Месяц работы 1 разработчика примерно равен стоимости хорошего сервера, а то и двух.
I>так еще святая вера в то, что просто добавление еще одного сервера улучшит производительность.
При наличии соответствующей архитектуры — улучшит. Именно поэтому хорошая архитектура — "залог здоровья". А в условиях активного развития средств виртуализации и без правельной архитектуры может улучшить, на сколько я понимаю.
I>А какие изменения в архитектуру ПО вы собираетесь вносить, чтобы ваше приложение хотя бы не стало медленей работать от добавления еще одного сервера?
Ну чтобы заработало и при этом медленнее чем было — это надо постараться
СУБД вроде хорошо масштабируются, web и win сервисы то же, конечно правильно написаные. Конечно, может быть централизованная архитектура, которая ни чего не даст при покупке дополнительного сервера, но я это не рассматривал — это крайний случай.
зы Еще одна фраза "выпущенная в народ": девять женщин не родят ребенка за один месяц
Что в тематике форума будет звучать, как "9 месяцев работы одного программиста не равны одному месяцу работы 9 программистов в проекте на 9 чел./мес."
Это к вопросу увеличения производительности при добавлении разработчиков и при добавлении серверов
Здравствуйте, Ромашка, Вы писали:
Р>Вариант 3. Р>Разрешить на клиентах иметь оторванные от БД данные, но при возможности Р>их изменения не давать их изменять другим клиентам. То есть, открывая на Р>изменение объект "Счет", лочить его на уровне бизнес-логики или БД. Р>Перед открытием проверять не залочен ли он.
Спасибо, уже рассмотрели. Это скорее разновидность первого варианта.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, gandjustas, Вы писали:
G>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
O>Прошу кратко аргументировать. Или дать ссылку на развернутое объяснение желательно с минимумом терминологии (она у каждого своя) и с примерами.
Описанные проблемы обоих решений — уже аргумент.
O>>> 2. Не понятно как реализовать пользовательский интефейс: O>>> а) либо делать кнопку "Save", которую пользователь должен нажимать для применения изменений, что на мой взгляд не удобно т.к.: G>>Только так и надо делть. O> Мой мозг требует аргументов
O>>> — не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет O>>> очень не рад вспоминать что он делал и переделывать. G>>Я скажу по секрету, что ты сможешь нарваться на конфликты изменений, которые не будут отловлены твоим механизмом.
O> Можно на маленьком примере пояснить? Как могут конфликты не быть отловлены, если каждая сущность имеет версию?
Спокойно. Версия не будет проверяться если не было никаких изменений. Если у вас корректность данных зависит от совокупности сущностей и один клиент меняет одну, а другой — другую, то такой конфликт не может быть отловлен.
O>>> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O>>> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать. G>>Это буде работать мееееееееееееееедленно. ты ведь забыл что кроме отправки на каждое действие данных на сервер тебе придется передавать изменения на все клиенты или хранить раздельно клиентские сессии. O> А почему нельзя на клиентов выгружать "оторваные" данные и пытаться их апдейтить с учетом версии? Без наличия обратной связи, т.е. чтобы на клиентах разрешались неактуальные данные пока не потребуется внести изменения.
А в какой момент мерджить изменения? Наверное при нажатии save, но в таком случае и передавать на сервер не надо.
Если не save, то постоянная обратная связь со всеми вытекающими.
O>>>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности. G>>В таком решении ты найдешь тысячи граблей, с которыми будешь долго бороться. O> Пока не вижу у нас единого взгляда на это решение, учитывая заданные мне вопросы.
А ты подробнее распиши задачу и покажи свои наработки. Создавать сферическую архитектуру в вакууме не получится.
O>>> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки. G>>Оба неадекваты на 99% O> Предлагайте!
Сделать кнопку Save, по которой сохранять изменения.
Далее 3 варианта:
1)Локальная реплика БД, которая хранит измененные данные (dataset или SQL CE) и периодическая синхронизация с сервером (передача changeset датасета или Sync Services для SQL CE)
2)Написать кучу сервисов и DTO
3)Воспользоваться EF\Linq2SQL+ADO.NET Data Services
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, gandjustas, Вы писали:
G>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
Z>Тем, что требует DTO для передачи данных?
Не только.
Z>Я на досуге подумал и пришел к такому выводу. Различие между тонкой и жирной моделью лишь в способе получения DTO.
Различий гораздо больше.
Пример — нужно получить список заказов с адресом клиента и фамилией менеджера, отвественного за заказ.
В жирной модели надо загрузить список заказов, для каждого заказа надо загрузить полный объект менеджера и клиента.
Z>То, что называется тонком моделю по сути моделью не является, это DTO, моделью для которых служит БД.
Это бред воспаленного сознания.
ER-модели (модели данных) начали применяться гораздо раньше, чем ООП. Стройная модель — как раз отражение модели данных в программе.
Причеем между моделью данных и схемой хранения может быть достаточно нетривиальынй маппинг.
Z>Поэтому зачастую с тонкой моделью легко уживается логика в БД (логика в модели).
Смысл этой фразы для меня остался загадкой.
Z>В жирной модели между БД и приложением появляется еще один слой — модель предметной области, которая реально является моделью, которую разработать не проще чем модель физического процесса и оправдывает она себя лишь на каком-то пороге сложности предметной области.
Практика показывает обратное. На каком-то пороге сложности domain model перестает оправдывать себя.
Z>У нее полно минусов, она очень неоптимально использует СУБД, нам требуется трекать изменения сделанные клиентом, чтобы проапдейтить эту модель. Но, грамотно построенная, она не позволяет нарушить ни одного бизнес правила и дает максимально полный интерфейс для работы над собой.
Это за счет чего достигается? Магией чтоли?
И что вообще означает "не позволяет нарушить ни одного бизнес правила", если программа чего-то такого допускает, то это бага.
Кстати, а что означает "дает максимально полный интерфейс для работы над собой"?
Z>Вобщем Фаулер и Эванс не пропагандируют overarchitect, они лишь рассказыват как подняться на еще одну ступеньку в борьбе со сложностью продукта.
Угу, борьба со сложностью способом увеличения сложности — замечательно.
Z>Любой такой шаг не бесплатен и любой оправдан лишь в тех случаях, когда без него гораздо хуже.
Пример такого случая будет?
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, Ziaw, Вы писали:
G>>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос. Z>>Тем, что требует DTO для передачи данных?
O> Думаю в большинстве случаев можно передавать объекты domain model. Логика не должна, на мой взгляд, в них содержаться.
Тогда это будет не domain model
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос. O>>Прошу кратко аргументировать. Или дать ссылку на развернутое объяснение желательно с минимумом терминологии (она у каждого своя) и с примерами. G>Описанные проблемы обоих решений — уже аргумент.
Проблемы первого решения для меня еще не являются агрументом для отказа от domain model.
O>>>> — не ясно как разруливать конфликт при серии изменений в которых только одно изменение было неудачно — пользователь будет O>>>> очень не рад вспоминать что он делал и переделывать. G>>>Я скажу по секрету, что ты сможешь нарваться на конфликты изменений, которые не будут отловлены твоим механизмом. O>> Можно на маленьком примере пояснить? Как могут конфликты не быть отловлены, если каждая сущность имеет версию? G>Спокойно.
Интересно, что в моем предложении заставило вас считать, что я не спокоен?
G>Версия не будет проверяться если не было никаких изменений. Если у вас корректность данных зависит от совокупности сущностей и один клиент меняет одну, а другой — другую, то такой конфликт не может быть отловлен.
Если один клиент меняет одну сущность, а другой другую то в момент применения изменений это выясниться блягодаря наличию версии объекта.
O>> А почему нельзя на клиентов выгружать "оторваные" данные и пытаться их апдейтить с учетом версии? Без наличия обратной связи, т.е. чтобы на клиентах разрешались неактуальные данные пока не потребуется внести изменения. G>А в какой момент мерджить изменения?
Да, при нажатии на Save, однако, мержить не выйдет — только потеря изменений, обновление и последующая попытка изменения. Ну может получится смержить, но это отдельная проблема, которую пока можно не рассматривать.
G>Наверное при нажатии save, но в таком случае и передавать на сервер не надо.
Как не надо? А как об изменении смогут узнать другие клиенты?
G>Если не save, то постоянная обратная связь со всеми вытекающими.
Обратная связь относится к решению N2. Как организовать такое решение я пока что не услышал. Выгружать на каждого клиента датасеты и городить соответственную инфраструктуру, на мой взгляд, много сложнее, тем более, что это все равно не спасет от проверки версий объектов, не говоря уже о проблемах, когда клиенты теряют связь с сервером.
O>>>>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности. G>>>В таком решении ты найдешь тысячи граблей, с которыми будешь долго бороться. O>> Пока не вижу у нас единого взгляда на это решение, учитывая заданные мне вопросы. G>А ты подробнее распиши задачу и покажи свои наработки.
Задача занимает сейчас около 100 стр. при этом я не могу понять что даст раскрытие ньюансов конкретной предметной области. Премер я уже приводил. Наработки еще не закончены, однако есть четкое представление архитектуры.
G>Создавать сферическую архитектуру в вакууме не получится.
Однако, глядя на ваши ответы, я считаю, что у вас это вполне получается Без обид. Просто я не вижу у вас понимания решения N1. То, что вы пробовали городить dataset'ы — это я уже выяснил и то что опыта с orm и domain model не имели то же выяснил
O>>>> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки. G>>>Оба неадекваты на 99% O>> Предлагайте! G>Сделать кнопку Save, по которой сохранять изменения. G>Далее 3 варианта: G>1)Локальная реплика БД, которая хранит измененные данные (dataset или SQL CE) и периодическая синхронизация с сервером (передача changeset датасета или Sync Services для SQL CE)
В задаче сказано, что БД — одна.
G>2)Написать кучу сервисов и DTO
Это зачем и к чему?
G>3)Воспользоваться EF\Linq2SQL+ADO.NET Data Services
Каким образом?
Есть четкая задача, которую я обозначил дважды, повторю еще раз: есть два клиента, работающих с общей БД. Как реализовать их работу при отсутствии коллизий?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
O>> Думаю в большинстве случаев можно передавать объекты domain model. Логика не должна, на мой взгляд, в них содержаться. G>Тогда это будет не domain model
Жду определения
Вы же сами называли это тонкой domain model.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, gandjustas, Вы писали:
O>>> Думаю в большинстве случаев можно передавать объекты domain model. Логика не должна, на мой взгляд, в них содержаться. G>>Тогда это будет не domain model
O> Жду определения O> Вы же сами называли это тонкой domain model.
Обычно под понятием domain model понимают rich. Потому что фаулер в своей книге именно так и описал.
Re: Архитектура приложения с несколькими клиентами и одним с
Здравствуйте, Ocenochka, Вы писали:
O>Уважаемые представители коллективного разума, помогите пожалуйста разобраться.
O> Задача: O> Есть проект, в который входит несколько клиентских приложений (WinForms) для работы с одними и теми же данными — общая БД. O> Сейчас принято решение иметь так же одно серверное приложение содержащее либо только слой доступа к данным, либо еще всю или часть бизнес-логики. В сервере в качестве DAL будет использоваться NHibernate с включенным кэшем. O> (Решение о централизованном сервере может быть изменено в случае наличия удовлетворительных аргументов.) O> Общая проблема: O> Наличие коллизий при работе разных клиентов с одними и теми же данными. Т.е., например, оба клиента получили объект, изменили его и отправили обновлять на сервер — в результате произойдет только одно изменение.
O> Решение N1:
O> Решение N2:
O> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки.
O>зы Спасибо за внимание!
Добрый день.
Хочу попробовать помочь, высказав свои соображения.
Прежде всего, вариант N2 следует отмести как нереализуемый -- уж очень много всяких косяков там вылезает: начиная от проблем с проксями NHibernate и заканчивая сбоями сети. Кроме того, работа по сети в таком случае выльется в безобразные тормоза на клиенте.
Итак, остается вариант №1, которым обычно и пользуются при написании 3хзвенок.
Чтобы претворить его в жизнь, нужно:
1) Определиться с генератором DTO: будет он или вы сами будете гонять отсоединенные объекты (DTO можно готовить и руками, но лучше взять что-либо типа otis lib);
2) Кнопка Save в вашем случае -- отличное решение; нужно только определиться с сеансами редактирования (т.е. где эти кнопки будут находиться и каковы будут участки, работа на которых идет от сохранения до сохранения;
3) Определиться с тем, как вы будете решать конфликты одновременного обновления: пессимистический вариант и оптимистический, соотственно.
В случае пессимистического вы не допускаете конфликтов -- при помощи транзакций БД(хардкор, но иногда допустим или на уровне бизнес-транзакций (т.н. conversation), помечая и блокируя бизнес-объекты , находящиеся в редактировании;
В случае оптимистического варианта вы решаете разруливать конфликты одновременного обновления по факту обнаружения таких конфликтов. Вариантов здесь а)затирать старые изменения (игнорируем конфликт) б) не давать затирать при помощи проверки версии (NHibernate вам в помощь) и просить пользователя внести вторично правку в устаревшие данные в) реализовать стратегию merge данных, если данные могут быть объединены без логического конфликта
Ничего не мешает сочетать эти варианты, согласуясь с другими критериями. Да, и ответ на ваш вопрос -- NHibernate сам умеет поддерживать версии объекта, так что коллизий не будет; если вам интересно, я напишу следующим сообщением, почему описанная вами ситуация не случится.
4) Определитесь со стратегией кеша и провайдером кеша (не все из них поддерживают блокировку объектов!). Со своей стороны могу порекомендовать SharedCache.net, ибо пробовал, понравилось; memcached не пробовал, но буду в след. проекте;
5) Определиться со стратегией выработки Id(PK) для бизнес-объектов -- некоторые, например, identity, плохо совместимы с NHibernate 2nd level cache.
Если заинтересовало, пишите, продолжим обсуждение трудностей и подводных камней.
Re[5]: Архитектура приложения с несколькими клиентами и одни
G>>Наверное при нажатии save, но в таком случае и передавать на сервер не надо. O> Как не надо? А как об изменении смогут узнать другие клиенты?
Сам же написал что без обратной связи. Тогда зачем до save куда-то что-то передавать?
O>>>>>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности. G>>>>В таком решении ты найдешь тысячи граблей, с которыми будешь долго бороться. O>>> Пока не вижу у нас единого взгляда на это решение, учитывая заданные мне вопросы. G>>А ты подробнее распиши задачу и покажи свои наработки.
O> Задача занимает сейчас около 100 стр. при этом я не могу понять что даст раскрытие ньюансов конкретной предметной области. Премер я уже приводил. Наработки еще не закончены, однако есть четкое представление архитектуры.
Может дать очень много потому что единственное что сейчас видят люди на форуме — это твое трактование предметной области.
G>>Создавать сферическую архитектуру в вакууме не получится.
O> Однако, глядя на ваши ответы, я считаю, что у вас это вполне получается Без обид. O>Просто я не вижу у вас понимания решения N1.
Это у тебя нету понимания решения N1, я такие решения в разных видах уже делал.
O>То, что вы пробовали городить dataset'ы — это я уже выяснил
Мимо. Как раз решения с dataset я предпочитаю не городить, я один раз начал такое делать и быстро отказался.
O>и то что опыта с orm и domain model не имели то же выяснил
Совсем мимо. С orm работаю постоянно и даже свой писал.
Хреновый из тебя телепат.
O>>>>> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки. G>>>>Оба неадекваты на 99% O>>> Предлагайте! G>>Сделать кнопку Save, по которой сохранять изменения. G>>Далее 3 варианта: G>>1)Локальная реплика БД, которая хранит измененные данные (dataset или SQL CE) и периодическая синхронизация с сервером (передача changeset датасета или Sync Services для SQL CE) O> В задаче сказано, что БД — одна.
И что? SQL CE — несколько dll и больше ничего не надо
G>>2)Написать кучу сервисов и DTO O> Это зачем и к чему?
Ко всему. Если клиент не толстый, то лучше увеличить гранулярность обращения к серверу. Для этого потребуется метод сервиса и вероятнее всего DTO.
G>>3)Воспользоваться EF\Linq2SQL+ADO.NET Data Services O> Каким образом?
Создть модель в EF дизайнере, создать сервис ADO.NET, сделать клиент.
O> Есть четкая задача, которую я обозначил дважды, повторю еще раз: есть два клиента, работающих с общей БД. Как реализовать их работу при отсутствии коллизий?
Наверное при наличии коллизий. Варианта как всегда два:
1)пессимистичная блокировка — когда данные могут меняться только одним клиентом в один момент времени.
2)оптимистичная блокировка, когда оба редактируют данные, если при попытке сорхнанить версии не сопадают — исправить конфликт и попытаться еще раз.
Оптимистичная блокировка на самом деле блокировкой не является, несмотря на назание, и в некоторых случаях не работает.
Проверка версии происходит только при явном сохранении (кнопка save), причем проверяется средствами БД.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Не очень понимаю как отслеживать изменения. Допустим на клиенте грид с коллекцией объектов. При редактировании в отдельную коллекцию складывать отредактированные объекты? А как порядок редактирования учитывать?
Вы видимо невнимательно прочитали тему. Либо реализовывать флаг IsDirty в самом бизнес-объекте (базовом классе), либо использовать Wrapper, который будет отслеживать изменения обертываемого объекта и реализовывать флаг IsDirty. Если нужно учитывать порядок редактирования — это отдельная задача, но лично мне никогда не нужно было учитывать порядок редактирования. Вы уверены что вы заранее не усложняете задачу зачем-то?
O>>> — возникает необходимость хранить список изменений или передавать все потенциально измененные объекты; MC>>Смотрите тему http://rsdn.ru/forum/design/3367411.flat.aspx
O>Прочитал. Понял не много и легче не стало.
Может стоит еще раз внимательно прочитать? Я серьезно.
O>Врапперы над сущностями и их коллекциями — это круто. Не совсем представляю как это будет в случае с несколькими клиентами.
Видимо у каждого клиента будет своя коллекция обернутых объектов.
O>DataSet то же не хотелось бы, не то, чтобы я сильно религиозен, но мозги придется перекраивать сновательно.
В принципе датасеты вариант, но лично мне кажется что они провоцируют дублирование логики, а так же вынос логики в presentation. К тому же нетипизированные датасеты неудобны отсутствием типизации, а типизированные датасеты дают мало контроля, т.к. все генерируется и перегенерируется автоматически.
O>А последовательность изменений не учитывать? Если пятая операция из 10 не прошла, то, на мой взгляд, логично откатить все 10. Соответственно, пользователю прдется переделывать все 10.
Ну это зависит от задачи. Если мы принимаем 10 заказов от разных клиентов (через веб-сервис к примеру) и принялись только 5, после чего возникла ошибка — то откатывать все не нужно, просто запросить те которые не принялись и попытаться их сохранить. Если же действия должны быть "атомарными", то да, откатываем все 10. Но видимо у нас с вами тут какое-то недопонимание, потому как я не понимаю, почему пользователю придется переделывать все 10? К примеру пользователь открывает форму с разными полями для редактирования и гридом, что-то там изменяет и жмет сохранить. Если где-то косяк (к примеру ошибка валидации или ваша любимая коллизия), то пользователю просто сообщится о конкретной ошибке ("Product price can not exceed $100000"), на форме же останутся изменения сделанные пользователем. Пользователь исправляет что нужно и жмет Сохранить еще раз.
Если же вы про облом операции именно по причине коллизии, то тут надо сначала знать, что должно происходить в случае коллизии? Может просто молча должны записаться изменения пользователя (на мой взгляд зачастую это вполне допустимо), или же надо сообщить пользователю о том что в БД уже етсь измененная версия объекта и спросить хочет ли он ее перезаписать? Или же надо перечитать (или просто отдельно показать) измененный объект из БД? Или надо все перечитать? Это вы должны сначала вместе с экспертами предметной области решить как должна вести себя система.
O>>> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O>>> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать. MC>>Это просто неправильно так делать.
O>Не правильно делать категоричные заявления без аргументов Ясно, что производительность и отзывчивость могут пострадать, если клиентов будет много, а сервер далеко, но есть подозрение, что дело не в этом.
И в этом тоже. Вы вообще искренне считаете что нормально отправлять изменения и сохранять их на сервере по каждому чиху пользователя? А если он решит отменить изменения?
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka
O> А как можно некорректно изменить данные, которые имеют версию? Два лока сделать одновременно ведь не удасться даже теоретически, на сколько я понимаю.
А вот это очень распространённое заблуждение — верить что программа ценна сама по себе, и не потребуется интеграция с другими системами. Данные у вас лежат в СУБД — любой запрос может помацать их несмотря ни на какие псевдоблокировки. Впрочем это слегка другой вопрос, просто не надейтесь что мой вариант == панацея от всех бед
P.S. Вариант с резервированием рулит когда у вас ресурсов чуть меньше чем клиентов. Если клиентов стабильно толпа, а ресурс используется ограниченное время (не ваш случай) то оптимистические блокировки или "last wins" пожалуй подойдёт лучше.
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
Z>>Я на досуге подумал и пришел к такому выводу. Различие между тонкой и жирной моделью лишь в способе получения DTO. G>Различий гораздо больше. G>Пример — нужно получить список заказов с адресом клиента и фамилией менеджера, отвественного за заказ. G>В жирной модели надо загрузить список заказов, для каждого заказа надо загрузить полный объект менеджера и клиента.
Обе модели допускают оптимизацию подобных сценариев. Про непотимальныю работу с БД в рич модели by default я уже писал.
G>Это бред воспаленного сознания.
Культура общения для тебя не главное, как я понял. Если диалог не интересен — продолжай в том же духе, я пойму и забью на него.
G>ER-модели (модели данных) начали применяться гораздо раньше, чем ООП. Стройная модель — как раз отражение модели данных в программе. G>Причеем между моделью данных и схемой хранения может быть достаточно нетривиальынй маппинг.
Обе модели отражают данные, обе могут делать это нетривиальными маппингами, что сказать-то хотел? Нетривиальный маппинг в тощей модели, скорее вреден, так как способствует persistance ignorance, т.о. лишая тощую модель одного из главных достоинств.
Z>>Поэтому зачастую с тонкой моделью легко уживается логика в БД (логика в модели). G>Смысл этой фразы для меня остался загадкой.
С тощей моделью логика в БД уживается лучше, это логично ложится в концепцию БД==модель.
G>Практика показывает обратное. На каком-то пороге сложности domain model перестает оправдывать себя.
Т.е. у тебя был случай, когда изза возрастающей сложности пришлось отказаться от DDD? Или какая практика?
Z>>У нее полно минусов, она очень неоптимально использует СУБД, нам требуется трекать изменения сделанные клиентом, чтобы проапдейтить эту модель. Но, грамотно построенная, она не позволяет нарушить ни одного бизнес правила и дает максимально полный интерфейс для работы над собой. G>Это за счет чего достигается? Магией чтоли? G>И что вообще означает "не позволяет нарушить ни одного бизнес правила", если программа чего-то такого допускает, то это бага.
Различие между программой и моделью не видно? Рич модель не позволяет, а с тонкой можно проделать все что угодно в коде бизнес процессов.
G>Кстати, а что означает "дает максимально полный интерфейс для работы над собой"?
В обеих моделях есть некое ядро, работая с которым нарушить логику невозможно. Интерфейс работы с этим ядром в жирной модели выглядит более богатым, а код самого ядра более компактным. Соответственно проще его верификация.
Z>>Любой такой шаг не бесплатен и любой оправдан лишь в тех случаях, когда без него гораздо хуже. G>Пример такого случая будет?
Не будет, мне пока хватает тощей, хотя рич модель я проектировал тоже, не сказал бы, что она доставляла мне проблемы своим существованием. Даже если бы такой пример у меня был, его описание потребовало бы за сотню страниц текста, который ты все равно не стал бы читать. Но я убежден, что такие сценарии существуют.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
G>>ER-модели (модели данных) начали применяться гораздо раньше, чем ООП. Стройная модель — как раз отражение модели данных в программе. G>>Причеем между моделью данных и схемой хранения может быть достаточно нетривиальынй маппинг.
Z>Обе модели отражают данные, обе могут делать это нетривиальными маппингами, что сказать-то хотел? Нетривиальный маппинг в тощей модели, скорее вреден, так как способствует persistance ignorance, т.о. лишая тощую модель одного из главных достоинств.
И почему же вреден? Примеры будут?
Z>>>Поэтому зачастую с тонкой моделью легко уживается логика в БД (логика в модели). G>>Смысл этой фразы для меня остался загадкой. Z>С тощей моделью логика в БД уживается лучше, это логично ложится в концепцию БД==модель.
Это ты сам придумал.
G>>Практика показывает обратное. На каком-то пороге сложности domain model перестает оправдывать себя. Z>Т.е. у тебя был случай, когда изза возрастающей сложности пришлось отказаться от DDD? Или какая практика?
Был. Я узнав про DDD попытался написать прогу в чисто dddшном. К концу разработки код оброс обилием неDDDшных конструкций, от самого DDD осталось мало. При этом на началном этапе я очень много времени потратил на поддержку именно DDD.
Z>>>У нее полно минусов, она очень неоптимально использует СУБД, нам требуется трекать изменения сделанные клиентом, чтобы проапдейтить эту модель. Но, грамотно построенная, она не позволяет нарушить ни одного бизнес правила и дает максимально полный интерфейс для работы над собой. G>>Это за счет чего достигается? Магией чтоли? G>>И что вообще означает "не позволяет нарушить ни одного бизнес правила", если программа чего-то такого допускает, то это бага. Z>Различие между программой и моделью не видно?
Модель (елси мы говорим не об артефакте анализа) — часть программы.
Z>Рич модель не позволяет, а с тонкой можно проделать все что угодно в коде бизнес процессов.
И что?
G>>Кстати, а что означает "дает максимально полный интерфейс для работы над собой"? Z>В обеих моделях есть некое ядро, работая с которым нарушить логику невозможно. Интерфейс работы с этим ядром в жирной модели выглядит более богатым, а код самого ядра более компактным. Соответственно проще его верификация.
Не надо ударяться в философию.
В стройной модели есть данные и есть методы работы с ними. Никаких "ядер" "интерфейсов" и прочей мути.
Если есть пример, показывающий обратное — можешь привести.
Z>>>Любой такой шаг не бесплатен и любой оправдан лишь в тех случаях, когда без него гораздо хуже. G>>Пример такого случая будет? Z>Не будет, мне пока хватает тощей, хотя рич модель я проектировал тоже, не сказал бы, что она доставляла мне проблемы своим существованием. Даже если бы такой пример у меня был, его описание потребовало бы за сотню страниц текста, который ты все равно не стал бы читать. Но я убежден, что такие сценарии существуют.
Слепая вера — самое страшное в программировании.
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
Z>>Обе модели отражают данные, обе могут делать это нетривиальными маппингами, что сказать-то хотел? Нетривиальный маппинг в тощей модели, скорее вреден, так как способствует persistance ignorance, т.о. лишая тощую модель одного из главных достоинств. G>И почему же вреден? Примеры будут?
Это обсуждалось на данном форуме тыщу раз. Воспользуйся поиском, пересказывать лень.
Z>>С тощей моделью логика в БД уживается лучше, это логично ложится в концепцию БД==модель. G>Это ты сам придумал.
Что лучше уживается или что логично ложится?
G>Я узнав про DDD попытался написать прогу в чисто dddшном. К концу разработки код оброс обилием неDDDшных конструкций, от самого DDD осталось мало. При этом на началном этапе я очень много времени потратил на поддержку именно DDD.
Примеры неDDDшных конструкций в студию.
Z>>Различие между программой и моделью не видно? G>Модель (елси мы говорим не об артефакте анализа) — часть программы.
Я говорю именно про модель, а не про всю программу. Хотел бы про программу писал бы программа. Зачем вносить путаницу?
Z>>Рич модель не позволяет, а с тонкой можно проделать все что угодно в коде бизнес процессов. G>И что?
Z>>В обеих моделях есть некое ядро, работая с которым нарушить логику невозможно. Интерфейс работы с этим ядром в жирной модели выглядит более богатым, а код самого ядра более компактным. Соответственно проще его верификация. G>Не надо ударяться в философию. G>В стройной модели есть данные и есть методы работы с ними. Никаких "ядер" "интерфейсов" и прочей мути. G>Если есть пример, показывающий обратное — можешь привести.
Это не философия, если ты не выделяешь подобного ядра — тебе надо быть уверенным во всей программе.
G>Слепая вера — самое страшное в программировании.
Здравствуйте, ilvi, Вы писали:
I>Здравствуйте, Ocenochka, Вы писали:
O>> однако, всем известно, что проще купить лишний сервер, чем поддерживать запутанную архитектуру.
I>Поубивал бы тех, кто пустил эту фразу в народ I>Мало того, что перекладывание своих проблем на кошелек заказчика, так еще святая вера в то, что просто добавление еще одного сервера улучшит производительность. А какие изменения в архитектуру ПО вы собираетесь вносить, чтобы ваше приложение хотя бы не стало медленей работать от добавления еще одного сервера?
Ну имхо вы усложняете. It depends. В смысле, если сервер был 1, и добавить еще один -- это да, может быть очень заморочисто. А если их было 2 или 3 или больше, то добавить еще один -- обычно совершенно не сложно, т.к. архитектура уже приспособлена к децентрализации.
Здравствуйте, Ocenochka, Вы писали:
O> Плюс один — наличие актуальных данных на клиентах. Вообще-то, я согласен, но хочется рассмротреть все варианты пока есть возможность.
наличие более актуальных данных. актуальные они только в БД.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, gandjustas, Вы писали:
Z>>>Обе модели отражают данные, обе могут делать это нетривиальными маппингами, что сказать-то хотел? Нетривиальный маппинг в тощей модели, скорее вреден, так как способствует persistance ignorance, т.о. лишая тощую модель одного из главных достоинств. G>>И почему же вреден? Примеры будут?
Z>Это обсуждалось на данном форуме тыщу раз. Воспользуйся поиском, пересказывать лень.
Я форум уже несколько лет читаю каждый день и нечего подобного вспонить не могу.
Может я чего-то не понял? В каких достоинств лишается стройная модель?
Z>>>С тощей моделью логика в БД уживается лучше, это логично ложится в концепцию БД==модель. G>>Это ты сам придумал. Z>Что лучше уживается или что логично ложится?
То что это вообще имеет какой-то смысл в данном обсуждении.
G>>Я узнав про DDD попытался написать прогу в чисто dddшном. К концу разработки код оброс обилием неDDDшных конструкций, от самого DDD осталось мало. При этом на началном этапе я очень много времени потратил на поддержку именно DDD. Z>Примеры неDDDшных конструкций в студию.
В основном дополнительные классы для работы с произвольными выборками. Не помню уже все давно это было и на делфи.
Z>>>Различие между программой и моделью не видно? G>>Модель (елси мы говорим не об артефакте анализа) — часть программы. Z>Я говорю именно про модель, а не про всю программу. Хотел бы про программу писал бы программа. Зачем вносить путаницу?
Еще раз модель — часть программы. Рассматривать модель отдельно от программы смылса нету.
Не бывает модель ценной сама по себе.
Z>>>Рич модель не позволяет, а с тонкой можно проделать все что угодно в коде бизнес процессов. G>>И что?
Z>>>В обеих моделях есть некое ядро, работая с которым нарушить логику невозможно. Интерфейс работы с этим ядром в жирной модели выглядит более богатым, а код самого ядра более компактным. Соответственно проще его верификация. G>>Не надо ударяться в философию. G>>В стройной модели есть данные и есть методы работы с ними. Никаких "ядер" "интерфейсов" и прочей мути. G>>Если есть пример, показывающий обратное — можешь привести.
Z>Это не философия, если ты не выделяешь подобного ядра — тебе надо быть уверенным во всей программе.
А если бы выделял ядро, то не надо было бы быть уверенным?
Я вообще-то тесты пишу.
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>То что это вообще имеет какой-то смысл в данном обсуждении.
ок, проехали.
Z>>Примеры неDDDшных конструкций в студию. G>В основном дополнительные классы для работы с произвольными выборками. Не помню уже все давно это было и на делфи.
Почему ты решил, что эти кклассы "неDDDшные"? Рич модель не обязана состоять только из персистных классов. Она отличается от тонкой только тем, что допускает логику в персистных, но нигде не говорится об обязательном отсутствии BL в других классах.
G>Еще раз модель — часть программы. Рассматривать модель отдельно от программы смылса нету. G>Не бывает модель ценной сама по себе.
Z>>Это не философия, если ты не выделяешь подобного ядра — тебе надо быть уверенным во всей программе. G>А если бы выделял ядро, то не надо было бы быть уверенным?
Это уже пошла философия. Есть критические ошибки в БЛ, которые стоят очень дорого. Есть некое ядро, при корректности которого нарушить БЛ сложно/невозможно. Чем компактнее это ядро, тем легче его поддерживать. Я убежден, что рич модель позволяет сделать такое ядро более компактным и проще поддерживаемым. Правда требует большей квалификации при его дизайне.
Пример из практики, при переводе на клиент-сервер одной из систем сделали из рич модели тощую, руководствуясь примерно теми же мотивами, что и ты декларируешь. Ядро логики мне не удалось изолировать так же хорошо как и в жирной, хотя я проектировал ее на три года позже чем жирную (смею надеяться, что за три года в голове прибавилось ). Реюз кода уменьшился и, как я ни старался, сейчас требуется намного больше знаний о системе для написания новой логики. Сейчас я уже не так уверен, что решение проблем рич модели было бы дороже. И уж точно не сомневаюсь в праве рич моделей на жизнь.
G>Я вообще-то тесты пишу.
Дада, и в твоих программах больше нет ни одной ошибки. Рич модель несоместима с тестами чтоли?
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, MozgC, Вы писали:
O>>Не очень понимаю как отслеживать изменения. Допустим на клиенте грид с коллекцией объектов. При редактировании в отдельную коллекцию складывать отредактированные объекты? А как порядок редактирования учитывать? MC>Вы видимо невнимательно прочитали тему. Либо реализовывать флаг IsDirty в самом бизнес-объекте (базовом классе), либо использовать Wrapper, который будет отслеживать изменения обертываемого объекта и реализовывать флаг IsDirty. Если нужно учитывать порядок редактирования — это отдельная задача, но лично мне никогда не нужно было учитывать порядок редактирования.
Не, это я как раз понял, только там обсуждение было в контексте датасетов, что меня сразу не обрадовало. Общий смысл понятен.
MC>Вы уверены что вы заранее не усложняете задачу зачем-то?
Ну может слегка Не известно же что завтра заказчику в голову ударит, вот и пытаюсь импровизировать.
O>>>> — возникает необходимость хранить список изменений или передавать все потенциально измененные объекты; MC>>>Смотрите тему http://rsdn.ru/forum/design/3367411.flat.aspx
O>>Прочитал. Понял не много и легче не стало. MC>Может стоит еще раз внимательно прочитать? Я серьезно.
Прочитал. Понял не на много больше, чем после первого прочетния.
O>>Врапперы над сущностями и их коллекциями — это круто. Не совсем представляю как это будет в случае с несколькими клиентами. MC>Видимо у каждого клиента будет своя коллекция обернутых объектов.
Ага, теперь понятно.
O>>DataSet то же не хотелось бы, не то, чтобы я сильно религиозен, но мозги придется перекраивать сновательно. MC>В принципе датасеты вариант, но лично мне кажется что они провоцируют дублирование логики, а так же вынос логики в presentation. К тому же нетипизированные датасеты неудобны отсутствием типизации, а типизированные датасеты дают мало контроля, т.к. все генерируется и перегенерируется автоматически.
Вот вот, поэтому и не хочу с ними связываться.
O>>А последовательность изменений не учитывать? Если пятая операция из 10 не прошла, то, на мой взгляд, логично откатить все 10. Соответственно, пользователю прдется переделывать все 10. MC>Ну это зависит от задачи. Если мы принимаем 10 заказов от разных клиентов (через веб-сервис к примеру) и принялись только 5, после чего возникла ошибка — то откатывать все не нужно, просто запросить те которые не принялись и попытаться их сохранить. Если же действия должны быть "атомарными", то да, откатываем все 10. Но видимо у нас с вами тут какое-то недопонимание, потому как я не понимаю, почему пользователю придется переделывать все 10? К примеру пользователь открывает форму с разными полями для редактирования и гридом, что-то там изменяет и жмет сохранить. Если где-то косяк (к примеру ошибка валидации или ваша любимая коллизия), то пользователю просто сообщится о конкретной ошибке ("Product price can not exceed $100000"), на форме же останутся изменения сделанные пользователем. Пользователь исправляет что нужно и жмет Сохранить еще раз.
Хороший варант, только усложняет обработку ошибок, хотя может и не так сильно как мне кажется. Спасибо.
MC>Если же вы про облом операции именно по причине коллизии, то тут надо сначала знать, что должно происходить в случае коллизии? Может просто молча должны записаться изменения пользователя (на мой взгляд зачастую это вполне допустимо), или же надо сообщить пользователю о том что в БД уже етсь измененная версия объекта и спросить хочет ли он ее перезаписать? Или же надо перечитать (или просто отдельно показать) измененный объект из БД? Или надо все перечитать? Это вы должны сначала вместе с экспертами предметной области решить как должна вести себя система.
Вот это мне и не нравится, ибо сложности предметной области в данном случае могут вылиться в большой объем логики обработки таких ошибок. Подозреваю, что проще лочить объекты перед началом редактирования.
O>>>> б) либо на каждое действие пользователя включать курсор "песочные часы" и отправлять изменения на сервер — в принципе, O>>>> не вижу проблем, но почему-то не часто его встречаю (а может реже замечаю) — если есть проблемы, хотелось бы их узнать. MC>>>Это просто неправильно так делать. O>>Не правильно делать категоричные заявления без аргументов Ясно, что производительность и отзывчивость могут пострадать, если клиентов будет много, а сервер далеко, но есть подозрение, что дело не в этом. MC>И в этом тоже. Вы вообще искренне считаете что нормально отправлять изменения и сохранять их на сервере по каждому чиху пользователя? А если он решит отменить изменения?
Изменение решения — это уже достаточный аргумент. Опять спасибо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>>>Наверное при нажатии save, но в таком случае и передавать на сервер не надо. O>> Как не надо? А как об изменении смогут узнать другие клиенты? G>Сам же написал что без обратной связи. Тогда зачем до save куда-то что-то передавать?
Обратная связь — это когда сервер уведомляет клиентов об изменении. А когда с клиента на сервер передавать — сразу или при нажатии на сейв — это не обратная связь.
O>>>>>>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности. G>>>>>В таком решении ты найдешь тысячи граблей, с которыми будешь долго бороться. O>>>> Пока не вижу у нас единого взгляда на это решение, учитывая заданные мне вопросы. G>>>А ты подробнее распиши задачу и покажи свои наработки. O>> Задача занимает сейчас около 100 стр. при этом я не могу понять что даст раскрытие ньюансов конкретной предметной области. Премер я уже приводил. Наработки еще не закончены, однако есть четкое представление архитектуры. G>Может дать очень много потому что единственное что сейчас видят люди на форуме — это твое трактование предметной области.
И для них этого вполне достаточно, судя по многим адекватным коментариям, которые я понимаю.
G>>>Создавать сферическую архитектуру в вакууме не получится. O>> Однако, глядя на ваши ответы, я считаю, что у вас это вполне получается Без обид. O>>Просто я не вижу у вас понимания решения N1. G>Это у тебя нету понимания решения N1, я такие решения в разных видах уже делал.
С тонкой domain model делал?
O>>То, что вы пробовали городить dataset'ы — это я уже выяснил G>Мимо. Как раз решения с dataset я предпочитаю не городить, я один раз начал такое делать и быстро отказался.
А как делал?
O>>и то что опыта с orm и domain model не имели то же выяснил G>Совсем мимо. С orm работаю постоянно и даже свой писал. G>Хреновый из тебя телепат.
Я и не претендовал Жду доказательств своей хреновости в виде ответов на вопросы
O>>>>>> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки. G>>>>>Оба неадекваты на 99% O>>>> Предлагайте! G>>>Сделать кнопку Save, по которой сохранять изменения. G>>>Далее 3 варианта: G>>>1)Локальная реплика БД, которая хранит измененные данные (dataset или SQL CE) и периодическая синхронизация с сервером (передача changeset датасета или Sync Services для SQL CE) O>> В задаче сказано, что БД — одна. G>И что? SQL CE — несколько dll и больше ничего не надо
Я знаю, что такое SQL CE и работал с ней, однако, синхронизация должна быть чаще чем раз в минуту. Городить для этого репликацию из локальных БД... Синхронизацию руками проводить? Чем локальный кэш NHibernate хуже, чем локальная БД?
G>>>2)Написать кучу сервисов и DTO O>> Это зачем и к чему? G>Ко всему. Если клиент не толстый, то лучше увеличить гранулярность обращения к серверу. Для этого потребуется метод сервиса и вероятнее всего DTO.
Клиент толстый.
G>>>3)Воспользоваться EF\Linq2SQL+ADO.NET Data Services O>> Каким образом? G>Создть модель в EF дизайнере, создать сервис ADO.NET, сделать клиент.
Не пробовал EF, слышал негативные отзывы, как работает — не представляю. В чем преимущества?
O>> Есть четкая задача, которую я обозначил дважды, повторю еще раз: есть два клиента, работающих с общей БД. Как реализовать их работу при отсутствии коллизий? G>Наверное при наличии коллизий. Варианта как всегда два: G>1)пессимистичная блокировка — когда данные могут меняться только одним клиентом в один момент времени. G>2)оптимистичная блокировка, когда оба редактируют данные, если при попытке сорхнанить версии не сопадают — исправить конфликт и попытаться еще раз. G>Оптимистичная блокировка на самом деле блокировкой не является, несмотря на назание, и в некоторых случаях не работает.
Почему не работает? У же который раз пишут, что может не работать, однако я не представляю как это возможно в случае наличия версии в каждой сущности и транзакционной БД.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[12]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinix, Вы писали:
O>> А как можно некорректно изменить данные, которые имеют версию? Два лока сделать одновременно ведь не удасться даже теоретически, на сколько я понимаю. S>А вот это очень распространённое заблуждение — верить что программа ценна сама по себе, и не потребуется интеграция с другими системами.
А если потребуется, от что? Нельзя будет учесть версию объекта, или транзакционность БД как-то отменится?
S>Данные у вас лежат в СУБД — любой запрос может помацать их несмотря ни на какие псевдоблокировки.
Раскажите, наконец, каким образом? Например, есть объект "клиент" у него есть свойство "счет". Объект имеет версию, лежит в БД. Дав клиента забирает его из БД, изменяют и пытаются положить обратно предварительно проверив версию объекта. Как возможна коллизая, эсли "помацать" — это коллизия ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали:
M>Прежде всего, вариант N2 следует отмести как нереализуемый -- уж очень много всяких косяков там вылезает: начиная от проблем с проксями NHibernate и заканчивая сбоями сети. Кроме того, работа по сети в таком случае выльется в безобразные тормоза на клиенте.
Это я понимал с самого начала, но товарищ с которым буду работать прделагал такой вариант, поэтому решил рассмотреть и его то же.
M>Итак, остается вариант №1, которым обычно и пользуются при написании 3хзвенок. M>Чтобы претворить его в жизнь, нужно: M>1) Определиться с генератором DTO: будет он или вы сами будете гонять отсоединенные объекты (DTO можно готовить и руками, но лучше взять что-либо типа otis lib);
Не понял, что подразумевается под генератором DTO. Пока решено гнять тонкие бизнес-объекты, а в тонких местах — DTO.
Сейчас начинаю понимать, что наличие единого сервера не нужно, поэтому клиенты будут просто получать из БД (от NHibernate) бизнес объекты и лочить/апдейтить их самостоятельно, а не через сервер. Соответственно, необходимость в DTO отпадает, как я понимаю.
M>2) Кнопка Save в вашем случае -- отличное решение; нужно только определиться с сеансами редактирования (т.е. где эти кнопки будут находиться и каковы будут участки, работа на которых идет от сохранения до сохранения;
Согласен, это не так сложно в моем случае.
M>3) Определиться с тем, как вы будете решать конфликты одновременного обновления: пессимистический вариант и оптимистический, соотственно. M>В случае пессимистического вы не допускаете конфликтов -- при помощи транзакций БД(хардкор, но иногда допустим или на уровне бизнес-транзакций (т.н. conversation), помечая и блокируя бизнес-объекты , находящиеся в редактировании; M>В случае оптимистического варианта вы решаете разруливать конфликты одновременного обновления по факту обнаружения таких конфликтов. Вариантов здесь а)затирать старые изменения (игнорируем конфликт) б) не давать затирать при помощи проверки версии (NHibernate вам в помощь) и просить пользователя внести вторично правку в устаревшие данные в) реализовать стратегию merge данных, если данные могут быть объединены без логического конфликта M>Ничего не мешает сочетать эти варианты, согласуясь с другими критериями.
Да, решено уже по мере надобности сочитать разные блокировки. Пугает только, что это может вылиться в большой объем логики обработки исключений конфликтов.
M>Да, и ответ на ваш вопрос -- NHibernate сам умеет поддерживать версии объекта, так что коллизий не будет; если вам интересно, я напишу следующим сообщением, почему описанная вами ситуация не случится.
Я и сам догадываюсь, но все равно напишите, т.к. я не знаю как это выразить словами. То, что NHibernate поддерживает <version> я знал, но использовать не приходилось и смутно представляю реализацию в sql. Видимо при апдейте идет проверка, что свойство version = currentVersion.
M>4) Определитесь со стратегией кеша и провайдером кеша (не все из них поддерживают блокировку объектов!). Со своей стороны могу порекомендовать SharedCache.net, ибо пробовал, понравилось; memcached не пробовал, но буду в след. проекте;
Кэша в NHibernate вроде всего два — один SysCache для asp.net, второй — некий Prevalence. В детали пока не вдавался. Мы об одном и
том же кэше говорим?
M>5) Определиться со стратегией выработки Id(PK) для бизнес-объектов -- некоторые, например, identity, плохо совместимы с NHibernate 2nd level cache.
Пока всегда хватало сурогатного Int64.
M>Если заинтересовало, пишите, продолжим обсуждение трудностей и подводных камней.
Заинтересовало, давайте продолжать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>>>DataSet то же не хотелось бы, не то, чтобы я сильно религиозен, но мозги придется перекраивать сновательно. MC>>В принципе датасеты вариант, но лично мне кажется что они провоцируют дублирование логики, а так же вынос логики в presentation. К тому же нетипизированные датасеты неудобны отсутствием типизации, а типизированные датасеты дают мало контроля, т.к. все генерируется и перегенерируется автоматически. O> Вот вот, поэтому и не хочу с ними связываться.
Кстати для опыта можно и что-нибудь сделать с ними, выявите для себя удобства и недостатки.
MC>>Ну это зависит от задачи. Если мы принимаем 10 заказов от разных клиентов (через веб-сервис к примеру) и принялись только 5, после чего возникла ошибка — то откатывать все не нужно, просто запросить те которые не принялись и попытаться их сохранить. Если же действия должны быть "атомарными", то да, откатываем все 10. Но видимо у нас с вами тут какое-то недопонимание, потому как я не понимаю, почему пользователю придется переделывать все 10? К примеру пользователь открывает форму с разными полями для редактирования и гридом, что-то там изменяет и жмет сохранить. Если где-то косяк (к примеру ошибка валидации или ваша любимая коллизия), то пользователю просто сообщится о конкретной ошибке ("Product price can not exceed $100000"), на форме же останутся изменения сделанные пользователем. Пользователь исправляет что нужно и жмет Сохранить еще раз. O> Хороший варант, только усложняет обработку ошибок, хотя может и не так сильно как мне кажется. Спасибо.
Чем усложняет? Можно подробнее?
O> Вот это мне и не нравится, ибо сложности предметной области в данном случае могут вылиться в большой объем логики обработки таких ошибок. Подозреваю, что проще лочить объекты перед началом редактирования.
Не знаю, я не специалист в этой теме. Давайте лучше не будем говорить абстрактно, а рассмотрим пару примеров. Приведите пару конкретных реальных примеров из вашей задачи, и думаю что знающие люди предложат решения для этих конкретных случаев. Думаю что так от беседы будет больше практической пользы.
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, MozgC, Вы писали:
MC>>>Ну это зависит от задачи. Если мы принимаем 10 заказов от разных клиентов (через веб-сервис к примеру) и принялись только 5, после чего возникла ошибка — то откатывать все не нужно, просто запросить те которые не принялись и попытаться их сохранить. Если же действия должны быть "атомарными", то да, откатываем все 10. Но видимо у нас с вами тут какое-то недопонимание, потому как я не понимаю, почему пользователю придется переделывать все 10? К примеру пользователь открывает форму с разными полями для редактирования и гридом, что-то там изменяет и жмет сохранить. Если где-то косяк (к примеру ошибка валидации или ваша любимая коллизия), то пользователю просто сообщится о конкретной ошибке ("Product price can not exceed $100000"), на форме же останутся изменения сделанные пользователем. Пользователь исправляет что нужно и жмет Сохранить еще раз. O>> Хороший варант, только усложняет обработку ошибок, хотя может и не так сильно как мне кажется. Спасибо. MC>Чем усложняет? Можно подробнее?
В случае оптимистических блокировок (разруливание по факту обновления, а не перед) модет оказаться необходимым выяснять зависимости меду объектами, чтобы делать мержи, откаты или накаты, это будет зависеть от предметной области, которая может быть доволно сложной.
O>> Вот это мне и не нравится, ибо сложности предметной области в данном случае могут вылиться в большой объем логики обработки таких ошибок. Подозреваю, что проще лочить объекты перед началом редактирования. MC>Не знаю, я не специалист в этой теме. Давайте лучше не будем говорить абстрактно, а рассмотрим пару примеров. Приведите пару конкретных реальных примеров из вашей задачи, и думаю что знающие люди предложат решения для этих конкретных случаев. Думаю что так от беседы будет больше практической пользы.
Ну вот, допустим выгружается на клиента список клиентов и их счета и договора. Информация о клиенте исправляется и отправляется на сервер (можно уже сказать, что это будет непосредственно БД) для апдейта. Сервер кидает исключение, что не может проапдейтить определенного клиента. Вот тут и придется, в соответствии с конкретным объектом и его состоянием принимать решение либо о мерже либо об откате либо о накате. очевидно, что логика предметной области в такой момент может сильно раздутьв в реализации. Видимо, это устраняется пессимистичной блокировкой, когда клиент и его зависимости лочаться перед редактированием.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Ну вот, допустим выгружается на клиента список клиентов и их счета и договора. Информация о клиенте исправляется и отправляется на сервер (можно уже сказать, что это будет непосредственно БД) для апдейта. Сервер кидает исключение, что не может проапдейтить определенного клиента. Вот тут и придется, в соответствии с конкретным объектом и его состоянием принимать решение либо о мерже либо об откате либо о накате. очевидно, что логика предметной области в такой момент может сильно раздутьв в реализации. Видимо, это устраняется пессимистичной блокировкой, когда клиент и его зависимости лочаться перед редактированием.
Чем этот пример отличается от простого редактирования клиентов без счетов и договоров (это я чтобы избавить пример от возможно ненужных зависимостей)?
Как вы сами считаете должна вести себя система если при сохранении клиента оказывается что в БД уже есть более новая версия клиента?
Или вы считаете что нельзя редактировать клиента одновременно на разных машинах? Если нельзя редактировать клиента на разных машинах, то когда ставить блокировку? И что если оператор уйдет на обед?
Т.е. сначала надо определиться с этими вопросами. Может кто из более опытных участников посоветует наиболее подходящие решения для таких сценариев.
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, MozgC, Вы писали:
O>> Ну вот, допустим выгружается на клиента список клиентов и их счета и договора. Информация о клиенте исправляется и отправляется на сервер (можно уже сказать, что это будет непосредственно БД) для апдейта. Сервер кидает исключение, что не может проапдейтить определенного клиента. Вот тут и придется, в соответствии с конкретным объектом и его состоянием принимать решение либо о мерже либо об откате либо о накате. очевидно, что логика предметной области в такой момент может сильно раздутьв в реализации. Видимо, это устраняется пессимистичной блокировкой, когда клиент и его зависимости лочаться перед редактированием. MC>Чем этот пример отличается от простого редактирования клиентов без счетов и договоров (это я чтобы избавить пример от возможно ненужных зависимостей)?
В том то и дело, что записимости возможно нужны.
MC>Как вы сами считаете должна вести себя система если при сохранении клиента оказывается что в БД уже есть более новая версия клиента?
В зависимости от обстоятельств — мердж или откат или накат. В зааисимости от той же логики предметной области.
MC>Или вы считаете что нельзя редактировать клиента одновременно на разных машинах?
Наоборот, я только и делаю, что везде пишу про проблемы с этим связанные
MC>И что если оператор уйдет на обед?
Очвидно, таймаут блокировки. Можно например, пользователю, который взял блокировку покзывать сообщение, что необходимо проблить блокировку, если она ему действительно не нужна или отпустить. Отпускание так же произойдет по таймауту этого диалога.
MC>Т.е. сначала надо определиться с этими вопросами. Может кто из более опытных участников посоветует наиболее подходящие решения для таких сценариев.
Только на них и надеюсь
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> В том то и дело, что записимости возможно нужны.
Подробнее? Как они влияют на пример?
O> В зависимости от обстоятельств — мердж или откат или накат. В зааисимости от той же логики предметной области.
Мы сейчас конкретный пример пытаемся разобрать. Какие там обстоятельства? Вы опять от конкретного примера уходите в абстракцию.
Или можете ответить "я не знаю как лучше, подскажите"?
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Кэша в NHibernate вроде всего два — один SysCache для asp.net, второй — некий Prevalence. В детали пока не вдавался. Мы об одном и O>том же кэше говорим?
Вы говорите об одном и том же кеше, кеше второго уровня. Их гораздо больше чем два, но в случае нескольких приложений работающих одновременно с базой придется использовать общий кеш или не использовать его вообще.
O> Пока всегда хватало сурогатного Int64.
Вам говорят о его генерации, identity это то, чего следует избегать. Используйте гуиды на худой конец, раз MSSQL не имеет нормального сиквенса.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, MozgC, Вы писали:
O>> В зависимости от обстоятельств — мердж или откат или накат. В зааисимости от той же логики предметной области. MC>Мы сейчас конкретный пример пытаемся разобрать. Какие там обстоятельства? Вы опять от конкретного примера уходите в абстракцию.
Конкретная стратегия зависит именно от конкретного объекта который вызвал конфликт. От логики предметной области. Она должна диктовать что в данном случае следует сделать. Какая конкретика нужна еще? Как пользователю удобнее так и следует сделать, лишь бы логику не нарушить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, Ocenochka, Вы писали:
O>> Кэша в NHibernate вроде всего два — один SysCache для asp.net, второй — некий Prevalence. В детали пока не вдавался. Мы об одном и O>>том же кэше говорим?
Z>Вы говорите об одном и том же кеше, кеше второго уровня. Их гораздо больше чем два, но в случае нескольких приложений работающих одновременно с базой придется использовать общий кеш или не использовать его вообще.
Товарищ Ziaw, не запутывайте ) "Их гораздо больше, чем 2" можно трактовать весьма по-разному
Уровней кеша в NHibernate 2 -- session object и 2nd level cache. Второй уровень -- реализован по типу plug-in: вы подставляете тот провайдер, который нужен. NativeHash, SysCache, SharedCache, Bamboo.Prevalence, memcached, NCache, OSCache -- это разнообразные провайдеры, выбирайте тот, который нужен, и вперед. Prevalence, например, умеет персиститься на диск, SharedCache -- реплицироваться между машинами, а NCache -- хороший, но его основные вкусности начинаются только в платной версии )
O>> Пока всегда хватало сурогатного Int64. Z>Вам говорят о его генерации, identity это то, чего следует избегать. Используйте гуиды на худой конец, раз MSSQL не имеет нормального сиквенса.
Ой-ёй, только не guid =) Он слишком рандомный; это убивает индекс, и MS-SQL плохо на них реагирует (низкой производительностью). Лучше использовать HiLow или guid.comb, если уж очень хочется гуидов (в этом случае они ложатся компактным кластером).
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали:
M>Товарищ Ziaw, не запутывайте ) "Их гораздо больше, чем 2" можно трактовать весьма по-разному
Сорри ) Не совсем однозначно высказался. Следует читать — "разновиднойстей кеша 2го уровня для NH гораздо больше чем 2".
M>Ой-ёй, только не guid =) Он слишком рандомный; это убивает индекс, и MS-SQL плохо на них реагирует (низкой производительностью). Лучше использовать HiLow или guid.comb, если уж очень хочется гуидов (в этом случае они ложатся компактным кластером).
Интересно, а можно линк на эту тему?
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, meowth, Вы писали:
O> Не понял, что подразумевается под генератором DTO. Пока решено гнять тонкие бизнес-объекты, а в тонких местах — DTO.
Если объекты таки будут толстыми, то писать для них вручную DTO и код Rich Object <-> DTO затруднительно. Otislib -- это object-2-object mapper, который позволяет задать, как трансформировать объекты один в другой, и не писать вручную код, который должен будет это делать.
O> Сейчас начинаю понимать, что наличие единого сервера не нужно, поэтому клиенты будут просто получать из БД (от NHibernate) бизнес объекты и лочить/апдейтить их самостоятельно, а не через сервер. Соответственно, необходимость в DTO отпадает, как я понимаю.
Хм, интересно, как вы в отсутствии единого сервера организуете общий кэш? У вас на каждом клиенте планируется иметь фабрику сессий NHibernate?
M>>3) Определиться с тем, как вы будете решать конфликты одновременного обновления: пессимистический вариант и оптимистический, соотственно. M>>В случае пессимистического вы не допускаете конфликтов -- при помощи транзакций БД(хардкор, но иногда допустим=)) или на уровне бизнес-транзакций (т.н. conversation), помечая и блокируя бизнес-объекты , находящиеся в редактировании; M>>В случае оптимистического варианта вы решаете разруливать конфликты одновременного обновления по факту обнаружения таких конфликтов. Вариантов здесь а)затирать старые изменения (игнорируем конфликт) б) не давать затирать при помощи проверки версии (NHibernate вам в помощь) и просить пользователя внести вторично правку в устаревшие данные в) реализовать стратегию merge данных, если данные могут быть объединены без логического конфликта M>>Ничего не мешает сочетать эти варианты, согласуясь с другими критериями.
O> Да, решено уже по мере надобности сочетать разные блокировки. Пугает только, что это может вылиться в большой объем логики обработки исключений конфликтов.
Воспользуйтесь PostSharp для разделения логики обработки конфликтов и остальной логики. Я пользуюсь AOP из Spring.NET, но принцип тот же.
O> Я и сам догадываюсь, но все равно напишите, т.к. я не знаю как это выразить словами. То, что NHibernate поддерживает <version> я знал, но использовать не приходилось и смутно представляю реализацию в sql. Видимо при апдейте идет проверка, что свойство version = currentVersion.
Примерно так, как вы сказали. Если сконфигурирована проверка version (timestamp), то NHibernate при сохранении проверяет, что версия в БД -- та же, что и в объекте. Если сконфигурирована select-проверка -- будет выполнен select на предмет того, чтобы non-dirty поля совпадали. При использовании в кластере timestamp лучше не использовать.
O> Кэша в NHibernate вроде всего два — один SysCache для asp.net, второй — некий Prevalence. В детали пока не вдавался. Мы об одном и O>том же кэше говорим? O> Пока всегда хватало сурогатного Int64.
Ответил ниже, в комменте после Ziaw
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
O>> В том то и дело, что записимости возможно нужны. MC>Подробнее? Как они влияют на пример? O>> В зависимости от обстоятельств — мердж или откат или накат. В зааисимости от той же логики предметной области. MC>Мы сейчас конкретный пример пытаемся разобрать. Какие там обстоятельства? Вы опять от конкретного примера уходите в абстракцию. MC>Или можете ответить "я не знаю как лучше, подскажите"?
Тот же пример с клиентами и договорами, которых выгрузили на клиента, изменили, а при апдейте выяснилось, что клиент, или один из его контрактов изменен. Теперь предположим, что в соответствии с предметной областью, в таком случае возможны следующие варианты:
1. Изменились не существенные данные клиента, например, его сесейный статус — в этом случае можно апдейтить.
2. Изменились важные данные, например,
— количество контрактов,
— данные контрактов,
— количество контрактов.
В каждом из этих случаев возможна своя логика для определения того — накатывать или откатывать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[4]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали: O>> Кэша в NHibernate вроде всего два — один SysCache для asp.net, второй — некий Prevalence. В детали пока не вдавался. Мы об одном и том же кэше говорим? Z>Вы говорите об одном и том же кеше, кеше второго уровня. Z>Их гораздо больше чем два,
В NHibernate больше? Интересно.
Z>но в случае нескольких приложений работающих одновременно с базой придется использовать общий кеш или не использовать его вообще.
А почему не использовать на каждом клиенте свой кэш?
O>> Пока всегда хватало сурогатного Int64. Z>Вам говорят о его генерации, identity это то, чего следует избегать. Используйте гуиды на худой конец, раз MSSQL не имеет нормального сиквенса.
А я о чем? Почему следует избегать identity? Без него вроде вообще никак. Гуиды слишком велики и бест практисы их не советуют.
Что подразумевается под "нормальным сиквенсом"?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
M>>Ой-ёй, только не guid =) Он слишком рандомный; это убивает индекс, и MS-SQL плохо на них реагирует (низкой производительностью). Лучше использовать HiLow или guid.comb, если уж очень хочется гуидов (в этом случае они ложатся компактным кластером).
Z>Интересно, а можно линк на эту тему?
Здравствуйте, meowth, Вы писали:
O>> Не понял, что подразумевается под генератором DTO. Пока решено гнять тонкие бизнес-объекты, а в тонких местах — DTO. M>Если объекты таки будут толстыми, то писать для них вручную DTO и код Rich Object <-> DTO затруднительно. Otislib -- это object-2-object mapper, который позволяет задать, как трансформировать объекты один в другой, и не писать вручную код, который должен будет это делать.
А, ясно. Объекты будут тонкими, надеюсь вообще избежать DTO, но знать что это решаемо на будующее очень полезно, спасибо.
O>> Сейчас начинаю понимать, что наличие единого сервера не нужно, поэтому клиенты будут просто получать из БД (от NHibernate) бизнес объекты и лочить/апдейтить их самостоятельно, а не через сервер. Соответственно, необходимость в DTO отпадает, как я понимаю. M>Хм, интересно, как вы в отсутствии единого сервера организуете общий кэш? У вас на каждом клиенте планируется иметь фабрику сессий NHibernate?
Если под сервером понимается сервер приложения, то по возможности хотелось бы его избежать — вроде возможность есть. А в чем проблема иметь на каждом клиенте свою фабрику и свой кэш? При insert/update/delete все равно в БД лезть, а на чтение кэш может пригодится; в случае же коллизий при обновлении устаревших данных (в оптимистической блокировке) спасет версионность объектов.
В сервере с общей бизнес-логикой необходимости пока не вижу. Единственное, контролерам на клиентах может понадобиться обратная связь от общей БД, но это, думаю, можно будет решить периодическими запросами с клиентов на обновление по мере надобности. На крайняк, может спасет паттерн публикатор/подписчики.
O>> Да, решено уже по мере надобности сочетать разные блокировки. Пугает только, что это может вылиться в большой объем логики обработки исключений конфликтов. M>Воспользуйтесь PostSharp для разделения логики обработки конфликтов и остальной логики. Я пользуюсь AOP из Spring.NET, но принцип тот же.
О, я то же использую Spring.NET, однако до AOP'а еще дело особо не доходило, кроме примитивных моментов.
Спасибо, это действительно может помочь при отделении логики основной работы от логики обработки конфликтных ситуаций.
O>> Я и сам догадываюсь, но все равно напишите, т.к. я не знаю как это выразить словами. То, что NHibernate поддерживает <version> я знал, но использовать не приходилось и смутно представляю реализацию в sql. Видимо при апдейте идет проверка, что свойство version = currentVersion. M>Примерно так, как вы сказали. Если сконфигурирована проверка version (timestamp), то NHibernate при сохранении проверяет, что версия в БД -- та же, что и в объекте. Если сконфигурирована select-проверка -- будет выполнен select на предмет того, чтобы non-dirty поля совпадали. При использовании в кластере timestamp лучше не использовать.
Про кластер не понял. Что предпоолагается использовать в кластере, БД? Я пока этих механизмов не представляю. К тому же вроде постепенно появляется возможность "виртуализировать" БД на нескольких машинах в виде одной... хотя эта тема мне пока вообще мало знакома.
O>> Кэша в NHibernate вроде всего два — один SysCache для asp.net, второй — некий Prevalence. В детали пока не вдавался. Мы об одном и O>>том же кэше говорим? O>> Пока всегда хватало сурогатного Int64. M>Ответил ниже, в комменте после Ziaw
Ага, спасибо, очень познавательно.
Пока что вы единственный, с кем у меня совпадает мнение на счет инструментов.
Расскажите немного о вашем опыте. Приходилось учавствовать в подобных проектах с несколькими клиентами и общей БД?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
Z>Конкретная стратегия зависит именно от конкретного объекта который вызвал конфликт. От логики предметной области. Она должна диктовать что в данном случае следует сделать.
Ага, я в курсе, я и хотел чтобы автор привел эту логику предметной области. С чем не согласны то?
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Если под сервером понимается сервер приложения, то по возможности хотелось бы его избежать — вроде возможность есть. А в чем проблема иметь на каждом клиенте свою фабрику и свой кэш? При insert/update/delete все равно в БД лезть, а на чтение кэш может пригодится; в случае же коллизий при обновлении устаревших данных (в оптимистической блокировке) спасет версионность объектов. O> В сервере с общей бизнес-логикой необходимости пока не вижу. Единственное, контролерам на клиентах может понадобиться обратная связь от общей БД, но это, думаю, можно будет решить периодическими запросами с клиентов на обновление по мере надобности. На крайняк, может спасет паттерн публикатор/подписчики.
Это уже мой заскок; я что-то не могу отделаться от того, что у вас 3х-звенка ) а у Вас -- обычное клиент-серверное, где сервер -- БД
O> Про кластер не понял. Что предпоолагается использовать в кластере, БД? Я пока этих механизмов не представляю. К тому же вроде постепенно появляется возможность "виртуализировать" БД на нескольких машинах в виде одной... хотя эта тема мне пока вообще мало знакома.
Имелся в виду кластер серверов приложений. Однако — вы решили, что у вас его нет. Нет сервера, нет проблем.
O> Расскажите немного о вашем опыте. Приходилось учавствовать в подобных проектах с несколькими клиентами и общей БД?
И приходилось, и участвую. На текущем месте работы 2хзвенку не застал (работал раньше, в основном), но с 3х-звенкой и толстым клиентом пришлось повозиться и вожусь до сих пор. Счас тут используется свой маппер, и так как приложение ориентировано на данные, да еще и с динамической схемой, он -- с особенностями (метаданные хранятся в БД, например) -- не то чтобы ОРМ, скорее Data2Data Mapper, но сойдет. Система старая и кривая -- легковесный и дешевый конкурент SAP MDM, мегатонны кода, постепенно отмирает. Характеристики -- 50G данных, 300-600 одновременно работающих statefull пользователей, куча опций с данными, самописное все, вплоть до сессий пользователя =) Наследие такое. Есть модуль интеграции с XI/SAP, примитивные отчеты, система диагностики и администрирования. Из-за специфики задач (данные разных пользователей пересекаются часто) использовалась в основном пессимистическая блокировка с таймаутами и прочими "вкусняшками".
На предыдущем месте работы, занимался геоданными и распределенными БД и серверами для них (может быть, слышали про ArcGIS).
Сейчас в разработке -- тоже многозвенка с UI на Silverlight, на сервере приложений -- Spring.NET, NHibernate, memcached, DSLки на Boo. Пытаемся сделать клиент максимально тонким, но с преимуществами толстого -- такими, например, как некоторая логика на клиенте и локальный персистентный кеш данных. Хотим перейти на оптимистические блокировки и более "объектную" модель хранилища. Думаю, осилим в этом году )
Как-то так. Извините, если неинтересно получилось -- про себя плохо получается рассказывать
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали:
O>> В сервере с общей бизнес-логикой необходимости пока не вижу. Единственное, контролерам на клиентах может понадобиться обратная связь от общей БД, но это, думаю, можно будет решить периодическими запросами с клиентов на обновление по мере надобности. На крайняк, может спасет паттерн публикатор/подписчики. M>Это уже мой заскок; я что-то не могу отделаться от того, что у вас 3х-звенка ) а у Вас -- обычное клиент-серверное, где сервер -- БД
Это наверно я ввел в заблуждение темой топика
O>> Расскажите немного о вашем опыте. Приходилось учавствовать в подобных проектах с несколькими клиентами и общей БД? M>И приходилось, и участвую. На текущем месте работы 2хзвенку не застал (работал раньше, в основном), но с 3х-звенкой и толстым клиентом пришлось повозиться и вожусь до сих пор. Счас тут используется свой маппер, и так как приложение ориентировано на данные, да еще и с динамической схемой, он -- с особенностями (метаданные хранятся в БД, например) -- не то чтобы ОРМ, скорее Data2Data Mapper, но сойдет. Система старая и кривая -- легковесный и дешевый конкурент SAP MDM, мегатонны кода, постепенно отмирает. Характеристики -- 50G данных, 300-600 одновременно работающих statefull пользователей, куча опций с данными, самописное все, вплоть до сессий пользователя =) Наследие такое. Есть модуль интеграции с XI/SAP, примитивные отчеты, система диагностики и администрирования. Из-за специфики задач (данные разных пользователей пересекаются часто) использовалась в основном пессимистическая блокировка с таймаутами и прочими "вкусняшками". M>На предыдущем месте работы, занимался геоданными и распределенными БД и серверами для них (может быть, слышали про ArcGIS). M>Сейчас в разработке -- тоже многозвенка с UI на Silverlight, на сервере приложений -- Spring.NET, NHibernate, memcached, DSLки на Boo. Пытаемся сделать клиент максимально тонким, но с преимуществами толстого -- такими, например, как некоторая логика на клиенте и локальный персистентный кеш данных. Хотим перейти на оптимистические блокировки и более "объектную" модель хранилища. Думаю, осилим в этом году ) M>Как-то так. Извините, если неинтересно получилось -- про себя плохо получается рассказывать
Интересно, а главное, что у меня такого опыта нет, но скорее всего предстоит ) Если что по архитектуре буду консультироваться, если не против, потому как любителей Spring.NET + NHibernate не много видел ( Есть еще на этом форуме один любитель — Нахлобуч, но его застать так же трудно.
Мне вот сейчас интересно стало как общий случай трехзвенки реализуется. Логика работы с данными выносится на сервер, а на каждом клиенте дополнительно своя небольшая логика? Т.е. алгоритм примерно такой? :
1. Клиент запрашивает у сервера нужные объекты через сервис.
2. Сервер получает объекты из БД и отдает на клиента, сериализуя.
3. Клиент работает с объектами через свою логику, параллельно обращаясь на сервер по необходимости (что бы залочить например объект)
4. Клиент возвращает объекты серверу с просьбой сохранить состояние, в случае проблем дополнительная логика на клиенте разруливает проблемы.
А в случае тонкого клиента все операции, в том числе модификация производятся через сервер?
Надеюсь понятно излагаю )
Еще мне интересно как разбор ошибочных состояний в БД производится (при обнаружении такого состояния).
Что в 2-х звенке, что в 3-х — неужели только логи?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, meowth, Вы писали:
O> Мне вот сейчас интересно стало как общий случай трехзвенки реализуется. Логика работы с данными выносится на сервер, а на каждом клиенте дополнительно своя небольшая логика? Т.е. алгоритм примерно такой? : O> 1. Клиент запрашивает у сервера нужные объекты через сервис. O> 2. Сервер получает объекты из БД и отдает на клиента, сериализуя. O> 3. Клиент работает с объектами через свою логику, параллельно обращаясь на сервер по необходимости (что бы залочить например объект) O> 4. Клиент возвращает объекты серверу с просьбой сохранить состояние, в случае проблем дополнительная логика на клиенте разруливает проблемы. O> А в случае тонкого клиента все операции, в том числе модификация производятся через сервер? O> Надеюсь понятно излагаю )
Излагаете понятно, и алгоритм примерно такой.Но нюансов много: пп. 2 и 3 могут быть оба, могут быть совмещены или 3 не вызываться, с этим все ясно, думаю. Лочатся так же не только сами объекты, но и целые их логические наборы (все то, что вовлекается в UnitOfWork, например). Чтобы не было неожиданных обновлений (юзеры пугаются=)) перед погружение "вглубь" данных иногда приходится делать снэпшоты наборов данных -- они тоже хранятся на сервере. Скажем, при поиске в большом массиве объектов по условию найдено 1000 объектов, размещенных в UI на 50 страницах. При редактировании записи №342 так, что она больше не попадает под условие и листании набора найденных объектов, хотелось бы, чтобы запись по-прежнему осталась в наборе.
Ну, сервис, через который объекты запрашиваются у сервера, у нас -- WebService. Не спрашивайте почему так, тянется еще с fw 1.1 =). Основной критерий был -- обеспечить транспорт через http + удаленный мониторинг состояния и версий.
O> А в случае тонкого клиента все операции, в том числе модификация производятся через сервер?
Все зависит от того, насколько клиент "тонкий". Если это web-приложение, то да -- вся логика лежит на сервере. Так у нас устроен сервис развертывания обновлений, например.
O> Еще мне интересно как разбор ошибочных состояний в БД производится (при обнаружении такого состояния). O> Что в 2-х звенке, что в 3-х — неужели только логи?
У нас в основном блокировки объектов средствами бизнес-логики (реестр с пометками, что такой-то физический или логический объект редактируется). Для некоторых объектов разрешено только эксклюзивное редактирование, для некоторых -- совместное. При сохранении происходит merge данных (скажем, если 1 пользователь отредактировал описание, а другой -- приаттачил документ, то нет смысла откатывать, можно безболезненно смержить) или отказ с уведомлением одного из пользователей; в зависимости от полномочий он имеет право только повторить редактирование или даже перетереть изменения другого. Раньше куча логики была в БД (опять же, исторически сложилось, что мы мигрировали на 3хзвенку с 2хзвенки, да еще и с с++builder --> c#, а там было много кода в БД на T-SQL), счас постепенно сумели от этого избавиться.
Или вы про какие-то другие ошибочные состояния говорите?
Re[8]: Архитектура приложения с несколькими клиентами и одни
Все поскипаное понял, спасибо.
M>Или вы про какие-то другие ошибочные состояния говорите?
Да, я имел ввиду состояния, нарущающие бизнес-логику, например, в БД у клиента хранятся записи, что он был в одно и то же время в разных местах или что-нибудь такое, причем повторить такое не получается. Обычно можно строить предположения и проверять их по очереди, зная архитектуру, но это часто долго, а иногда и придумать что-то сложно. Я представляю, что только по логам, в которые писать все опериции над объектами и соответственно идентификаторы объектов. Но лог писать на каждое действие — это несколько бъет по производительности, а если клиент удаленный, то все еще хуже т.к. придется просить клиента, чтобы он логи прислал, или делать механизм выгрузки логов... в общем не ясно какие механизмы применять в случае обнаружения ошибочных данных в БД.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[10]: Архитектура приложения с несколькими клиентами и одн
есть проблема: коллизии
есть инструменты: навернуть, откатать, смеждить и т.д.
пишите что является критерием выбора инструмента: — самый простой пример критерия — это решение проблемы, если в результате использования этого критерия все равно есть несколько инструментод — добавляете допольнительные критерии: скорость, или возможность сопровождения и т.д.
теперь возникает вопрос — что является решением вашей проблемы. а решение описано в документе SRS, в разделе функциональные требования, где описано поведение системы... теперь вы смотрите какой из интрументов обеспечивает вам требуемое поведение системы и используете его. если требовни нет берете аналитика или того кто выполняет его роль и выявляете эти требования. т.е. у носителей знаний выявляете как должна функционировать система при той или иной ситуации ...
поведение системы зависит от конкретных требований заказчика, т.е. если рассуждать абстракто, то можно сделать и так, а можно сделать и эдак. вот по этому ребята, которые вам пытаются помочь советом, и спрашивают о конкретных примерах поведения системы, чтобы понять какой интсрумент вам посоветовать. ответить "я не знаю как лучше, подскажите"?
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Расскажите это заказчику, к которому будут идти недовольные клиенты
насколько я понимаю, заказчик именно к вам и обратился потому, что именно вы и являетесь специалистом в реализации, а не он... по этому именно на вас как на разработчике( специалисте в реализации) лежит ответсвенность за успешную реализацию проекта. клиент всегда имеет свое видение, но его видение базируется на его опыте, на его багаже заний в данной области — у вас как у исполнителя этот багаж должен быть больше. по этому при реализации проекта ваше мнение имеет довольно высокий приоритет — я хочу сказать, что убеждайте вашего клиента и не давайте ему вами рулить как он этого хочет. потму что ответ держать в любом случае вам как исполнителю... и аргументы типа ну вы же сами говорили как нужно в последствии не конают, потому как аргумент заказчика простой — а кто из нас специалист ?
(вы — это абстракция канторы, или IT отдела если в рамках канторы работаете)
Re[2]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
не понял — что она сосет ? человеческие ресурсы на реализацию? системные ресурсы сервера ?
как на меня любой архитектурный стиль, трезвенка, SOA и т.д. привносит свои плюсы и минусы, и в результате выбор — это компромис... необходимо только составить критерии выбора.
G>И ты предлагаешь держать открытой сессию, пока клиент редактирует объект? Масштабируемость будет нулевая.
да это правда — хуже не придумаешь... такое решение очень плохо сказывается на производитлеьности, масштабируемости системы... я сомневаюсь что кто-то захочет воплотить такое решение по собственной воле.
O>> Решение N2: O>> Сразу скажу, что это решение я до конца не понял, однако как альтернативу то же хотелось бы рассмотреть. O>> Решение заключается в том, чтобы каждый объект требуемый клиенту маршалить из сервера на клиент по ссылке. Решение нацелено на то, чтобы устранить проблему неактуальности данных на клиенте. Т.е. получается, что на клиенте всегда будет ссылка на актуальный объект. При этом, как я понимаю, на клиенте перед каждой операцией нужно будет лочить объект и проверять, что его состояние не изменилось с момента последнего чтения, после чего обновлять и разлочивать. O>> Проблемы (и вопросы) решения N2: O>> 1. до конца не понятен механизм разруливания коллизий и возможные сложности; O>> 2. как работать с временем жизни объектов? O>> 3. как быть, если клиент на некоторое время отвалиться от соединения с сервером? O>> 4. будут ли маршалиться NHibernatе'овские прокси? G>Это худший вариант развития событий. G>1)На любое дергание объекта придется бегать на сервер G>2)Все изменения надо передавать клиентам G>3)Проблемы с контролем времени жизни
.Net Remoting например, на сервероном стабе можно организовать отслеживание изменений. там же в ремоутинге есть сервис управления жизнью объекта.
O>> Воообще, интересуют любые решения практикующих разработчиков
самое простое что приходит в голову это создание несколко представлений для одной модели. где контроллер получая изменения модели и оповещает представления об изменениях, или в зависомости от клиента и требований не оповещает. а вообще без конкретных примеров поведения как я уже писал выше проблема имеет два решения, первое:или вы лочите объект и делаете изменения и разлочиваете, его при этом даете другим клиентам возможность читать данные, но не изменять их. второе:или вы даете возможность нескольким клиентам брать данные с возможностью изменений в этом слечае вам придется решать проблемы с отслеживанием изменений и соотвественно при необходимости мерджем данных...
сюда в зависимости от требований и критичности можно добавить нотификацию об изменениях и возможности редактировании... кстати пример первого поведения реализован в ворде, а в VSS реализованы оба подхода...
Re[6]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, VPVinnitsky, Вы писали:
O>> Расскажите это заказчику, к которому будут идти недовольные клиенты VPV>насколько я понимаю, заказчик именно к вам и обратился потому, что именно вы и являетесь специалистом в реализации, а не он... по этому именно на вас как на разработчике( специалисте в реализации) лежит ответсвенность за успешную реализацию проекта. клиент всегда имеет свое видение, но его видение базируется на его опыте, на его багаже заний в данной области — у вас как у исполнителя этот багаж должен быть больше. по этому при реализации проекта ваше мнение имеет довольно высокий приоритет — я хочу сказать, что убеждайте вашего клиента и не давайте ему вами рулить как он этого хочет. потму что ответ держать в любом случае вам как исполнителю... и аргументы типа ну вы же сами говорили как нужно в последствии не конают, потому как аргумент заказчика простой — а кто из нас специалист ?
Это понятно
VPV>(вы — это абстракция канторы, или IT отдела если в рамках канторы работаете)
Я — пока разработчик и соархитектор за зарплату На себя ответственность пока брать не могу из-за опыта, иначе бы тут вопросы не задавал
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, VPVinnitsky, Вы писали:
VPV>есть проблема: коллизии VPV>есть инструменты: навернуть, откатать, смеждить и т.д. VPV>пишите что является критерием выбора инструмента: — самый простой пример критерия — это решение проблемы, если в результате использования этого критерия все равно есть несколько инструментод — добавляете допольнительные критерии: скорость, или возможность сопровождения и т.д. VPV>теперь возникает вопрос — что является решением вашей проблемы.
Решением моей проблемы является архитектура, которую на каждое новое требование заказчика не надо будет сильно переписывать.
VPV>а решение описано в документе SRS, в разделе функциональные требования, где описано поведение системы... теперь вы смотрите какой из интрументов обеспечивает вам требуемое поведение системы и используете его. если требовни нет берете аналитика или того кто выполняет его роль и выявляете эти требования. т.е. у носителей знаний выявляете как должна функционировать система при той или иной ситуации ...
Аналитик... Я наверно и соаналитик Пока ответственности не ясны, однако некоторое исследование провести необходимо. Сам никогда таких вещей не писал и мой ПМ, который тут же и директор маленькой компании разработки ПО то же не имел подобного опыта. Он думает как делать тз, которое он написал и я думаю как это сделать. У меня более абстрактный интерес, потому как в предметную область сам еще глубоко не вдавался и считаю, что это не мешает начать понимать как строить архитектуру с несколькими клиентами, которые уже есть в утвержденном тз.
VPV>поведение системы зависит от конкретных требований заказчика, т.е. если рассуждать абстракто, то можно сделать и так, а можно сделать и эдак.
Вот мне и интересно: как именно так и этак.
VPV>вот по этому ребята, которые вам пытаются помочь советом, и спрашивают о конкретных примерах поведения системы, чтобы понять какой интсрумент вам посоветовать. ответить "я не знаю как лучше, подскажите"?
Есть ребята, которые отвечают не спрашивая и отвечают по делу, так что я понимаю и остаюсь удовлетворенным ответами.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, VPVinnitsky, Вы писали:
G>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос. VPV>не понял — что она сосет ? человеческие ресурсы на реализацию? системные ресурсы сервера ? VPV>как на меня любой архитектурный стиль, трезвенка, SOA и т.д. привносит свои плюсы и минусы, и в результате выбор — это компромис... необходимо только составить критерии выбора.
Очень красиво сказано, однако чаще решение принимаются не столь идеалистично. У всех есть некоторый опыт, все имеют некую консервативность и придерживаются некоторого стиля... Я вот, по собственной воле вряд ли буду делать толстую domain model или работать с dataset'ами, хотя опыта в этом у мало для того чтобы так категорично судить.
G>>И ты предлагаешь держать открытой сессию, пока клиент редактирует объект? Масштабируемость будет нулевая. VPV>да это правда — хуже не придумаешь... такое решение очень плохо сказывается на производитлеьности, масштабируемости системы... я сомневаюсь что кто-то захочет воплотить такое решение по собственной воле.
Согласен.
O>>> Проблемы (и вопросы) решения N2: O>>> 1. до конца не понятен механизм разруливания коллизий и возможные сложности; O>>> 2. как работать с временем жизни объектов? O>>> 3. как быть, если клиент на некоторое время отвалиться от соединения с сервером? O>>> 4. будут ли маршалиться NHibernatе'овские прокси? G>>Это худший вариант развития событий. G>>1)На любое дергание объекта придется бегать на сервер G>>2)Все изменения надо передавать клиентам G>>3)Проблемы с контролем времени жизни VPV>.Net Remoting например, на сервероном стабе можно организовать отслеживание изменений. там же в ремоутинге есть сервис управления жизнью объекта.
Вот в этом и проблема, что это время жизни контролировать загребешься, не учитывая другие перечисленные проблемы, особенно, на мой взгляд, производительность, хотя тестовый прототип не писал. Если честно, не знаю даже с какой стороны подступиться и желания, соответственно нет, поэтому эта задача на том, кто предложил такой вариант Буду ли я такой вариант кодить — еще вопрос
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[13]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka
S>>А вот это очень распространённое заблуждение — верить что программа ценна сама по себе, и не потребуется интеграция с другими системами. O> А если потребуется, от что? Нельзя будет учесть версию объекта, или транзакционность БД как-то отменится?
Вы меня неправильно поняли — я писал про блокировку намерения — она имеет смысл только для вашего приложения. Но и optimistic concurrency это тоже относится.
S>>Данные у вас лежат в СУБД — любой запрос может помацать их несмотря ни на какие псевдоблокировки. O> Раскажите, наконец, каким образом? Например, есть объект "клиент" у него есть свойство "счет". Объект имеет версию, лежит в БД. Дав клиента забирает его из БД, изменяют и пытаются положить обратно предварительно проверив версию объекта. Как возможна коллизая, эсли "помацать" — это коллизия ?
Легко, если клиент другой системы не использует оптимистическую блокировку и созраняет изменения после вас. Если не делать проверки силами самой СУБД — через триггеры или хранимые процедуры.
Re[12]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали:
O> Решением моей проблемы является архитектура, которую на каждое новое требование заказчика не надо будет сильно переписывать.
как говрится — дьявол кроется в деталях архитектура это карта описывающая способ решения, но сама по себе не является ее решением, имеено чатью архитектурного процесса и является создание и описание решения проблемы... (но это вне темы данного топика)
VPV>>а решение описано в документе SRS, в разделе функциональные требования, где описано поведение системы... теперь вы смотрите какой из интрументов обеспечивает вам требуемое поведение системы и используете его. если требовни нет берете аналитика или того кто выполняет его роль и выявляете эти требования. т.е. у носителей знаний выявляете как должна функционировать система при той или иной ситуации ...
O> Аналитик... Я наверно и соаналитик Пока ответственности не ясны, однако некоторое исследование провести необходимо. Сам никогда таких вещей не писал и мой ПМ, который тут же и директор маленькой компании разработки ПО то же не имел подобного опыта. Он думает как делать тз, которое он написал и я думаю как это сделать. У меня более абстрактный интерес, потому как в предметную область сам еще глубоко не вдавался и считаю, что это не мешает начать понимать как строить архитектуру с несколькими клиентами, которые уже есть в утвержденном тз.
собственно кто какие роли в проекте играет не имеет значени — это может сказываться толко на качестве результата, я про аналитика сказал для того, что прежде чем решать проблему вам нужны буду знания о требуемом поведении системы в том или ином случае (ее состоянии)...
пример:
вы клиент 1, я клиент 2. вы бирете Business Entity (BE) и я биру ту же BE. оба делаем изменения, чью версию сохраняем ? при такой постановке вопроса — проблема решения не имеет, но как только мы введем допольнительные правила — например по премени изменений (вы раньше взял я позже), по приоритеру ролей (у вас роль с низким приоритетом и для внесения измений в хранилище ваши данные должны еще пройти утверждение у менеджера), т.д. правила могут быть разные... т.е. нужно уточнить необходимое поведение системы.
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Обратная связь — это когда сервер уведомляет клиентов об изменении. А когда с клиента на сервер передавать — сразу или при нажатии на сейв — это не обратная связь.
первая часть — контроллер принимает решение о необходимости извещения представлений...
вторая часть — сто является тригером для принятия этого решения конт роллером, думаю, вам видней — это может быть save, изменение страницы, автосейв и т.д. вам видней.
нажатие на кнопки сохранить на клиенте 1 не может быть уведомлением сервера для других клиентов, — это может быть триггером контроллера для запуска процесса сохраниение, в рамках которого можгут быть уведомлены об изменениях модели другие клиенты, а могут быть и не уведомлены
O>>>>>>>Интересно какие в этом решении еще могут быть проблемы и как с ними бороться. Тестовый прототип уже пишу, но все равно хочу знать мнение практикующей общественности.
проблемы могут быть разные — в если хотите иметь их полный список — опишите UC сохранениея BE в формальной форме — и для каждого пункта в основном потоке сделайте алтернативу... чем точнее будет ваш основной поток, тем точнее вы сможите составить список возможных альтернатив, тем полнее будет картина возможных проблем
G>>>>Создавать сферическую архитектуру в вакууме не получится.
да это правильно — хотя бы потому что архитектура это решение проблемы — нет проблемы нет решения
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Мне вот сейчас интересно стало как общий случай трехзвенки реализуется. Логика работы с данными выносится на сервер, а на каждом клиенте дополнительно своя небольшая логика? Т.е. алгоритм примерно такой? : O> 1. Клиент запрашивает у сервера нужные объекты через сервис. O> 2. Сервер получает объекты из БД и отдает на клиента, сериализуя. O> 3. Клиент работает с объектами через свою логику, параллельно обращаясь на сервер по необходимости (что бы залочить например объект) O> 4. Клиент возвращает объекты серверу с просьбой сохранить состояние, в случае проблем дополнительная логика на клиенте разруливает проблемы.
Как делал я: практически на каждый use case редактирования у сервера есть 2 метода, взять и сохранить. Берется DTO в котором есть все необходимые данные, на сохранение приходит тоже оно. Если при сохранении случился конфликт — сервер может попытаться разрулить его автоматически, если не получилось кидает экзепшн, далее разруливать приходится пользователю на клиенте.
O> А в случае тонкого клиента все операции, в том числе модификация производятся через сервер?
Это и есть случай тонкого клиента. В случае толстого клиента сервер выглядит как набор DAO, вся логика работы с данными рулится клиентом.
O> Еще мне интересно как разбор ошибочных состояний в БД производится (при обнаружении такого состояния). O> Что в 2-х звенке, что в 3-х — неужели только логи?
А чем не устраивают логи? Возьмите log4net, отлично фильтруются снаружи, есть средства онлайн мониторинга, можно ошибки кидать по почте.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[7]: Архитектура приложения с несколькими клиентами и одни
Ну да, вобщем-то я сам те же доводы приводил в форуме БД, даже тесты делал, а мне твердили GUID'ы наше все. Не пойму, что мешает команде MSSQL сделать нормальный сиквенс, который подерживают практически все промышленные субд. Впрочем оффтопик.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Ну да, вобщем-то я сам те же доводы приводил в форуме БД, даже тесты делал, а мне твердили GUID'ы наше все. Не пойму, что мешает команде MSSQL сделать нормальный сиквенс, который подерживают практически все промышленные субд. Впрочем оффтопик.
Плохому танцору (т.е. MsSQL) .. )) Нормальный сиквенс можно симулировать триггером и таблицей, может, поэтому и не хотят -- и так прокатывает.
Насчет "guid'ы наше все" -- для таких оригиналов в nhibernate есть guid.comb, как я уже сказал
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Как делал я: практически на каждый use case редактирования у сервера есть 2 метода, взять и сохранить. Берется DTO в котором есть все необходимые данные, на сохранение приходит тоже оно. Если при сохранении случился конфликт — сервер может попытаться разрулить его автоматически, если не получилось кидает экзепшн, далее разруливать приходится пользователю на клиенте.
Именно поэтому есть желание отказаться от SOAP-service и перейти на REST-like DAO -- не нужно будет по каждому чиху менять WSDL. (О своем: вообще считаю, что в таком случае SOAP WebService был выбран неудачно)
Z>Это и есть случай тонкого клиента. В случае толстого клиента сервер выглядит как набор DAO, вся логика работы с данными рулится клиентом.
Если сервер исключительно DAO-контейнер, то чисто толстый клиент в 3хзвенке иметь смысла не вижу, тем более при наличии Nhibernate ; лучше тогда 2хзвенка + shared cache. Тут, конечно, свои нюансы, например, интеграция с другими системами, требующая сервера, или хитрая репликация средствами серверной логики.
Z>А чем не устраивают логи? Возьмите log4net, отлично фильтруются снаружи, есть средства онлайн мониторинга, можно ошибки кидать по почте.
Мне кажется, он что-то другое имеет в виду )
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Да, я имел ввиду состояния, нарущающие бизнес-логику, например, в БД у клиента хранятся записи, что он был в одно и то же время в разных местах или что-нибудь такое, причем повторить такое не получается. Обычно можно строить предположения и проверять их по очереди, зная архитектуру, но это часто долго, а иногда и придумать что-то сложно. Я представляю, что только по логам, в которые писать все опериции над объектами и соответственно идентификаторы объектов. Но лог писать на каждое действие — это несколько бъет по производительности, а если клиент удаленный, то все еще хуже т.к. придется просить клиента, чтобы он логи прислал, или делать механизм выгрузки логов... в общем не ясно какие механизмы применять в случае обнаружения ошибочных данных в БД.
У нас есть логи правок, хранящиеся в БД -- например, по сохранению объектов в таблицу логов кладется предыдущее состояние объекта, упакованное в xml и пожатое для компактности. Потом с него можно восстановить объект на нужную версию. Периодически лог чистится согласно админ. политикам. Для некоторых сложных объектов ведется история правок как понятия предметной области.
Счас это все делается триггерами, но есть желание в новой системе перевести это на message-based system -- MSMQ или аналог (ApacheMQ, RabbitMQ), чтобы БД была меньше загружена и не сказывалось на производительности в целом.
Есть также логгирование исходящих запросов на интеграцию со сторонними системами, логгирование входящих/исходящих репликаций. Есть еще автоматизированный валидатор, но его возможности в настоящий момент ограничены проверкой метаданных.
Логгирование при помощи log4net -- есть, но так, для ясности, оно в работе не используется, только при отладке багов.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали:
M>Именно поэтому есть желание отказаться от SOAP-service и перейти на REST-like DAO -- не нужно будет по каждому чиху менять WSDL. (О своем: вообще считаю, что в таком случае SOAP WebService был выбран неудачно)
Согласен, но у нас вообще remoting+binary serialization по некоторым причинам.
Z>>Это и есть случай тонкого клиента. В случае толстого клиента сервер выглядит как набор DAO, вся логика работы с данными рулится клиентом. M>Если сервер исключительно DAO-контейнер, то чисто толстый клиент в 3хзвенке иметь смысла не вижу, тем более при наличии Nhibernate ; лучше тогда 2хзвенка + shared cache. Тут, конечно, свои нюансы, например, интеграция с другими системами, требующая сервера, или хитрая репликация средствами серверной логики.
+1
M>Мне кажется, он что-то другое имеет в виду )
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[14]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinix, Вы писали:
S>>>А вот это очень распространённое заблуждение — верить что программа ценна сама по себе, и не потребуется интеграция с другими системами. O>> А если потребуется, от что? Нельзя будет учесть версию объекта, или транзакционность БД как-то отменится? S>Вы меня неправильно поняли — я писал про блокировку намерения — она имеет смысл только для вашего приложения. Но и optimistic concurrency это тоже относится.
Понятно дело, что левое приложение не сможет просто так подключиться и начать работать Придется промежуточную логику для сторонних приложений писать, но это перпендикулярные проблемы, к теме особого отношения не имеющие.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>У нас есть логи правок, хранящиеся в БД -- например, по сохранению объектов в таблицу логов кладется предыдущее состояние объекта, упакованное в xml и пожатое для компактности. Потом с него можно восстановить объект на нужную версию. Периодически лог чистится согласно админ. политикам. Для некоторых сложных объектов ведется история правок как понятия предметной области. M>Счас это все делается триггерами, но есть желание в новой системе перевести это на message-based system -- MSMQ или аналог (ApacheMQ, RabbitMQ), чтобы БД была меньше загружена и не сказывалось на производительности в целом. M>Есть также логгирование исходящих запросов на интеграцию со сторонними системами, логгирование входящих/исходящих репликаций. Есть еще автоматизированный валидатор, но его возможности в настоящий момент ограничены проверкой метаданных. M>Логгирование при помощи log4net -- есть, но так, для ясности, оно в работе не используется, только при отладке багов.
Все понял, спасибо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, gandjustas, Вы писали:
G>>>>Наверное при нажатии save, но в таком случае и передавать на сервер не надо. O>>> Как не надо? А как об изменении смогут узнать другие клиенты? G>>Сам же написал что без обратной связи. Тогда зачем до save куда-то что-то передавать?
O> Обратная связь — это когда сервер уведомляет клиентов об изменении. А когда с клиента на сервер передавать — сразу или при нажатии на сейв — это не обратная связь.
Это я понял, я не понял зачем передавать что-то на сервер до нажатия save без обратной связи.
G>>>>Создавать сферическую архитектуру в вакууме не получится. O>>> Однако, глядя на ваши ответы, я считаю, что у вас это вполне получается Без обид. O>>>Просто я не вижу у вас понимания решения N1. G>>Это у тебя нету понимания решения N1, я такие решения в разных видах уже делал. O> С тонкой domain model делал?
Я только с тонкой сейчас и работаю.
O>>>То, что вы пробовали городить dataset'ы — это я уже выяснил G>>Мимо. Как раз решения с dataset я предпочитаю не городить, я один раз начал такое делать и быстро отказался. O> А как делал?
Что именно?
O>>>>>>> Воообще, интересуют любые решения практикующих разработчиков, а так же мнения относительно адекватности двух приведенных мною решений. Адекватность прошу оценивать по времени написания, отладки и поддержки. G>>>>>>Оба неадекваты на 99% O>>>>> Предлагайте! G>>>>Сделать кнопку Save, по которой сохранять изменения. G>>>>Далее 3 варианта: G>>>>1)Локальная реплика БД, которая хранит измененные данные (dataset или SQL CE) и периодическая синхронизация с сервером (передача changeset датасета или Sync Services для SQL CE) O>>> В задаче сказано, что БД — одна. G>>И что? SQL CE — несколько dll и больше ничего не надо
O> Я знаю, что такое SQL CE и работал с ней, однако, синхронизация должна быть чаще чем раз в минуту. Городить для этого репликацию из локальных БД... Синхронизацию руками проводить? Чем локальный кэш NHibernate хуже, чем локальная БД?
Есть sync framework, который все сам делает. А лучше кеша потому что всетаки РСУБД, а не коллекция объектов в памяти.
Но если актуальность информации важна, то лучше локальным кешированием оперативных данных не заниматься. Только справочники.
G>>>>2)Написать кучу сервисов и DTO O>>> Это зачем и к чему? G>>Ко всему. Если клиент не толстый, то лучше увеличить гранулярность обращения к серверу. Для этого потребуется метод сервиса и вероятнее всего DTO. O> Клиент толстый.
Если толстый — тогда вариант ниже.
G>>>>3)Воспользоваться EF\Linq2SQL+ADO.NET Data Services O>>> Каким образом? G>>Создть модель в EF дизайнере, создать сервис ADO.NET, сделать клиент. O> Не пробовал EF, слышал негативные отзывы, как работает — не представляю. В чем преимущества?
Ты EF при таком подходе даже не увидишь
Посмотри примеры с ADO.NET Data Services — удивишься. Через полгода как раз доделают сихнхронизацию через эти сервисы и допилят нужный функционал (сейчас доступен в CTP).
O>>> Есть четкая задача, которую я обозначил дважды, повторю еще раз: есть два клиента, работающих с общей БД. Как реализовать их работу при отсутствии коллизий? G>>Наверное при наличии коллизий. Варианта как всегда два: G>>1)пессимистичная блокировка — когда данные могут меняться только одним клиентом в один момент времени. G>>2)оптимистичная блокировка, когда оба редактируют данные, если при попытке сорхнанить версии не сопадают — исправить конфликт и попытаться еще раз. G>>Оптимистичная блокировка на самом деле блокировкой не является, несмотря на назание, и в некоторых случаях не работает.
O> Почему не работает? У же который раз пишут, что может не работать, однако я не представляю как это возможно в случае наличия версии в каждой сущности и транзакционной БД.
Сценарий.
Для корректного обновления X надо прочитать из Y, выполнить запрос на внешний сервис с данными из Y, записать результат в X.
Один клиент читает Y, начинает выполнять запрос, в этот момент другой клиент меняет Y. Так как первый клиент Y не менял, то конфликт версий при сохранении даже не будет проверяться, тем не менее данные будут несогласованы.
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Как делал я: практически на каждый use case редактирования у сервера есть 2 метода, взять и сохранить. Берется DTO в котором есть все необходимые данные, на сохранение приходит тоже оно. Если при сохранении случился конфликт — сервер может попытаться разрулить его автоматически, если не получилось кидает экзепшн, далее разруливать приходится пользователю на клиенте.
Спасибо, опять все понятно
O>> Еще мне интересно как разбор ошибочных состояний в БД производится (при обнаружении такого состояния). O>> Что в 2-х звенке, что в 3-х — неужели только логи? Z>А чем не устраивают логи? Возьмите log4net, отлично фильтруются снаружи, есть средства онлайн мониторинга, можно ошибки кидать по почте.
Нет нет, логи устраивают, просто хотелось узнать может это еще как-то сделать можно... А вспомогательные инструменты для работы с логом есть или просто через "блокнот" просмативаются при помощи поиска по id интересующего объекта? Просто мне кажется, что можно было бы навернуть небольшое преложение для просмотра логов, которое знает немного о бизнес-логике, чтобы наглядней отображать сразу логические последовательности работы с интересующими объетами или как-то так... в общем, просто интересно было как у вас сделано.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, gandjustas, Вы писали:
Z>>>Примеры неDDDшных конструкций в студию. G>>В основном дополнительные классы для работы с произвольными выборками. Не помню уже все давно это было и на делфи. Z>Почему ты решил, что эти кклассы "неDDDшные"? Рич модель не обязана состоять только из персистных классов. Она отличается от тонкой только тем, что допускает логику в персистных, но нигде не говорится об обязательном отсутствии BL в других классах.
И что? Получим размазываение логики? нет уж, спасибо.
G>>Еще раз модель — часть программы. Рассматривать модель отдельно от программы смылса нету. G>>Не бывает модель ценной сама по себе.
Z>>>Это не философия, если ты не выделяешь подобного ядра — тебе надо быть уверенным во всей программе. G>>А если бы выделял ядро, то не надо было бы быть уверенным?
Z>Это уже пошла философия. Есть критические ошибки в БЛ, которые стоят очень дорого. Есть некое ядро, при корректности которого нарушить БЛ сложно/невозможно. Чем компактнее это ядро, тем легче его поддерживать. Я убежден, что рич модель позволяет сделать такое ядро более компактным и проще поддерживаемым. Правда требует большей квалификации при его дизайне.
Уж точно философия. Я всетаки тесты предпочитаю чтобы быть уверенным.
Z>Пример из практики, при переводе на клиент-сервер одной из систем сделали из рич модели тощую, руководствуясь примерно теми же мотивами, что и ты декларируешь. Ядро логики мне не удалось изолировать так же хорошо как и в жирной, хотя я проектировал ее на три года позже чем жирную (смею надеяться, что за три года в голове прибавилось ). Реюз кода уменьшился и, как я ни старался, сейчас требуется намного больше знаний о системе для написания новой логики. Сейчас я уже не так уверен, что решение проблем рич модели было бы дороже. И уж точно не сомневаюсь в праве рич моделей на жизнь.
Я даже не смоневаюсь что переделка rich в anemic даст такой эффект.
Это примерно как попробовать переделать OO-программу в функциональную.
G>>Я вообще-то тесты пишу. Z>Дада, и в твоих программах больше нет ни одной ошибки. Рич модель несоместима с тестами чтоли?
Совместима, только все разговоры о "ядре" больше ни к чему.
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>>>>>Наверное при нажатии save, но в таком случае и передавать на сервер не надо. O>>>> Как не надо? А как об изменении смогут узнать другие клиенты? G>>>Сам же написал что без обратной связи. Тогда зачем до save куда-то что-то передавать? O>> Обратная связь — это когда сервер уведомляет клиентов об изменении. А когда с клиента на сервер передавать — сразу или при нажатии на сейв — это не обратная связь. G>Это я понял, я не понял зачем передавать что-то на сервер до нажатия save без обратной связи.
Логическая цепочка этого обсуждения мной уже потеряна. Изначально я предлагал как альтернативу кнопке save сразу отсылать на сервер изменения, но это уже в прошлом.
O>> Почему не работает? У же который раз пишут, что может не работать, однако я не представляю как это возможно в случае наличия версии в каждой сущности и транзакционной БД. G>Сценарий. G>Для корректного обновления X надо прочитать из Y, выполнить запрос на внешний сервис с данными из Y, записать результат в X. G>Один клиент читает Y, начинает выполнять запрос, в этот момент другой клиент меняет Y. Так как первый клиент Y не менял, то конфликт версий при сохранении даже не будет проверяться, тем не менее данные будут несогласованы.
Видимо, придется лочить дерево зависимых объектов, как уже упомянал meowth.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[3]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, VPVinnitsky, Вы писали:
VPV>.Net Remoting например, на сервероном стабе можно организовать отслеживание изменений. там же в ремоутинге есть сервис управления жизнью объекта.
Ох сколько подводных камней этот путь таит, лучше даже не считать.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Нет нет, логи устраивают, просто хотелось узнать может это еще как-то сделать можно... А вспомогательные инструменты для работы с логом есть или просто через "блокнот" просмативаются при помощи поиска по id интересующего объекта? Просто мне кажется, что можно было бы навернуть небольшое преложение для просмотра логов, которое знает немного о бизнес-логике, чтобы наглядней отображать сразу логические последовательности работы с интересующими объетами или как-то так... в общем, просто интересно было как у вас сделано.
Да нет, мы в фаре смотрим, анхендлед экзкпшены сервера по почте шлются.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Я даже не смоневаюсь что переделка rich в anemic даст такой эффект. G>Это примерно как попробовать переделать OO-программу в функциональную.
На этой оптимистичной ноте предлагаю закрыть дискуссию, полезных знаний мне она точно не приносит, тебе как я вижу тоже. Предлагаю считать, что я плохо справляюсь с недостатками анемик модели, а ты рич.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O> Видимо, придется лочить дерево зависимых объектов, как уже упомянал meowth.
Это уже будет пессимистичная блокировка.
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
O>> Нет нет, логи устраивают, просто хотелось узнать может это еще как-то сделать можно... А вспомогательные инструменты для работы с логом есть или просто через "блокнот" просмативаются при помощи поиска по id интересующего объекта? Просто мне кажется, что можно было бы навернуть небольшое преложение для просмотра логов, которое знает немного о бизнес-логике, чтобы наглядней отображать сразу логические последовательности работы с интересующими объетами или как-то так... в общем, просто интересно было как у вас сделано. Z>Да нет, мы в фаре смотрим, анхендлед экзкпшены сервера по почте шлются.
Шлются непосредственно из приложения при отлове такого экзкпшена или отдельное приложение мониторит лог и шлет? Мне это не принципиально, однако для себя вижу бОльшую надежность в отдельном мониторе.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали:
O> Шлются непосредственно из приложения при отлове такого экзкпшена или отдельное приложение мониторит лог и шлет? Мне это не принципиально, однако для себя вижу бОльшую надежность в отдельном мониторе.
Здравствуйте, Ziaw, Вы писали:
O>> Шлются непосредственно из приложения при отлове такого экзкпшена или отдельное приложение мониторит лог и шлет? Мне это не принципиально, однако для себя вижу бОльшую надежность в отдельном мониторе. Z>SmtpAppender Z>log4net Config Examples
Спасибо, запомню на будующее. А не подскажете, что произойдет, если в момент исключения почтовый сервер или транспорт будут не доступны? Отправится ли исключение позже или потеряется?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, Ziaw, Вы писали:
O> Нет нет, логи устраивают, просто хотелось узнать может это еще как-то сделать можно... А вспомогательные инструменты для работы с логом есть или просто через "блокнот" просмативаются при помощи поиска по id интересующего объекта? Просто мне кажется, что можно было бы навернуть небольшое преложение для просмотра логов, которое знает немного о бизнес-логике, чтобы наглядней отображать сразу логические последовательности работы с интересующими объетами или как-то так... в общем, просто интересно было как у вас сделано.
Можно смотреть логи в Apache Chainsaw. Для более детального просмотра, конечно, стоит написать свой тул.
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, gandjustas, Вы писали:
G>Есть sync framework, который все сам делает. А лучше кеша потому что всетаки РСУБД, а не коллекция объектов в памяти. G>Но если актуальность информации важна, то лучше локальным кешированием оперативных данных не заниматься. Только справочники.
По-моему, вы напрасно впариваете тут Синк Фреймворк. Не тот сценарий, не та задача -- имхо не надо клиент-сервер превращать в распределенную БД. То что Синк умеет делать репликации, это очень хорошо, но здесь это не надо, судя по постановке задачи.
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
O>> Нет нет, логи устраивают, просто хотелось узнать может это еще как-то сделать можно... А вспомогательные инструменты для работы с логом есть или просто через "блокнот" просмативаются при помощи поиска по id интересующего объекта? Просто мне кажется, что можно было бы навернуть небольшое преложение для просмотра логов, которое знает немного о бизнес-логике, чтобы наглядней отображать сразу логические последовательности работы с интересующими объетами или как-то так... в общем, просто интересно было как у вас сделано. M>Можно смотреть логи в Apache Chainsaw. Для более детального просмотра, конечно, стоит написать свой тул.
Ясно, спасибо за общение, очень понравилось!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали: O> Ясно, спасибо за общение, очень понравилось!
Не за что. Спрашивайте, может, и помогу чем, если знаю и буду тут.
Я бы вам еще порекомендовал на эту тему с Mike Chaliy пообщатьсо. Правда, имхо они куда-то далеко утопали, Fluent NHibernate + не знаю, юзают ли Spring.NET; но он конкретный практик, и много интересного рассказывает из своего опыта.
Re[12]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Не за что. Спрашивайте, может, и помогу чем, если знаю и буду тут. M>Я бы вам еще порекомендовал на эту тему с Mike Chaliy пообщатьсо. Правда, имхо они куда-то далеко утопали, Fluent NHibernate + не знаю, юзают ли Spring.NET; но он конкретный практик, и много интересного рассказывает из своего опыта.
Еще раз спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[13]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали:
O> Спасибо, запомню на будующее. А не подскажете, что произойдет, если в момент исключения почтовый сервер или транспорт будут не доступны? Отправится ли исключение позже или потеряется?
Афайк потеряется, это очень простой аппендер, который держит последние n эвентов в циклическом буфере и сбрасывает их по триггеру в email.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Есть sync framework, который все сам делает. А лучше кеша потому что всетаки РСУБД, а не коллекция объектов в памяти. G>>Но если актуальность информации важна, то лучше локальным кешированием оперативных данных не заниматься. Только справочники.
M>По-моему, вы напрасно впариваете тут Синк Фреймворк. Не тот сценарий, не та задача -- имхо не надо клиент-сервер превращать в распределенную БД. То что Синк умеет делать репликации, это очень хорошо, но здесь это не надо, судя по постановке задачи.
Трехзвенка с толстым клиентом — это практически единственный случай, когда имеет смысл делать локальную реплику. Поэтому и предлагаю такой подход.
Уж точно не пытаюсь впарить его. Впарить пытаюсть ADO.NET Data Services.
Re[10]: Архитектура приложения с несколькими клиентами и одн
G>Трехзвенка с толстым клиентом — это практически единственный случай, когда имеет смысл делать локальную реплику. Поэтому и предлагаю такой подход. G>Уж точно не пытаюсь впарить его. Впарить пытаюсть ADO.NET Data Services.
Тогда, если вы имели в виду толстый клиент с репликой, как сюда укладывается вот это ваше раннее заявление в начале треда: G>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
По-моему, совсем наоборот: при наличии локальной реплики тонкая модель не нужна, потому что все объекты находятся в одном физическом пространстве -- в UI можно подавать domain и/или presentation объекты, проблема SRP решается прямыми руками архитектора.
Соответственно, преимущество тонкой модели выступать в роли DTO здесь совершенно не нужно. Зато код из-за нее не сильно отличается от манипуляций с типизированными датасетами -- шумный, полный деталей реализации и нифига не предметной области. Выше Mike Chaliy привел пример.
Хотел еще сказать, топикстартер уже выяснил, что у него будет 2х-звенка с толстым клиентом.
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Трехзвенка с толстым клиентом — это практически единственный случай, когда имеет смысл делать локальную реплику. Поэтому и предлагаю такой подход. G>>Уж точно не пытаюсь впарить его. Впарить пытаюсть ADO.NET Data Services.
M>Тогда, если вы имели в виду толстый клиент с репликой, как сюда укладывается вот это ваше раннее заявление в начале треда: G>>Общая проблема состоит в том, что жирная модель (она же domain model) в многозвенном приложении сосет как пылесос.
M>По-моему, совсем наоборот: при наличии локальной реплики тонкая модель не нужна, потому что все объекты находятся в одном физическом пространстве -- в UI можно подавать domain и/или presentation объекты, проблема SRP решается прямыми руками архитектора.
Я говорил про модель на сервере.
M>Соответственно, преимущество тонкой модели выступать в роли DTO здесь совершенно не нужно. Зато код из-за нее не сильно отличается от манипуляций с типизированными датасетами -- шумный, полный деталей реализации и нифига не предметной области. Выше Mike Chaliy привел пример.
Бредовый пример.
M>Хотел еще сказать, топикстартер уже выяснил, что у него будет 2х-звенка с толстым клиентом.
Это как? Двузвенка — практически база + клиент. На базе конечно можно навернуть логику, но не очень хорошо получится. Поэтому в двузвенке понятие "толщины" клиента обычно отсусвтвует.
Re[12]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Я говорил про модель на сервере.
Тем не менее, при наличии SyncFramework, как вы предложили, объекты никуда гонять не надо, следовательно, rich model отлично подходит. Не понимаю, почему она — "сосет как пылесос" в таком случае.
M>>Хотел еще сказать, топикстартер уже выяснил, что у него будет 2х-звенка с толстым клиентом. G>Это как? Двузвенка — практически база + клиент. На базе конечно можно навернуть логику, но не очень хорошо получится. Поэтому в двузвенке понятие "толщины" клиента обычно отсусвтвует.
Да, клиент однозначно "очень толстый"
M>>Соответственно, преимущество тонкой модели выступать в роли DTO здесь совершенно не нужно. Зато код из-за нее не сильно отличается от манипуляций с типизированными датасетами -- шумный, полный деталей реализации и нифига не предметной области. Выше Mike Chaliy привел пример. G>Бредовый пример.
Боюсь, что не вам решать. Специфику пример отражает отлично.
Re[13]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Я говорил про модель на сервере. M>Тем не менее, при наличии SyncFramework, как вы предложили, объекты никуда гонять не надо, следовательно, rich model отлично подходит. Не понимаю, почему она — "сосет как пылесос" в таком случае.
"объекты никуда гонять не надо" — единственный критерий чтоли?
Re[14]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, meowth, Вы писали:
M>>Здравствуйте, gandjustas, Вы писали:
G>>>Я говорил про модель на сервере. M>>Тем не менее, при наличии SyncFramework, как вы предложили, объекты никуда гонять не надо, следовательно, rich model отлично подходит. Не понимаю, почему она — "сосет как пылесос" в таком случае. G>"объекты никуда гонять не надо" — единственный критерий чтоли?
Нет, но вы на больше и не указывали в этом треде.
Эм, а почему вы отвечаете вопросом на вопрос? Я у вас уже 4м комментом пытаюсь спросить, почему rich model плоха в условиях, если есть Sync Framework, как вы предлагаете взять. А если не предлагаете, выяснив, что клиент 2хзвенный, то вопрос никуда не девается -- почему в 2хзвенке rich model плоха; предметно ответьте? Только не надо про SRP.
Re[15]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, meowth, Вы писали:
M>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Я говорил про модель на сервере. M>>>Тем не менее, при наличии SyncFramework, как вы предложили, объекты никуда гонять не надо, следовательно, rich model отлично подходит. Не понимаю, почему она — "сосет как пылесос" в таком случае. G>>"объекты никуда гонять не надо" — единственный критерий чтоли?
M>Нет, но вы на больше и не указывали в этом треде.
M>Эм, а почему вы отвечаете вопросом на вопрос? Я у вас уже 4м комментом пытаюсь спросить, почему rich model плоха в условиях, если есть Sync Framework, как вы предлагаете взять. А если не предлагаете, выяснив, что клиент 2хзвенный, то вопрос никуда не девается -- почему в 2хзвенке rich model плоха; предметно ответьте? Только не надо про SRP.
SRP это самое главное, практически на одном уровне важности с нормальзацией данных находится. Более того, можно доказать что нормализация — это и есть SRP на уровне данных.
Теперь к практике.
Rich плоха тем, что далеко не все можно выразит в rich, например произвольные выборки и опрации задействующие несколько объектов.
Кроме того не вижу преимуществ rich, чтобы стремиться её использовать.
Re[16]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>SRP это самое главное, практически на одном уровне важности с нормальзацией данных находится. Более того, можно доказать что нормализация — это и G>есть SRP на уровне данных.
Я не вижу, чтобы rich model нарушала SRP. А если нарушает, покажите мне в цифрах, во что мне это выливается.
И странно, что вы в anemic model не остановились на использовании typed datasets -- а чо, pure data )
G>Теперь к практике. G>Rich плоха тем, что далеко не все можно выразит в rich, например произвольные выборки и опрации задействующие несколько объектов.
Во первых, произвольные операции выборки не нужны при манипуляции с domain model в пределах бизнес-процесса. Они становятся нужны только в UI и Reporting'e, где и так есть DTO, в которые можно загнать нужные поля объектов проекциями и срезами из query language, не подтягивая весь объект целиком.
G>операции задействующие несколько объектов
Вообще не понял о_О Как это -- в rich model нельзя оперировать несколькими объектами?
G>Кроме того не вижу преимуществ rich, чтобы стремиться её использовать.
*развер руками* ну увы =)
Re[17]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>SRP это самое главное, практически на одном уровне важности с нормальзацией данных находится. Более того, можно доказать что нормализация — это и G>>есть SRP на уровне данных. M>Я не вижу, чтобы rich model нарушала SRP.
Да это вроде всем известно: rich прибивает БЛ к объктам, хранящим данные.
Например если валидацию засунуть в внутрь объекта, то становится невозможно автоматически генерировать клиентские валидаторы для веб-интерфейса.
M>А если нарушает, покажите мне в цифрах, во что мне это выливается.
Эх, если бы в цифрах это можно было оценить уже холиваров бы не было.
M>И странно, что вы в anemic model не остановились на использовании typed datasets -- а чо, pure data )
те же проблемы. Произвольные выборки не поддерживаются. Да и текстовый SQL писать надо — неудобно. Кроме того датасеты очень громозкие.
Гораздо удобнее список "записей" (неизменяемых структур со структурной эквивалентностью), но ни язык не поддерживает, ни средств отображения для таких структур нету.
Может быть на базе следующего EF такое можно будет собрать. А сейчас с нуля создавать — дороговато будет.
G>>Теперь к практике. G>>Rich плоха тем, что далеко не все можно выразит в rich, например произвольные выборки и опрации задействующие несколько объектов. M>Во первых, произвольные операции выборки не нужны при манипуляции с domain model в пределах бизнес-процесса. Они становятся нужны только в UI и Reporting'e, где и так есть DTO, в которые можно загнать нужные поля объектов проекциями и срезами из query language, не подтягивая весь объект целиком.
G>>операции задействующие несколько объектов M>Вообще не понял о_О Как это -- в rich model нельзя оперировать несколькими объектами?
А куда методы оперирующие объектами A, B, C помещать?
В отдельные сервисы, а значит вся "красота", за которую бъются приверженцы rich, теряется.
Re[18]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, meowth, Вы писали: G>Да это вроде всем известно: rich прибивает БЛ к объктам, хранящим данные.
Rich model не занимается _хранением _данных. Она отвечает за их представление и поведение. Хранение и транспорт -- это anemic/DTO. Попробуйте посмотреть с этой точки зрения. Вы смотрите с точки зрения данные + операции. Представьте себе ООСУБД. Не обсуждая минусы, с вашей точки зрения, она вообще существовать -- не может: ее факт существования просто противоречит реальности true anemic.
M>>А если нарушает, покажите мне в цифрах, во что мне это выливается. G>Эх, если бы в цифрах это можно было оценить уже холиваров бы не было.
M>>И странно, что вы в anemic model не остановились на использовании typed datasets -- а чо, pure data ) G>те же проблемы. Произвольные выборки не поддерживаются. Да и текстовый SQL писать надо — неудобно. Кроме того датасеты очень громозкие. G>Гораздо удобнее список "записей" (неизменяемых структур со структурной эквивалентностью), но ни язык не поддерживает, ни средств отображения для таких структур нету. G>Может быть на базе следующего EF такое можно будет собрать. А сейчас с нуля создавать — дороговато будет.
Зато anemic, дальше некуда.
G>А куда методы оперирующие объектами A, B, C помещать? G>В отдельные сервисы, а значит вся "красота", за которую бъются приверженцы rich, теряется.
Ну вы и договорились до ручки ) Вы тут заявляете, что rich противоречит rich.
Нет, не подумайте, я нисколько не отказываюсь от сервисов, они бывают необходимы: например, инфраструктура. Т.е. я -- не отказываюсь от в меру anemic, а совмещаю А вот _вы_ -- радикально отказываетесь от логики в объектах ) В этом -- наша сила.
Re[19]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, meowth, Вы писали: G>>Да это вроде всем известно: rich прибивает БЛ к объктам, хранящим данные. M>Rich model не занимается _хранением _данных. Она отвечает за их представление и поведение. Хранение и транспорт -- это anemic/DTO. Попробуйте посмотреть с этой точки зрения.
Так что, данных внутри domain objects нету? Меня не философия беспокоит, а реализация.
Что вообще за манера такая — хреновость реализации заменять философией?
M>Вы смотрите с точки зрения данные + операции.
Любая программа состоит из данных и операций с этими данными.
M>Представьте себе ООСУБД. Не обсуждая минусы, с вашей точки зрения, она вообще существовать -- не может: ее факт существования просто противоречит реальности true anemic.
Это тут причем?
G>>А куда методы оперирующие объектами A, B, C помещать? G>>В отдельные сервисы, а значит вся "красота", за которую бъются приверженцы rich, теряется. M>Ну вы и договорились до ручки ) Вы тут заявляете, что rich противоречит rich.
Я не заявляю. Я вопросы задаю.
Фаулер кстати на такой вопрос отвечает очень уклончиво, а в DDD не отвечают вообще.
M>Нет, не подумайте, я нисколько не отказываюсь от сервисов, они бывают необходимы: например, инфраструктура. Т.е. я -- не отказываюсь от в меру anemic, а совмещаю
И получаете размазанную по куче слоев логику.
Хотя это еще зависит от точго что называть логикой
M>А вот _вы_ -- радикально отказываетесь от логики в объектах )
Поэтому я могу БЛ переиспользовать даже в бинарном виде в разных проектах (пример с видимостью для админа я приводил в соседней теме).
M>В этом -- наша сила.
В этом ваша слабость. Помещая логику работы с данными в объект с данными ты сразу лишаешь себя как повторного использования объектов, так и повторного использования логики.
Re[20]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Так что, данных внутри domain objects нету? Меня не философия беспокоит, а реализация. G>Что вообще за манера такая — хреновость реализации заменять философией?
Никакой философии, извините, если так показалось. Данные есть, но слово "хранятся" к ним не подходит. Давайте я попробую пояснить. С точки зрения anemic, данные хранятся в БД, потом их оттуда DTOят к коду, который их обрабатывает, потом они попадают в БД. С точки зрения Rich domain БД вообще не существует -- т.н. принцип persistence ignorance. Соответственная инфраструктура направлена на реализацию этого принципа. Данные никуда не надо транспортировать, хранить -- нужно только обеспечить их поведение, оркестрацию, если угодно.
M>>Вы смотрите с точки зрения данные + операции. G>Любая программа состоит из данных и операций с этими данными.
Выше, выше
M>>Представьте себе ООСУБД. Не обсуждая минусы, с вашей точки зрения, она вообще существовать -- не может: ее факт существования просто противоречит реальности true anemic. G>Это тут причем?
При том, что если согласно некоторой теории объекты не могут существовать, а они существуют, это значит, что в теории есть изъян.
G>>>А куда методы оперирующие объектами A, B, C помещать? G>>>В отдельные сервисы, а значит вся "красота", за которую бъются приверженцы rich, теряется. M>>Ну вы и договорились до ручки ) Вы тут заявляете, что rich противоречит rich. G>Я не заявляю. Я вопросы задаю. G>Фаулер кстати на такой вопрос отвечает очень уклончиво, а в DDD не отвечают вообще.
Методы помещаются или в сервисы инфраструктуры, или в объекты domain. При этом ничего не мешает иметь в domain такой объект, как report calculator.
M>>Нет, не подумайте, я нисколько не отказываюсь от сервисов, они бывают необходимы: например, инфраструктура. Т.е. я -- не отказываюсь от в меру anemic, а совмещаю G>И получаете размазанную по куче слоев логику. G>Хотя это еще зависит от точго что называть логикой
Согласно вашему определению бизнес-логика anemic вся также разбросана в сервисах.
M>>А вот _вы_ -- радикально отказываетесь от логики в объектах ) G>Поэтому я могу БЛ переиспользовать даже в бинарном виде в разных проектах (пример с видимостью для админа я приводил в соседней теме).
К сожалению, не встречал проекты на практике, где это понадобилось бы. Возможно, это тоже влияет на мою точку зрения.
M>>В этом -- наша сила. G>В этом ваша слабость. Помещая логику работы с данными в объект с данными ты сразу лишаешь себя как повторного использования объектов, так и повторного использования логики.
Я вообще-то говорил о том, что сила в использовании как anemic, так и domain, чего вы (гибрида) не приемлете совсем. А по вашему предложению у нас так -- новая задача, новый domain, переиспользовать-то и незачем.
Извините, на этом исчезаю до воскресенья. До свидания, спасибо.
Re[21]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Так что, данных внутри domain objects нету? Меня не философия беспокоит, а реализация. G>>Что вообще за манера такая — хреновость реализации заменять философией? M>Никакой философии, извините, если так показалось. Данные есть, но слово "хранятся" к ним не подходит. Давайте я попробую пояснить. С точки зрения anemic, данные хранятся в БД, потом их оттуда DTOят к коду, который их обрабатывает, потом они попадают в БД. С точки зрения Rich domain БД вообще не существует -- т.н. принцип persistence ignorance.
Не путай теплое с мягким. Во-первых в rich PI действует только на уровне методов классов. В другиз местах есть репозитарии и другие объекты, котообые обеспечивают доставание\запись данных.
M>Соответственная инфраструктура направлена на реализацию этого принципа.
Скажу по секрету, для anemic используется почти такая же инфраструктура.
M>Данные никуда не надо транспортировать, хранить -- нужно только обеспечить их поведение, оркестрацию, если угодно.
Поведение данных? Оригинально.
Интересно какие поведение у заказа? Или у карточки клиента?
А вот чтобы как-то работать с данными эти данные должны быть в каком-либо объекте, так что ханить кто-то их должен.
M>>>Представьте себе ООСУБД. Не обсуждая минусы, с вашей точки зрения, она вообще существовать -- не может: ее факт существования просто противоречит реальности true anemic. G>>Это тут причем? M>При том, что если согласно некоторой теории объекты не могут существовать, а они существуют, это значит, что в теории есть изъян.
Сам придумал какую-то теорию, теперь сам её опровергаешь.
G>>>>А куда методы оперирующие объектами A, B, C помещать? G>>>>В отдельные сервисы, а значит вся "красота", за которую бъются приверженцы rich, теряется. M>>>Ну вы и договорились до ручки ) Вы тут заявляете, что rich противоречит rich. G>>Я не заявляю. Я вопросы задаю. G>>Фаулер кстати на такой вопрос отвечает очень уклончиво, а в DDD не отвечают вообще. M>Методы помещаются или в сервисы инфраструктуры, или в объекты domain. При этом ничего не мешает иметь в domain такой объект, как report calculator.
Еще как мешает. В предметной области нету report calculator.
M>>>Нет, не подумайте, я нисколько не отказываюсь от сервисов, они бывают необходимы: например, инфраструктура. Т.е. я -- не отказываюсь от в меру anemic, а совмещаю G>>И получаете размазанную по куче слоев логику. G>>Хотя это еще зависит от точго что называть логикой M>Согласно вашему определению бизнес-логика anemic вся также разбросана в сервисах.
Не разбросана.
Это в rich логика может быть в domain object, root aggregate и в отдельном сервисе.
А самый кайф наступает когда какой-нить на вид безобидный метод типа AddItem у заказа начинает лезть в базу и поднимать другие айтемы для пересчета.
M>>>А вот _вы_ -- радикально отказываетесь от логики в объектах ) G>>Поэтому я могу БЛ переиспользовать даже в бинарном виде в разных проектах (пример с видимостью для админа я приводил в соседней теме). M>К сожалению, не встречал проекты на практике, где это понадобилось бы. Возможно, это тоже влияет на мою точку зрения.
M>>>В этом -- наша сила. G>>В этом ваша слабость. Помещая логику работы с данными в объект с данными ты сразу лишаешь себя как повторного использования объектов, так и повторного использования логики. M>Я вообще-то говорил о том, что сила в использовании как anemic, так и domain, чего вы (гибрида) не приемлете совсем.
И какая сила у domain?
M>А по вашему предложению у нас так -- новая задача, новый domain, переиспользовать-то и незачем.
Новый domain не означает новую логику. Если работаем с данными, то нам не важно по какой причине у нас есть понятие видимости, мы можем в любом использовать одну и ту же логику для получения видимых объектов, независимо от того что это за объекты.
Re[22]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
M>>Никакой философии, извините, если так показалось. Данные есть, но слово "хранятся" к ним не подходит. Давайте я попробую пояснить. С точки зрения anemic, данные хранятся в БД, потом их оттуда DTOят к коду, который их обрабатывает, потом они попадают в БД. С точки зрения Rich domain БД вообще не существует -- т.н. принцип persistence ignorance. G>Не путай теплое с мягким. Во-первых в rich PI действует только на уровне методов классов.
"действует только на уровне методов классов" -- это как? о_О Вы точно знакомы с rich model?
G>В другиз местах есть репозитарии и другие объекты, котообые обеспечивают доставание\запись данных.
В том то и дело, что вы смотрите на это, как на "доставание-запись данных" из персистентного источника и перемещение их в некотором контейнере (anemic DTO) к сервисам. Еще раз говорю, попробуйте взглянуть с другой стороны. В rich данные не путешествуют к коду, который их обрабатывает. Здесь они сами есть и объекты, и поведение, причем представленные так, как это видит domain expert. С точки зрения бизнес-скрипта есть объекты, которые существуют "вечно" (идеальная ситуация). Это уже забота инфраструктуры -- поднять их из хранилища или заперсистить, и в какой момент. То, что есть repository, не значит, что они там сохраняются, понимаете. Repository -- это вообще антипаттерн rich, и никто не говорит, что они ведут в БД. PI, ё-моё, вы как будто издеваетесь!
M>>Соответственная инфраструктура направлена на реализацию этого принципа. G>Скажу по секрету, для anemic используется почти такая же инфраструктура.
Но при этом LL вам мешает, а Identity Map не нужен совсем -- все данные value-object. Что же тогда в anemic от инфраструктуры остается?
M>>Данные никуда не надо транспортировать, хранить -- нужно только обеспечить их поведение, оркестрацию, если угодно. G>Поведение данных? Оригинально. G>Интересно какие поведение у заказа? Или у карточки клиента?
Уточните у них при личной встрече. Шутка Какое надо, такое и будет. Вы же понимаете, что я не буду счас это рассказывать?
G>А вот чтобы как-то работать с данными эти данные должны быть в каком-либо объекте, так что хранить кто-то их должен.
Читайте выше про PI. Вообще читайте про PI.
M>>>>Представьте себе ООСУБД. Не обсуждая минусы, с вашей точки зрения, она вообще существовать -- не может: ее факт существования просто противоречит реальности true anemic. G>>>Это тут причем? M>>При том, что если согласно некоторой теории объекты не могут существовать, а они существуют, это значит, что в теории есть изъян. G> G>Сам придумал какую-то теорию, теперь сам её опровергаешь.
Нет, это с точки зрения anemic в вашей интерпретации -- есть данные, есть plain old data контейнеры для них. А вот в ООСУБД все не так, там нет ни того, ни другого. Значит, с точки зрения anemic оно не может существовать.
M>>Методы помещаются или в сервисы инфраструктуры, или в объекты domain. При этом ничего не мешает иметь в domain такой объект, как report calculator. G>Еще как мешает. В предметной области нету report calculator.
Бгг, это вы мне будете говорить, есть там или нет? Мой domain, помещаю, что хочу. У меня -- есть.
Да, вкупе с вашим заявлением, что проектировать надо не в объектах, а в функциях, этот приказ мне убрать оттуда report calculator звучит вообще весело. Я, конечно, понимаю, что вы уже наигрались с ООП и рветесь в бой на функциональные языки, но .. может, оставите их в стороне, вне темы anemic?
G>А самый кайф наступает когда какой-нить на вид безобидный метод типа AddItem у заказа начинает лезть в базу G>и поднимать другие айтемы для пересчета.
Если эти данные лежат в БД, и больше нигде, и они нужны, то хоть в anemic, хоть в rich их придется оттуда вынуть. Не вижу, чем тут одно уступает другому. Однако, в моей ситуации ~85-95% данных оказываются в объектном кеше (это цифры из реальной программы). Readonly справочники туда ложатся сразу после прогрева кеша. При этом я не написал для этого ни строки -- все делает инфраструктура (NHibernate + Spring.net)
Пример из жизни: однажды у нас пропало соединение с БД. Логика еще минут 30-40 работала из кеша. В проектируемой системе сейчас 8G memcached на 4х машинах, занятые обычно процентов на 15-40.
M>>Я вообще-то говорил о том, что сила в использовании как anemic, так и domain, чего вы (гибрида) не приемлете совсем. G>И какая сила у domain?
Опять 25 ) Не буду пересказывать Фаулера, потому что не хочу опять обсуждать мое понимание его письмен )
M>>А по вашему предложению у нас так -- новая задача, новый domain, переиспользовать-то и незачем. G>Новый domain не означает новую логику. Если работаем с данными, то нам не важно по какой причине у нас есть понятие видимости, мы можем в любом использовать одну и ту же логику для получения видимых объектов, независимо от того что это за объекты.
Еще раз говорю, это все красиво только на словах. В жизни не видел, чтобы бизнес-логику использовали повторно. Наоборот, возьмите в пример хоть 1С как бизнес-систему — при подготовке новой конфигурации вы переписываете именно бизнес-логику, а не что-то другое. Так что тут очень и очень спорно ))
Re[23]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
M>>>Никакой философии, извините, если так показалось. Данные есть, но слово "хранятся" к ним не подходит. Давайте я попробую пояснить. С точки зрения anemic, данные хранятся в БД, потом их оттуда DTOят к коду, который их обрабатывает, потом они попадают в БД. С точки зрения Rich domain БД вообще не существует -- т.н. принцип persistence ignorance. G>>Не путай теплое с мягким. Во-первых в rich PI действует только на уровне методов классов. M>"действует только на уровне методов классов" -- это как? о_О Вы точно знакомы с rich model?
Конечно знаком. PI — это не только plain objects, это еще и идеология, котороая говорит что работа приложения не зависит от сохранения данных.
На самом деле таким свойстом обладает только очень малая часть логики, которая в rich как раз заключается в методы domain objects.
G>>В другиз местах есть репозитарии и другие объекты, котообые обеспечивают доставание\запись данных. M>В том то и дело, что вы смотрите на это, как на "доставание-запись данных" из персистентного источника и перемещение их в некотором контейнере (anemic DTO) к сервисам.
В любой программе работа с персистентными данными заключается в двух принципиально разных операциях: получение некоторых данных из хранилища и изменение данных в хранилище. Ничего другого придумать нельзя.
M>Еще раз говорю, попробуйте взглянуть с другой стороны. В rich данные не путешествуют к коду, который их обрабатывает. Здесь они сами есть и объекты, и поведение, причем представленные так, как это видит domain expert.
Еще раз, какое поведение у записи о клиенте? Или у заказа?
Может конечно domain expert курит что-то, но такой случай рассматривать не стоит.
Думаете domain expertу становится легче от объектной нотации, для тех объектов, у которых в реальном мире нету поведения?
M>С точки зрения бизнес-скрипта есть объекты, которые существуют "вечно" (идеальная ситуация). Это уже забота инфраструктуры -- поднять их из хранилища или заперсистить, и в какой момент. То, что есть repository, не значит, что они там сохраняются, понимаете. Repository -- это вообще антипаттерн rich, и никто не говорит, что они ведут в БД. PI, ё-моё, вы как будто издеваетесь!
Ну да, мечта идиота — объекты, которые сами непонятно как и непонятно где сохраняются.
Вообще-то такая абстракция течет как дырявый друшлаг.
M>>>Соответственная инфраструктура направлена на реализацию этого принципа. G>>Скажу по секрету, для anemic используется почти такая же инфраструктура. M>Но при этом LL вам мешает, а Identity Map не нужен совсем -- все данные value-object. Что же тогда в anemic от инфраструктуры остается?
Маппер и, самое главное, динамическое построение запросов средаствами типа Linq.
M>>>Данные никуда не надо транспортировать, хранить -- нужно только обеспечить их поведение, оркестрацию, если угодно. G>>Поведение данных? Оригинально. G>>Интересно какие поведение у заказа? Или у карточки клиента? M>Уточните у них при личной встрече. Шутка Какое надо, такое и будет. Вы же понимаете, что я не буду счас это рассказывать?
Ну так не интересно. Давайте всетаки по конкретным примерам, а то теоретизировать можно бесконечно долго.
Вот есть интернет-магазин. Есть товары, разбитые по категориям, юзеры оставляют заказы, состоящие из нескольких позиций. Где тут будет поведение?
G>>А вот чтобы как-то работать с данными эти данные должны быть в каком-либо объекте, так что хранить кто-то их должен. M>Читайте выше про PI. Вообще читайте про PI.
Я читал про PI еще 5 лет назад, не вдохновило.
M>>>>>Представьте себе ООСУБД. Не обсуждая минусы, с вашей точки зрения, она вообще существовать -- не может: ее факт существования просто противоречит реальности true anemic. G>>>>Это тут причем? M>>>При том, что если согласно некоторой теории объекты не могут существовать, а они существуют, это значит, что в теории есть изъян. G>> G>>Сам придумал какую-то теорию, теперь сам её опровергаешь. M>Нет, это с точки зрения anemic в вашей интерпретации -- есть данные, есть plain old data контейнеры для них. А вот в ООСУБД все не так, там нет ни того, ни другого. Значит, с точки зрения anemic оно не может существовать.
Заметьте, я вообще ничего не говорил по этому поводу
M>>>Методы помещаются или в сервисы инфраструктуры, или в объекты domain. При этом ничего не мешает иметь в domain такой объект, как report calculator. G>>Еще как мешает. В предметной области нету report calculator. M>Бгг, это вы мне будете говорить, есть там или нет? Мой domain, помещаю, что хочу. У меня -- есть.
Только domain expert вас не поймет. Да и нету в предметной области report calculator, ни в какой.
Или будет контрпример?
G>>А самый кайф наступает когда какой-нить на вид безобидный метод типа AddItem у заказа начинает лезть в базу G>>и поднимать другие айтемы для пересчета. M>Если эти данные лежат в БД, и больше нигде, и они нужны, то хоть в anemic, хоть в rich их придется оттуда вынуть. Не вижу, чем тут одно уступает другому.
Угу, только возникает вопрос где эти данные вытягиваются.
Если это безобидный на вид метод AddItem, то сразу же проблема. Программист по незнанию может воспользоваться таким методом где не надо и получить бяку.
M>Однако, в моей ситуации ~85-95% данных оказываются в объектном кеше (это цифры из реальной программы). Readonly справочники туда ложатся сразу после прогрева кеша. При этом я не написал для этого ни строки -- все делает инфраструктура (NHibernate + Spring.net)
Наличие объектного кеша большой костыль. Кстати, как когерентность кеша обеспечивается?
M>Пример из жизни: однажды у нас пропало соединение с БД. Логика еще минут 30-40 работала из кеша. В проектируемой системе сейчас 8G memcached на 4х машинах, занятые обычно процентов на 15-40.
Скока скока? Гиг-два в кеше? А размер базы какой?
Я-то по наивности делаю так чтобы на shared-хостинге решение развернуть можно было.
M>>>Я вообще-то говорил о том, что сила в использовании как anemic, так и domain, чего вы (гибрида) не приемлете совсем. G>>И какая сила у domain? M>Опять 25 ) Не буду пересказывать Фаулера, потому что не хочу опять обсуждать мое понимание его письмен )
Не надо фаулера пересказываеть, его тут все читали. Свое мнение, основанное не на утверждении что это "больше ООП".
M>>>А по вашему предложению у нас так -- новая задача, новый domain, переиспользовать-то и незачем. G>>Новый domain не означает новую логику. Если работаем с данными, то нам не важно по какой причине у нас есть понятие видимости, мы можем в любом использовать одну и ту же логику для получения видимых объектов, независимо от того что это за объекты. M>Еще раз говорю, это все красиво только на словах. В жизни не видел, чтобы бизнес-логику использовали повторно.
А я видел, и использую. и мне для этого не надо использовать memcached на 4 машинах.
Re[24]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
M>>"действует только на уровне методов классов" -- это как? о_О Вы точно знакомы с rich model? G>Конечно знаком. PI — это не только plain objects, это еще и идеология, котороая говорит что работа приложения не зависит от сохранения данных. G>На самом деле таким свойстом обладает только очень малая часть логики, которая в rich как раз заключается в методы domain objects.
Я и не говорил про pdo. Т.е. по вашему, идеология есть, но она все равно нигде не проявляется, потому что ее 5%, а остальные 95% -- сервисный код, где PI не доступен? Видимо, у меня неправильный проект -- там логики процентов 70. А если не учитывать самописные велосипеды (наследие такое, к сожалению), то и побольше.
G>>>В другиз местах есть репозитарии и другие объекты, котообые обеспечивают доставание\запись данных. M>>В том то и дело, что вы смотрите на это, как на "доставание-запись данных" из персистентного источника и перемещение их в некотором контейнере (anemic DTO) к сервисам. G>В любой программе работа с персистентными данными заключается в двух принципиально разных операциях: получение некоторых данных из хранилища и изменение данных в хранилище.
Это лично ваше мнение? Реквестирую пруфлинк.
G>Ничего другого придумать нельзя.
Видимо, у меня совсем другая программа, или я придумал что-то 3ье ( Эти ваши "принципиальные" операции у меня находятся в слое сервисов, и занимают 1% от кода, а то и меньше.
G>Еще раз, какое поведение у записи о клиенте? Или у заказа? G>Может конечно domain expert курит что-то, но такой случай рассматривать не стоит. G>Думаете domain expertу становится легче от объектной нотации, для тех объектов, у которых в реальном мире нету поведения?
При чем здесь "нет поведения"? Поведение есть, оно и реализуется в логике. Другое дело, что это -- синтетический объект, но с его привлечением с этим функционалом можно работать в терминах домена.
G>Ну да, мечта идиота — объекты, которые сами непонятно как и непонятно где сохраняются. G>Вообще-то такая абстракция течет как дырявый друшлаг.
О**енно обоснованные аргументы. Ссылку на доказательство.
Еще раз говорю, репозиторий лежит в сервисном слое (200 строк кода), и как и что сохраняется, понятно. Остальное -- вне него, им он не нужен.
M>>Но при этом LL вам мешает, а Identity Map не нужен совсем -- все данные value-object. Что же тогда в anemic от инфраструктуры остается? G>Маппер и, самое главное, динамическое построение запросов средаствами типа Linq.
Хм. если это -- главное, то у вас, видимо, большая часть кода -- сервисный слой, и вам rich не подойдет.
G>>>Интересно какие поведение у заказа? Или у карточки клиента? M>>Уточните у них при личной встрече. Шутка Какое надо, такое и будет. Вы же понимаете, что я не буду счас это рассказывать? G>Ну так не интересно. Давайте всетаки по конкретным примерам, а то теоретизировать можно бесконечно долго. G>Вот есть интернет-магазин. Есть товары, разбитые по категориям, юзеры оставляют заказы, состоящие из нескольких позиций. Где тут будет поведение?
Хы. Вы придумали -- вы и решайте.
G>Я читал про PI еще 5 лет назад, не вдохновило.
Ну увы, опять же )
М>>Нет, это с точки зрения anemic в вашей интерпретации -- есть данные, есть plain old data контейнеры для них. А вот в ООСУБД все не так, там нет ни того, ни другого. Значит, с точки зрения anemic оно не может существовать. G>Заметьте, я вообще ничего не говорил по этому поводу
Вы говорили про "2 принципиально разные операции, Ничего другого придумать нельзя." выше. В ООСУБД этого нет, и не надо. Надо же, придумали
M>>Бгг, это вы мне будете говорить, есть там или нет? Мой domain, помещаю, что хочу. У меня -- есть. G>Только domain expert вас не поймет. Да и нету в предметной области report calculator, ни в какой. G>Или будет контрпример?
Только что был, с report calculator. В реальном проекте ситуация не сильно отличается, только там не report, а statistics.
M>>Однако, в моей ситуации ~85-95% данных оказываются в объектном кеше (это цифры из реальной программы). Readonly справочники туда ложатся сразу после прогрева кеша. При этом я не написал для этого ни строки -- все делает инфраструктура (NHibernate + Spring.net) G>Наличие объектного кеша большой костыль.
Ваше мнение. Пруфлинк, или неправда.
G>Кстати, как когерентность кеша обеспечивается?
Этим занимается инфраструктура (NHibernate) в моем случае. Из некоторых способов -- тем, что объекты там хранятся в "разобранном" состоянии, маркировкой областей кеша, корректной обработкой транзакций. За остальными способами отсылаю к исходникам Nhibernate.
M>>Пример из жизни: однажды у нас пропало соединение с БД. Логика еще минут 30-40 работала из кеша. В проектируемой системе сейчас 8G memcached на 4х машинах, занятые обычно процентов на 15-40. G> G>Скока скока? Гиг-два в кеше? А размер базы какой? G>Я-то по наивности делаю так чтобы на shared-хостинге решение развернуть можно было.
Размер базы 50G. А вы много чего делаете по наивности; например, паясничаете строкой выше.
M>>Опять 25 ) Не буду пересказывать Фаулера, потому что не хочу опять обсуждать мое понимание его письмен ) G>Не надо фаулера пересказываеть, его тут все читали. Свое мнение, основанное не на утверждении что это "больше ООП".
Вкратце, чистота domain logic, код ближе к данным, с которыми он работает; далее, мне так привычнее )
G>А я видел, и использую. и мне для этого не надо использовать memcached на 4 машинах.
Не придирайтесь. Пример с кешем из реального проекта иллюстрировал то, что "на каждый чих ходить в БД" -- это неверное представление о ситуации.
Вобщем, так Я так понимаю, доказать в теории вам невозможно -- потому что необходимо ответить на все ваши контраргументы, которые у вам, похоже, не закончатся. А примеры из практики вы объявляете смешными и "незжизненными".
Давайте прекратим этот спор (ну или вы ответите, и тогда прекратим )
Re[25]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
M>>>"действует только на уровне методов классов" -- это как? о_О Вы точно знакомы с rich model? G>>Конечно знаком. PI — это не только plain objects, это еще и идеология, котороая говорит что работа приложения не зависит от сохранения данных. G>>На самом деле таким свойстом обладает только очень малая часть логики, которая в rich как раз заключается в методы domain objects. M>Я и не говорил про pdo. Т.е. по вашему, идеология есть, но она все равно нигде не проявляется, потому что ее 5%, а остальные 95% -- сервисный код, где PI не доступен?
Нет. Любой код, работающюй с данными все равно дожен как-то получать данные и сохранять их.
G>>>>В другиз местах есть репозитарии и другие объекты, котообые обеспечивают доставание\запись данных. M>>>В том то и дело, что вы смотрите на это, как на "доставание-запись данных" из персистентного источника и перемещение их в некотором контейнере (anemic DTO) к сервисам. G>>В любой программе работа с персистентными данными заключается в двух принципиально разных операциях: получение некоторых данных из хранилища и изменение данных в хранилище. M>Это лично ваше мнение? Реквестирую пруфлинк.
Это очевидно.
G>>Ничего другого придумать нельзя. M>Видимо, у меня совсем другая программа, или я придумал что-то 3ье ( Эти ваши "принципиальные" операции у меня находятся в слое сервисов, и занимают 1% от кода, а то и меньше.
Ну и что третье?
G>>Еще раз, какое поведение у записи о клиенте? Или у заказа? G>>Может конечно domain expert курит что-то, но такой случай рассматривать не стоит. G>>Думаете domain expertу становится легче от объектной нотации, для тех объектов, у которых в реальном мире нету поведения? M>При чем здесь "нет поведения"? Поведение есть, оно и реализуется в логике. Другое дело, что это -- синтетический объект, но с его привлечением с этим функционалом можно работать в терминах домена.
Ух ты, сервисы получились.
G>>Ну да, мечта идиота — объекты, которые сами непонятно как и непонятно где сохраняются. G>>Вообще-то такая абстракция течет как дырявый друшлаг. M>О**енно обоснованные аргументы. Ссылку на доказательство.
Data != Objects — это аксиома, независимо от способа представления этих самых данных.
Доказательством является саом наличие persistance инфрастуктуры с Identity map, Unit of work и прочими паттернами.
Пока еще никому не удалось изобрести БД, которая отдает объекты (имеенно объекты, а не копию данных) с ссылочной эквивалентностью и без необходмости дополнительного преобразование, и чтобы при этом не было необходимости явно сохранять изменения.
Кстати как в таком случае будет поддерживаться транзакционность? Есть подозрение что вообще никак.
И даже если изобретут, но нафиг оно никому надо не будет, ибо данные по своей природе реляционны, а не объектны.
M>Еще раз говорю, репозиторий лежит в сервисном слое (200 строк кода), и как и что сохраняется, понятно. Остальное -- вне него, им он не нужен.
Сути это не меняет. Все операции с данными сводятся к получению некоторых данных или их изменнеию.
M>>>Но при этом LL вам мешает, а Identity Map не нужен совсем -- все данные value-object. Что же тогда в anemic от инфраструктуры остается? G>>Маппер и, самое главное, динамическое построение запросов средаствами типа Linq. M>Хм. если это -- главное, то у вас, видимо, большая часть кода -- сервисный слой, и вам rich не подойдет.
У меня вся бизнес-логика в сервисах.
G>>>>Интересно какие поведение у заказа? Или у карточки клиента? M>>>Уточните у них при личной встрече. Шутка Какое надо, такое и будет. Вы же понимаете, что я не буду счас это рассказывать? G>>Ну так не интересно. Давайте всетаки по конкретным примерам, а то теоретизировать можно бесконечно долго. G>>Вот есть интернет-магазин. Есть товары, разбитые по категориям, юзеры оставляют заказы, состоящие из нескольких позиций. Где тут будет поведение? M>Хы. Вы придумали -- вы и решайте.
Я уже десяток раз решалю Мне интересно как DDD в таком случае заработает.
М>>>Нет, это с точки зрения anemic в вашей интерпретации -- есть данные, есть plain old data контейнеры для них. А вот в ООСУБД все не так, там нет ни того, ни другого. Значит, с точки зрения anemic оно не может существовать. G>>Заметьте, я вообще ничего не говорил по этому поводу M>Вы говорили про "2 принципиально разные операции, Ничего другого придумать нельзя." выше. В ООСУБД этого нет, и не надо. Надо же, придумали
Ну, ссылку на такую ООСУБД в студию. Естественно она должна быть многопользовательской и поддерживать ACID трензакции.
M>>>Бгг, это вы мне будете говорить, есть там или нет? Мой domain, помещаю, что хочу. У меня -- есть. G>>Только domain expert вас не поймет. Да и нету в предметной области report calculator, ни в какой. G>>Или будет контрпример? M>Только что был, с report calculator. В реальном проекте ситуация не сильно отличается, только там не report, а statistics.
И какой части предметной области он соответсвует?
M>>>Однако, в моей ситуации ~85-95% данных оказываются в объектном кеше (это цифры из реальной программы). Readonly справочники туда ложатся сразу после прогрева кеша. При этом я не написал для этого ни строки -- все делает инфраструктура (NHibernate + Spring.net) G>>Наличие объектного кеша большой костыль. M>Ваше мнение. Пруфлинк, или неправда.
Пруф заключается в том, что есть системы которым не нужнен огромный кеш для нормально работы.
M>>>Опять 25 ) Не буду пересказывать Фаулера, потому что не хочу опять обсуждать мое понимание его письмен ) G>>Не надо фаулера пересказываеть, его тут все читали. Свое мнение, основанное не на утверждении что это "больше ООП". M>Вкратце, чистота domain logic, код ближе к данным, с которыми он работает; далее, мне так привычнее )
Ключевое выделил.
domain logic чистотой не обладает, так как задейтсован LL, который может давать эффекты сказывающиеся на производительности.
Код ближе к данным — вероятнее всего нарушение SRP.
G>>А я видел, и использую. и мне для этого не надо использовать memcached на 4 машинах. M>Не придирайтесь. Пример с кешем из реального проекта иллюстрировал то, что "на каждый чих ходить в БД" -- это неверное представление о ситуации.
Ну можно ходить в распределенный кеш. Который тоже является своего рода СУБД, только гораздо более слабой.
Единственное его преимущество, то что он быстрый "снаружи".
M>Вобщем, так Я так понимаю, доказать в теории вам невозможно -- потому что необходимо ответить на все ваши контраргументы, которые у вам, похоже, не закончатся. А примеры из практики вы объявляете смешными и "незжизненными".
Не надо в теории доказывать, приведите пример, причет полный, без сокрытия самых интересных частей.
Re[26]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
M>>Я и не говорил про pdo. Т.е. по вашему, идеология есть, но она все равно нигде не проявляется, потому что ее 5%, а остальные 95% -- сервисный код, где PI не доступен? G>Нет. Любой код, работающюй с данными все равно дожен как-то получать данные и сохранять их.
Не спорю. Другое дело, что он может это делать сам, а может полагаться на инфраструктуру.
G>>>В любой программе работа с персистентными данными заключается в двух принципиально разных операциях: получение некоторых данных из хранилища и изменение данных в хранилище. M>>Это лично ваше мнение? Реквестирую пруфлинк. G>Это очевидно.
Без комментариев.
G>>>Ничего другого придумать нельзя. M>>Видимо, у меня совсем другая программа, или я придумал что-то 3ье ( Эти ваши "принципиальные" операции у меня находятся в слое сервисов, и занимают 1% от кода, а то и меньше. G>Ну и что третье?
Третье то, что коду бизнес-логики абсолюьно пофиг, что данные лежат где-то в БД. Их доставкой занимается инфраструктура и 1 (один сервис), называемый репозиторием. Причем это делается в режиме push, т.е. бизнес-логике вообще не надо никуда обращаться.
G>>>Еще раз, какое поведение у записи о клиенте? Или у заказа? G>>>Может конечно domain expert курит что-то, но такой случай рассматривать не стоит. G>>>Думаете domain expertу становится легче от объектной нотации, для тех объектов, у которых в реальном мире нету поведения? M>>При чем здесь "нет поведения"? Поведение есть, оно и реализуется в логике. Другое дело, что это -- синтетический объект, но с его привлечением с этим функционалом можно работать в терминах домена. G>Ух ты, сервисы получились.
Так никто не говорит, что от них кто-то собрался оказываться. Repository -- это типичный сервис. Но domain expertу на него пофик.
G>>>Ну да, мечта идиота — объекты, которые сами непонятно как и непонятно где сохраняются. G>>>Вообще-то такая абстракция течет как дырявый друшлаг. M>>О**енно обоснованные аргументы. Ссылку на доказательство. G>Data != Objects — это аксиома, независимо от способа представления этих самых данных. G>Доказательством является саом наличие persistance инфрастуктуры с Identity map, Unit of work и прочими паттернами.
Не спорю. Но я не хочу работать с ними как с plain data, поэтому и есть эта инфраструктура.
G>Пока еще никому не удалось изобрести БД, которая отдает объекты (имеенно объекты, а не копию данных) с ссылочной эквивалентностью и без необходмости дополнительного преобразование, и чтобы при этом не было необходимости явно сохранять изменения.
В Smalltalk загляните -- там это есть.
G>Кстати как в таком случае будет поддерживаться транзакционность? Есть подозрение что вообще никак. G>И даже если изобретут, но нафиг оно никому надо не будет, ибо данные по своей природе реляционны, а не объектны.
Ваше мнение.
M>>Еще раз говорю, репозиторий лежит в сервисном слое (200 строк кода), и как и что сохраняется, понятно. Остальное -- вне него, им он не нужен. G>Сути это не меняет. Все операции с данными сводятся к получению некоторых данных или их изменнеию.
Ух ты, надо же. Как это агитирует за anemic, я так и не понял.
M>>>>Но при этом LL вам мешает, а Identity Map не нужен совсем -- все данные value-object. Что же тогда в anemic от инфраструктуры остается? G>>>Маппер и, самое главное, динамическое построение запросов средаствами типа Linq. M>>Хм. если это -- главное, то у вас, видимо, большая часть кода -- сервисный слой, и вам rich не подойдет. G>У меня вся бизнес-логика в сервисах.
Интересный подход. У меня -- не так.
G>>>>>Интересно какие поведение у заказа? Или у карточки клиента? M>>>>Уточните у них при личной встрече. Шутка Какое надо, такое и будет. Вы же понимаете, что я не буду счас это рассказывать? G>>>Ну так не интересно. Давайте всетаки по конкретным примерам, а то теоретизировать можно бесконечно долго. G>>>Вот есть интернет-магазин. Есть товары, разбитые по категориям, юзеры оставляют заказы, состоящие из нескольких позиций. Где тут будет поведение? M>>Хы. Вы придумали -- вы и решайте. G>Я уже десяток раз решалю Мне интересно как DDD в таком случае заработает.
Я не стану вам это объяснять, тем более здесь. Сами понимаете, почему -- прикручивать туда различные аспекты можно бесконечно, а решать ваши задачи я не хочу. У меня все работает
М>>>>Нет, это с точки зрения anemic в вашей интерпретации -- есть данные, есть plain old data контейнеры для них. А вот в ООСУБД все не так, там нет ни того, ни другого. Значит, с точки зрения anemic оно не может существовать. G>>>Заметьте, я вообще ничего не говорил по этому поводу M>>Вы говорили про "2 принципиально разные операции, Ничего другого придумать нельзя." выше. В ООСУБД этого нет, и не надо. Надо же, придумали G>Ну, ссылку на такую ООСУБД в студию. Естественно она должна быть многопользовательской и поддерживать ACID трензакции.
Db4o в режиме "remote server"
M>>>>Бгг, это вы мне будете говорить, есть там или нет? Мой domain, помещаю, что хочу. У меня -- есть. G>>>Только domain expert вас не поймет. Да и нету в предметной области report calculator, ни в какой. G>>>Или будет контрпример? M>>Только что был, с report calculator. В реальном проекте ситуация не сильно отличается, только там не report, а statistics. G>И какой части предметной области он соответсвует?
Вам в каких единицах отмерять? Видимо, я не понял вопроса.
M>>>>Однако, в моей ситуации ~85-95% данных оказываются в объектном кеше (это цифры из реальной программы). Readonly справочники туда ложатся сразу после прогрева кеша. При этом я не написал для этого ни строки -- все делает инфраструктура (NHibernate + Spring.net) G>>>Наличие объектного кеша большой костыль. M>>Ваше мнение. Пруфлинк, или неправда. G>Пруф заключается в том, что есть системы которым не нужнен огромный кеш для нормально работы.
Отличный пруф, продолжайте дальше. Есть системы, которым и БД не нужна. Про "огромный кеш" еще можно поспорить.
M>>>>Опять 25 ) Не буду пересказывать Фаулера, потому что не хочу опять обсуждать мое понимание его письмен ) G>>>Не надо фаулера пересказываеть, его тут все читали. Свое мнение, основанное не на утверждении что это "больше ООП". M>>Вкратце, чистота domain logic, код ближе к данным, с которыми он работает; далее, мне так привычнее ) G>Ключевое выделил. G>domain logic чистотой не обладает, так как задейтсован LL, который может давать эффекты сказывающиеся на производительности. G>Код ближе к данным — вероятнее всего нарушение SRP.
Ваше мнение. Тогда и ООП -- нарушение SRP из ООП.
G>>>А я видел, и использую. и мне для этого не надо использовать memcached на 4 машинах. M>>Не придирайтесь. Пример с кешем из реального проекта иллюстрировал то, что "на каждый чих ходить в БД" -- это неверное представление о ситуации. G>Ну можно ходить в распределенный кеш. Который тоже является своего рода СУБД, только гораздо более слабой. G>Единственное его преимущество, то что он быстрый "снаружи".
Я и иллюстрировал вам распределенный кеш. Преимущество -- что не загибается БД на выборках, а сами выборки -- в 10-100 раз быстрее
G>Не надо в теории доказывать, приведите пример, причет полный, без сокрытия самых интересных частей.
Хорошо, несколько позже приведу.
Re[25]: Архитектура приложения с несколькими клиентами и одн
M>>>Пример из жизни: однажды у нас пропало соединение с БД. Логика еще минут 30-40 работала из кеша. В проектируемой системе сейчас 8G memcached на 4х машинах, занятые обычно процентов на 15-40. G>> G>>Скока скока? Гиг-два в кеше? А размер базы какой? G>>Я-то по наивности делаю так чтобы на shared-хостинге решение развернуть можно было. M>Размер базы 50G. А вы много чего делаете по наивности; например, паясничаете строкой выше.
ИМХО этим все сказано, кто-то делает сайты для е-комерс, по три десятка на неделю. А кто-то таки делает корпоративный приложения. У нас опции шаред хостинга даже в теории нема. Наивно предполагать что человек педалящий первое может чему-то научить человека педалящего второе.
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
M>>>Я и не говорил про pdo. Т.е. по вашему, идеология есть, но она все равно нигде не проявляется, потому что ее 5%, а остальные 95% -- сервисный код, где PI не доступен? G>>Нет. Любой код, работающюй с данными все равно дожен как-то получать данные и сохранять их. M>Не спорю. Другое дело, что он может это делать сам, а может полагаться на инфраструктуру.
Все равно надо как-то объясниить инфраструктуре когда получать объекты и когда сохранять изменения.
G>>>>Ничего другого придумать нельзя. M>>>Видимо, у меня совсем другая программа, или я придумал что-то 3ье ( Эти ваши "принципиальные" операции у меня находятся в слое сервисов, и занимают 1% от кода, а то и меньше. G>>Ну и что третье? M>Третье то, что коду бизнес-логики абсолюьно пофиг, что данные лежат где-то в БД. Их доставкой занимается инфраструктура и 1 (один сервис), называемый репозиторием. Причем это делается в режиме push, т.е. бизнес-логике вообще не надо никуда обращаться.
Пример кода в студию. Даже интересно как такое выгялдит.
G>>>>Еще раз, какое поведение у записи о клиенте? Или у заказа? G>>>>Может конечно domain expert курит что-то, но такой случай рассматривать не стоит. G>>>>Думаете domain expertу становится легче от объектной нотации, для тех объектов, у которых в реальном мире нету поведения? M>>>При чем здесь "нет поведения"? Поведение есть, оно и реализуется в логике. Другое дело, что это -- синтетический объект, но с его привлечением с этим функционалом можно работать в терминах домена. G>>Ух ты, сервисы получились. M>Так никто не говорит, что от них кто-то собрался оказываться. Repository -- это типичный сервис. Но domain expertу на него пофик.
А причем тут repository? Вот есть у нас объекта заказа. У него очевидно нету поведения. Кто будет заниматтся созданием заказа?
G>>>>Ну да, мечта идиота — объекты, которые сами непонятно как и непонятно где сохраняются. G>>>>Вообще-то такая абстракция течет как дырявый друшлаг. M>>>О**енно обоснованные аргументы. Ссылку на доказательство. G>>Data != Objects — это аксиома, независимо от способа представления этих самых данных. G>>Доказательством является саом наличие persistance инфрастуктуры с Identity map, Unit of work и прочими паттернами. M>Не спорю. Но я не хочу работать с ними как с plain data, поэтому и есть эта инфраструктура.
Инфраструктура пытается скрыть факт, что это данные, а не объекты. Причем очень несупешно. Особенно это заметно при множестве параллельных операций.
Сторонники anemic как раз утверждают что чработать с данными как с данными — гораздо более правильный подход. Меньше дырявых асбтракций, больше возможностей, менее многословный и менее связный код получается.
G>>Пока еще никому не удалось изобрести БД, которая отдает объекты (имеенно объекты, а не копию данных) с ссылочной эквивалентностью и без необходмости дополнительного преобразование, и чтобы при этом не было необходимости явно сохранять изменения. M>В Smalltalk загляните -- там это есть.
Ссылку?
M>>>Еще раз говорю, репозиторий лежит в сервисном слое (200 строк кода), и как и что сохраняется, понятно. Остальное -- вне него, им он не нужен. G>>Сути это не меняет. Все операции с данными сводятся к получению некоторых данных или их изменнеию. M>Ух ты, надо же. Как это агитирует за anemic, я так и не понял.
Никак. Это просто чтобы понимали что все операции с данными сводятся к этим двум сценариям. И как раз более явное выражение изменения данных гораздо эффективнее работает и гораздо больше пишется, чем работа с данными в стиле ООП.
G>>>>>>Интересно какие поведение у заказа? Или у карточки клиента? M>>>>>Уточните у них при личной встрече. Шутка Какое надо, такое и будет. Вы же понимаете, что я не буду счас это рассказывать? G>>>>Ну так не интересно. Давайте всетаки по конкретным примерам, а то теоретизировать можно бесконечно долго. G>>>>Вот есть интернет-магазин. Есть товары, разбитые по категориям, юзеры оставляют заказы, состоящие из нескольких позиций. Где тут будет поведение? M>>>Хы. Вы придумали -- вы и решайте. G>>Я уже десяток раз решалю Мне интересно как DDD в таком случае заработает.http://www.rsdn.ru/forum/NewMsg.aspx?mid=3411004
M>Я не стану вам это объяснять, тем более здесь. Сами понимаете, почему -- прикручивать туда различные аспекты можно бесконечно, а решать ваши задачи я не хочу. У меня все работает
Ну как работает приведите пример требований и решение с помощью DDD.
А потом разберем посмотрим как оно будет в anemic и ответим на несколкьо "что если", чтобы оценить расширяемостиь решения.
М>>>>>Нет, это с точки зрения anemic в вашей интерпретации -- есть данные, есть plain old data контейнеры для них. А вот в ООСУБД все не так, там нет ни того, ни другого. Значит, с точки зрения anemic оно не может существовать. G>>>>Заметьте, я вообще ничего не говорил по этому поводу M>>>Вы говорили про "2 принципиально разные операции, Ничего другого придумать нельзя." выше. В ООСУБД этого нет, и не надо. Надо же, придумали G>>Ну, ссылку на такую ООСУБД в студию. Естественно она должна быть многопользовательской и поддерживать ACID трензакции. M>Db4o в режиме "remote server"
А чего в нем особенного, я тоже самое могу написать на MS SQL + EF, отличия чисто синтаксически будут. Единственное что схему заранее создават не надо, хотя если типы объектов известны на этапе компиляции, то разницы нет. Более того, для реляционной БД я могу еще проекциии, группировки и соединения делать. Что в этом плане db4o предложить может?
M>>>>>Бгг, это вы мне будете говорить, есть там или нет? Мой domain, помещаю, что хочу. У меня -- есть. G>>>>Только domain expert вас не поймет. Да и нету в предметной области report calculator, ни в какой. G>>>>Или будет контрпример? M>>>Только что был, с report calculator. В реальном проекте ситуация не сильно отличается, только там не report, а statistics. G>>И какой части предметной области он соответсвует? M>Вам в каких единицах отмерять? Видимо, я не понял вопроса.
Какому объекту предметной области соовествует report calculator или statistics? А состояние у этого объекта какое? Какими либо персистными даннми н заведует? как domain expert понимает что это за объект?
M>>>>>Однако, в моей ситуации ~85-95% данных оказываются в объектном кеше (это цифры из реальной программы). Readonly справочники туда ложатся сразу после прогрева кеша. При этом я не написал для этого ни строки -- все делает инфраструктура (NHibernate + Spring.net) G>>>>Наличие объектного кеша большой костыль. M>>>Ваше мнение. Пруфлинк, или неправда. G>>Пруф заключается в том, что есть системы которым не нужнен огромный кеш для нормально работы. M>Отличный пруф, продолжайте дальше. Есть системы, которым и БД не нужна. Про "огромный кеш" еще можно поспорить.
Ну если БД не нужна, то и обсуждать тут нечего. А когда БД нужна далеко не всегда такой кеш нужен.
M>>>>>Опять 25 ) Не буду пересказывать Фаулера, потому что не хочу опять обсуждать мое понимание его письмен ) G>>>>Не надо фаулера пересказываеть, его тут все читали. Свое мнение, основанное не на утверждении что это "больше ООП". M>>>Вкратце, чистота domain logic, код ближе к данным, с которыми он работает; далее, мне так привычнее ) G>>Ключевое выделил. G>>domain logic чистотой не обладает, так как задейтсован LL, который может давать эффекты сказывающиеся на производительности. G>>Код ближе к данным — вероятнее всего нарушение SRP. M>Ваше мнение. Тогда и ООП -- нарушение SRP из ООП.
Читайте что такое SRP. Определение очень простое.
G>>>>А я видел, и использую. и мне для этого не надо использовать memcached на 4 машинах. M>>>Не придирайтесь. Пример с кешем из реального проекта иллюстрировал то, что "на каждый чих ходить в БД" -- это неверное представление о ситуации. G>>Ну можно ходить в распределенный кеш. Который тоже является своего рода СУБД, только гораздо более слабой. G>>Единственное его преимущество, то что он быстрый "снаружи". M>Я и иллюстрировал вам распределенный кеш. Преимущество -- что не загибается БД на выборках, а сами выборки -- в 10-100 раз быстрее
На тему оптимизации можно разговаривать отдельно и долго.
Но кажется синклер тут приводил факты что при нормальном проектировании одна БД способна закормить от 2 до 10 приложений. если у вас БД загибается и вам нужен распределенный кеш только для того чтобы все работало с приемлимой скоростью это уже свидетельстует о неоптимальности работы с базой.
Кстати, склько у вас выборок (если профайлером посмотреть) нестатичных данных случается при обработке одного запроса пользователя?
Сколько при этом явных запросов на получение данных?
G>>Не надо в теории доказывать, приведите пример, причет полный, без сокрытия самых интересных частей. M>Хорошо, несколько позже приведу.
ОК.
Re[26]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Mike Chaliy, Вы писали:
MC>Здравствуйте, meowth, Вы писали:
M>>>>Пример из жизни: однажды у нас пропало соединение с БД. Логика еще минут 30-40 работала из кеша. В проектируемой системе сейчас 8G memcached на 4х машинах, занятые обычно процентов на 15-40. G>>> G>>>Скока скока? Гиг-два в кеше? А размер базы какой? G>>>Я-то по наивности делаю так чтобы на shared-хостинге решение развернуть можно было. M>>Размер базы 50G. А вы много чего делаете по наивности; например, паясничаете строкой выше.
MC>ИМХО этим все сказано, кто-то делает сайты для е-комерс, по три десятка на неделю. А кто-то таки делает корпоративный приложения. У нас опции шаред хостинга даже в теории нема. Наивно предполагать что человек педалящий первое может чему-то научить человека педалящего второе.
Я делал и первое и второе. Разница по сути небольшая.
В enterprise даже проще, там люди готовы терпеть тормозняки, а в вебе за каждую миллисекунду борьба, ибо мало кто будет заходит на откровенно тормозной сайт, а отсутствие посетителей — убытки.
Re[28]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Все равно надо как-то объясниить инфраструктуре когда получать объекты и когда сохранять изменения.
Какая-то философия получается. Выпил, поговорил с инфраструктурой, объяснил, где получать объекты, как сохранять.
M>>Третье то, что коду бизнес-логики абсолюьно пофиг, что данные лежат где-то в БД. Их доставкой занимается инфраструктура и 1 (один сервис), называемый репозиторием. Причем это делается в режиме push, т.е. бизнес-логике вообще не надо никуда обращаться. G>Пример кода в студию. Даже интересно как такое выгялдит.
Будет вам код, будет
G>А причем тут repository? Вот есть у нас объекта заказа. У него очевидно нету поведения.
Не передергивайте. Ваши "очевидно" очевидны только вам, видимо, даже с контрпримерами. G>Кто будет заниматтся созданием заказа?
Зависит от конкретного приложения; скорее всего, ordering facade.
G>>>Доказательством является саом наличие persistance инфрастуктуры с Identity map, Unit of work и прочими паттернами. M>>Не спорю. Но я не хочу работать с ними как с plain data, поэтому и есть эта инфраструктура. G>Инфраструктура пытается скрыть факт, что это данные, а не объекты. Причем очень несупешно. Особенно это заметно при множестве параллельных операций.
Покажите, как это заметно.
G>>>Пока еще никому не удалось изобрести БД, которая отдает объекты (имеенно объекты, а не копию данных) с ссылочной эквивалентностью и без необходмости дополнительного преобразование, и чтобы при этом не было необходимости явно сохранять изменения. M>>В Smalltalk загляните -- там это есть. G>Ссылку?
Легко. Самое доступное изложение -- тут. Прочтите про squeak. http://habrahabr.ru/blogs/programming/55797/
G>Ну как работает приведите пример требований и решение с помощью DDD. G>А потом разберем посмотрим как оно будет в anemic и ответим на несколкьо "что если", чтобы оценить расширяемостиь решения.
Предлагаю начать вам -- чтобы я мог ориентироваться по требованиям. А то потом опять будет -- то report calculator в domain не может быть, то кэш слишком большой и не устраивает.
M>>>>Вы говорили про "2 принципиально разные операции, Ничего другого придумать нельзя." выше. В ООСУБД этого нет, и не надо. Надо же, придумали G>>>Ну, ссылку на такую ООСУБД в студию. Естественно она должна быть многопользовательской и поддерживать ACID трензакции. M>>Db4o в режиме "remote server" G>А чего в нем особенного, я тоже самое могу написать на MS SQL + EF, отличия чисто синтаксически будут. G>Единственное что схему заранее создават не надо, хотя если типы объектов известны на этапе компиляции, то разницы нет. Более того, для реляционной БД я могу еще проекциии, группировки и соединения делать. Что в этом плане db4o предложить может?
Особенности db4o и то, что она может предложить, следует обсуждать в отдельном топике. Не уводите тему разговора. Вы просили ссылку, я привел, вы с ней согласились. То, что вы такое тоже можете реализовать (медаль вам, ту самую, кстате ) -- это оффтоп. Оффтоп -- в оффтопку.
G>Какому объекту предметной области соовествует report calculator или statistics? А состояние у этого объекта какое? Какими либо персистными даннми н заведует? как domain expert понимает что это за объект?
Никакому, я же сказал -- это синтетический объект, который введен, чтобы процесс построения отчета был более доступен для понимания. Он заведует данными о статистике обращений в БД по некоторому профилю. Что-то типа Builder в GoF. Так как статистика строится за период наблюдения, он представляет эти данные -- историю выборок.
G>>>Пруф заключается в том, что есть системы которым не нужнен огромный кеш для нормально работы. M>>Отличный пруф, продолжайте дальше. Есть системы, которым и БД не нужна. Про "огромный кеш" еще можно поспорить. G>Ну если БД не нужна, то и обсуждать тут нечего. А когда БД нужна далеко не всегда такой кеш нужен.
Если лично вы против объектного кеша, то это ваши проблемы. Если одно его наличие так сильно отвращает вас от rich, то имхо у вас трудности, с которыми, боюсь, я не смогу помочь.
G>На тему оптимизации можно разговаривать отдельно и долго. G>Но кажется синклер тут приводил факты что при нормальном проектировании одна БД способна закормить от 2 до 10 приложений. если у вас БД загибается и вам нужен распределенный кеш только для того чтобы все работало с приемлимой скоростью это уже свидетельстует о неоптимальности работы с базой. G>Кстати, склько у вас выборок (если профайлером посмотреть) нестатичных данных случается при обработке одного запроса пользователя? G>Сколько при этом явных запросов на получение данных?
При чем здесь оптимизация? Объектный кеш -- это, как и identity map, enabling tool для rich-модели.
_распределенный_ кеш мне нужен для того, чтобы а)работало в кластере б)перезапуск приложения на одном из узлов проходил гладко, без тормозов, связанных с dog-pile эффектом
Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей.
По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор.
G>>>Не надо в теории доказывать, приведите пример, причет полный, без сокрытия самых интересных частей. M>>Хорошо, несколько позже приведу. G>ОК.
Я чуть выше написал, что хотел бы получить от вас вводную в виде anemic перед тем, как написать свой вариант.
Re[29]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали:
G>>Читайте что такое SRP. Определение очень простое.
O> Хочу знать, что такое SRP и PI тут упоминаемые. O> Нагуглить удалось только ваш blog(spot) и в нем определений нет.
Здравствуйте, Ocenochka, Вы писали:
O> Хочу знать, что такое SRP и PI тут упоминаемые. O> Нагуглить удалось только ваш blog(spot) и в нем определений нет.
Не знаю, как вы гуглите, но по запросу SRP в гугле — первая же ссылка — http://en.wikipedia.org/wiki/Single_responsibility_principle
С PI в гугле посложнее, но в общем это Persistence Ignorance, подход при котором слой бизнес логики и модель предметной области не знают ничего о том где и в каком виде данные сохраняются, читаются и как это происходит. Т.е. из бизнес логики исключается код, отвечающий за непосредственное сохранение/чтение данных и все нюансы с этим связанные.
Persistence Ignorance подход способствует:
1) вышеупомянутому SRP
2) снижению coupling (все время забываю как лучше на русский перевести и чтобы никто не перепутал с cohesion)
3) упрощению тестирования кода (улучшению тестируемости)
4) повторному использованию
5) лучшему структурированию и разделению кода по функциональности (separation of concerns, что в общем-то тоже можно отнести к SRP)
Re[30]: Архитектура приложения с несколькими клиентами и одн
Я на русском искал, английкий смысл может до меня дойти искаженным или вообще не дойти когда речь о таких абстрактных вещах.
Учу, учу английский
MC>С PI в гугле посложнее, но в общем это Persistence Ignorance, подход при котором слой бизнес логики и модель предметной области не знают ничего о том где и в каком виде данные сохраняются, читаются и как это происходит. Т.е. из бизнес логики исключается код, отвечающий за непосредственное сохранение/чтение данных и все нюансы с этим связанные. MC>Persistence Ignorance подход способствует: MC>1) вышеупомянутому SRP MC>2) снижению coupling (все время забываю как лучше на русский перевести и чтобы никто не перепутал с cohesion) MC>3) упрощению тестирования кода (улучшению тестируемости) MC>4) повторному использованию MC>5) лучшему структурированию и разделению кода по функциональности (separation of concerns, что в общем-то тоже можно отнести к SRP)
Спасибо, метод Save() в объектах никогда не понимал и что термин специальный есть не знал.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[29]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Все равно надо как-то объясниить инфраструктуре когда получать объекты и когда сохранять изменения. M>Какая-то философия получается. Выпил, поговорил с инфраструктурой, объяснил, где получать объекты, как сохранять.
M>>>Третье то, что коду бизнес-логики абсолюьно пофиг, что данные лежат где-то в БД. Их доставкой занимается инфраструктура и 1 (один сервис), называемый репозиторием. Причем это делается в режиме push, т.е. бизнес-логике вообще не надо никуда обращаться. G>>Пример кода в студию. Даже интересно как такое выгялдит. M>Будет вам код, будет
G>>А причем тут repository? Вот есть у нас объекта заказа. У него очевидно нету поведения. M>Не передергивайте. Ваши "очевидно" очевидны только вам, видимо, даже с контрпримерами.
Это примерно как на лекциях в универе. Иногда то что "очевидно" становится понятно только после экзамена.
G>>Кто будет заниматтся созданием заказа? M>Зависит от конкретного приложения; скорее всего, ordering facade.
Ну или ordering service А если еще у самого order нету поведения, то 100% anemic модель получается.
G>>>>Доказательством является саом наличие persistance инфрастуктуры с Identity map, Unit of work и прочими паттернами. M>>>Не спорю. Но я не хочу работать с ними как с plain data, поэтому и есть эта инфраструктура. G>>Инфраструктура пытается скрыть факт, что это данные, а не объекты. Причем очень несупешно. Особенно это заметно при множестве параллельных операций. M>Покажите, как это заметно.
В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными?
G>>>>Пока еще никому не удалось изобрести БД, которая отдает объекты (имеенно объекты, а не копию данных) с ссылочной эквивалентностью и без необходмости дополнительного преобразование, и чтобы при этом не было необходимости явно сохранять изменения. M>>>В Smalltalk загляните -- там это есть. G>>Ссылку? M>Легко. Самое доступное изложение -- тут. Прочтите про squeak. http://habrahabr.ru/blogs/programming/55797/
G>>Ну как работает приведите пример требований и решение с помощью DDD. G>>А потом разберем посмотрим как оно будет в anemic и ответим на несколкьо "что если", чтобы оценить расширяемостиь решения. M>Предлагаю начать вам -- чтобы я мог ориентироваться по требованиям. А то потом опять будет -- то report calculator в domain не может быть, то кэш слишком большой и не устраивает.
Надо подумать.
M>Особенности db4o и то, что она может предложить, следует обсуждать в отдельном топике. Не уводите тему разговора. Вы просили ссылку, я привел, вы с ней согласились. То, что вы такое тоже можете реализовать (медаль вам, ту самую, кстате ) -- это оффтоп. Оффтоп -- в оффтопку.
Так по сути нету ничего принципиального в db4o, только другой способ представления данных и schemaless. Data!=Objects остается.
G>>Какому объекту предметной области соовествует report calculator или statistics? А состояние у этого объекта какое? Какими либо персистными даннми н заведует? как domain expert понимает что это за объект? M>Никакому, я же сказал -- это синтетический объект, который введен, чтобы процесс построения отчета был более доступен для понимания. Он заведует данными о статистике обращений в БД по некоторому профилю. Что-то типа Builder в GoF. Так как статистика строится за период наблюдения, он представляет эти данные -- историю выборок.
Ну типичный сервис.
M>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей.
И у вас на таком начинает база загибатся?
M>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор.
Кеш — следствие. Причина в куче неконтроллируемых запросов, вызванных LL.
Re[30]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными?
Зависит от запроса.
M>>Особенности db4o и то, что она может предложить, следует обсуждать в отдельном топике. Не уводите тему разговора. Вы просили ссылку, я привел, вы с ней согласились. То, что вы такое тоже можете реализовать (медаль вам, ту самую, кстате ) -- это оффтоп. Оффтоп -- в оффтопку. G>Так по сути нету ничего принципиального в db4o, только другой способ представления данных и schemaless. Data!=Objects остается.
Разве я утверждал, что plain data == object? Я только говорил, что инфраструктура помогает поддерживать эту иллюзию.
G>>>Какому объекту предметной области соовествует report calculator или statistics? А состояние у этого объекта какое? Какими либо персистными даннми н заведует? как domain expert понимает что это за объект? M>>Никакому, я же сказал -- это синтетический объект, который введен, чтобы процесс построения отчета был более доступен для понимания. Он заведует данными о статистике обращений в БД по некоторому профилю. Что-то типа Builder в GoF. Так как статистика строится за период наблюдения, он представляет эти данные -- историю выборок. G>Ну типичный сервис.
Все может быть. Только я не знаю что такое сервис. Потому что история выборок -- такой же объект домена.
M>>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей. G>И у вас на таком начинает база загибатся?
Угу. У нас 600 statefull пользователей онлайн сидят, работают. Работают -- это значит "общие данные". Если бы не было кеша, запросов было бы за сотню.
M>>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор. G>Кеш — следствие. Причина в куче неконтролируемых запросов, вызванных LL.
LL -- это только принцип, как он реализован в конкретном инструменте -- другой вопрос. Если ваша инфраструктура не позволяет его контролировать в достаточной степени, то это плохо. Mike Chaliy вам тоже говорил, что все проблемы rich они заруливают в том числе грамотным тулингом -- выбором инструментов.
Re[31]: Архитектура приложения с несколькими клиентами и одн
G>>>>Какому объекту предметной области соовествует report calculator или statistics? А состояние у этого объекта какое? Какими либо персистными даннми н заведует? как domain expert понимает что это за объект? M>>>Никакому, я же сказал -- это синтетический объект, который введен, чтобы процесс построения отчета был более доступен для понимания. Он заведует данными о статистике обращений в БД по некоторому профилю. Что-то типа Builder в GoF. Так как статистика строится за период наблюдения, он представляет эти данные -- историю выборок. G>>Ну типичный сервис. M>Все может быть. Только я не знаю что такое сервис. Потому что история выборок -- такой же объект домена.
M>>>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей. G>>И у вас на таком начинает база загибатся? M>Угу. У нас 600 statefull пользователей онлайн сидят, работают. Работают -- это значит "общие данные". Если бы не было кеша, запросов было бы за сотню.
Всего 600, причем statefull? А запросов в секунду сколько?
M>>>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор. G>>Кеш — следствие. Причина в куче неконтролируемых запросов, вызванных LL. M>LL -- это только принцип, как он реализован в конкретном инструменте -- другой вопрос. Если ваша инфраструктура не позволяет его контролировать в достаточной степени, то это плохо. Mike Chaliy вам тоже говорил, что все проблемы rich они заруливают в том числе грамотным тулингом -- выбором инструментов.
А не проще не иметь таких проблем вообще?
Re[30]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
MC>2) снижению coupling (все время забываю как лучше на русский перевести и чтобы никто не перепутал с cohesion)
Лучше не переводить. Хотя наиболее частоупотребимое "связность".
Re[32]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
M>>>>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей. G>>>И у вас на таком начинает база загибатся? M>>Угу. У нас 600 statefull пользователей онлайн сидят, работают. Работают -- это значит "общие данные". Если бы не было кеша, запросов было бы за сотню. G>Всего 600, причем statefull? А запросов в секунду сколько?
Слишком многозначный термин -- запросов в секунду.
Давайте расчитаем в жестком режиме всякие запросы для 1го пользователя. Итак, различных запросов в секунду от толстого клиента пользователя -- 0.2 (будем считать вместе с heart-beat клиента). Один запрос -- это от 10 до 100 первичных выборок (зависит от данных), или ~2 — 20 первичных выборок в секунду. За счет кеша (cache hit ~0.9) это трансформируется в ~0.2 — 2 SQL Trans/секунду в БД на пользователя.
Для всех одновременно работающих пользователей это получается (0.2 -- 2) * 600 = (120 — 1200) SQL/сек на БД. Ну, 1200 SQL Trans/cек -- это пик, конечно, потому что пользователи редко долбят все сразу без остановки , но > 120 T/s бывает очень часто.
M>>>>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор. G>>>Кеш — следствие. Причина в куче неконтролируемых запросов, вызванных LL. M>>LL -- это только принцип, как он реализован в конкретном инструменте -- другой вопрос. Если ваша инфраструктура не позволяет его контролировать в достаточной степени, то это плохо. Mike Chaliy вам тоже говорил, что все проблемы rich они заруливают в том числе грамотным тулингом -- выбором инструментов. G>А не проще не иметь таких проблем вообще?
Воббще без проблем оно конечно было бы лучше всего (:
Re[33]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
M>>>>>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей. G>>>>И у вас на таком начинает база загибатся? M>>>Угу. У нас 600 statefull пользователей онлайн сидят, работают. Работают -- это значит "общие данные". Если бы не было кеша, запросов было бы за сотню. G>>Всего 600, причем statefull? А запросов в секунду сколько?
M>Слишком многозначный термин -- запросов в секунду. M>Давайте расчитаем в жестком режиме всякие запросы для 1го пользователя. Итак, различных запросов в секунду от толстого клиента пользователя -- 0.2 (будем считать вместе с heart-beat клиента). Один запрос -- это от 10 до 100 первичных выборок (зависит от данных), или ~2 — 20 первичных выборок в секунду. За счет кеша (cache hit ~0.9) это трансформируется в ~0.2 — 2 SQL Trans/секунду в БД на пользователя.
M>Для всех одновременно работающих пользователей это получается (0.2 -- 2) * 600 = (120 — 1200) SQL/сек на БД. Ну, 1200 SQL Trans/cек -- это пик, конечно, потому что пользователи редко долбят все сразу без остановки , но > 120 T/s бывает очень часто.
не такая уж и зверская нагрузка чтобы кластер и распределенный кеш поднимать.
В принципе прикрутив кеширование по last-modified готовых объектов на клиенте и сервере, отказавшись от LL и собрав правльные joinы и проекции можно и на одном сервере это держать.
А если еще и справочные данные персистить на клиенте, то можно очень сильно разгрузить сервер.
Только при таком объеме базы вся аналитика должна делаться через OLAP с большим временем кеширования.
M>>>>>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор. G>>>>Кеш — следствие. Причина в куче неконтролируемых запросов, вызванных LL. M>>>LL -- это только принцип, как он реализован в конкретном инструменте -- другой вопрос. Если ваша инфраструктура не позволяет его контролировать в достаточной степени, то это плохо. Mike Chaliy вам тоже говорил, что все проблемы rich они заруливают в том числе грамотным тулингом -- выбором инструментов. G>>А не проще не иметь таких проблем вообще? M> M> M>Воббще без проблем оно конечно было бы лучше всего (:
Так вам это и предлагают, а вы отказываетесь.
Я так понял что некоторых rich привлеккает своей прямолинейностью: пообщались с domain expert — нарисовали domain model. надо кудато поместить логику — прямо в объект с данными. нужны связанные данные — есть LL, все вытянет. Медленно тянет — используем навороченный кеш итп.
Anemic заставляет думать на каждом этапе: какую модель данных создать? Какие данные загружать для данной опрации? Как кеширование данных сделать? Как группировать методы в сервисы чтобы никто не запустался?
Re[34]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Я так понял что некоторых rich привлеккает своей прямолинейностью: пообщались с domain expert — нарисовали domain model. надо кудато поместить логику — прямо в объект с данными. нужны связанные данные — есть LL, все вытянет. Медленно тянет — используем навороченный кеш итп. G>Anemic заставляет думать на каждом этапе: какую модель данных создать? Какие данные загружать для данной опрации? Как кеширование данных сделать? Как группировать методы в сервисы чтобы никто не запустался?
А не мог бы ты как нибудь написать тестовое приложение в стиле anemic? Ну чисто customer + order + orderline к примеру в winforms. Во-первых было бы многим полезно, во-вторых можно было бы уже его исопльзовать для обсуждения, приведения примеров кода и т.д.
Re[35]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
MC>Здравствуйте, gandjustas, Вы писали:
G>>Я так понял что некоторых rich привлеккает своей прямолинейностью: пообщались с domain expert — нарисовали domain model. надо кудато поместить логику — прямо в объект с данными. нужны связанные данные — есть LL, все вытянет. Медленно тянет — используем навороченный кеш итп. G>>Anemic заставляет думать на каждом этапе: какую модель данных создать? Какие данные загружать для данной опрации? Как кеширование данных сделать? Как группировать методы в сервисы чтобы никто не запустался?
MC>А не мог бы ты как нибудь написать тестовое приложение в стиле anemic? Ну чисто customer + order + orderline к примеру в winforms. Во-первых было бы многим полезно, во-вторых можно было бы уже его исопльзовать для обсуждения, приведения примеров кода и т.д.
Хотел бы, но пока времени нету. Кроме того делать что-то очень простое не хотелось бы, непоказательно будет.
Вероятнее всего пример будет на ASP.NET MVC. Писать MVP для winforms ломает — многословно получается. Потом может на wpf сделаю.
Re[34]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, meowth, Вы писали:
M>>Здравствуйте, gandjustas, Вы писали:
M>>>>>>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей. G>>>>>И у вас на таком начинает база загибатся? M>>>>Угу. У нас 600 statefull пользователей онлайн сидят, работают. Работают -- это значит "общие данные". Если бы не было кеша, запросов было бы за сотню. G>>>Всего 600, причем statefull? А запросов в секунду сколько?
M>>Слишком многозначный термин -- запросов в секунду. M>>Давайте расчитаем в жестком режиме всякие запросы для 1го пользователя. Итак, различных запросов в секунду от толстого клиента пользователя -- 0.2 (будем считать вместе с heart-beat клиента). Один запрос -- это от 10 до 100 первичных выборок (зависит от данных), или ~2 — 20 первичных выборок в секунду. За счет кеша (cache hit ~0.9) это трансформируется в ~0.2 — 2 SQL Trans/секунду в БД на пользователя.
M>>Для всех одновременно работающих пользователей это получается (0.2 -- 2) * 600 = (120 — 1200) SQL/сек на БД. Ну, 1200 SQL Trans/cек -- это пик, конечно, потому что пользователи редко долбят все сразу без остановки , но > 120 T/s бывает очень часто.
G>не такая уж и зверская нагрузка чтобы кластер и распределенный кеш поднимать.
У меня не БД в кластере, у меня сервера приложений, а сервер БД -- 1. И распределенный кеш нужен именно поэтому -- чтобы не держать общие данные в кеше на каждом узле и чтобы не париться с настройкой инвалидации данных.
G>В принципе прикрутив кеширование по last-modified готовых объектов на клиенте и сервере, отказавшись от LL и собрав правльные joinы и проекции можно и на одном сервере это держать.
Я не хочу писать это руками -- нашей маленькой команде и так хватает дел. Стоимость решения будет в разы больше. Кроме того, наша модель меняется достаточно часто.
А так это уже все есть в инфраструктуре.
G>А если еще и справочные данные персистить на клиенте, то можно очень сильно разгрузить сервер. G>Только при таком объеме базы вся аналитика должна делаться через OLAP с большим временем кеширования. M>>>>>>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор. G>>>>>Кеш — следствие. Причина в куче неконтролируемых запросов, вызванных LL. M>>>>LL -- это только принцип, как он реализован в конкретном инструменте -- другой вопрос. Если ваша инфраструктура не позволяет его контролировать в достаточной степени, то это плохо. Mike Chaliy вам тоже говорил, что все проблемы rich они заруливают в том числе грамотным тулингом -- выбором инструментов. G>>>А не проще не иметь таких проблем вообще? M>> M>> M>>Воббще без проблем оно конечно было бы лучше всего (: G>Так вам это и предлагают, а вы отказываетесь.
G>Я так понял что некоторых rich привлеккает своей прямолинейностью: пообщались с domain expert — нарисовали domain model. надо кудато поместить логику — прямо в объект с данными. нужны связанные данные — есть LL, все вытянет. Медленно тянет — используем навороченный кеш итп. G>Anemic заставляет думать на каждом этапе: какую модель данных создать? Какие данные загружать для данной опрации? Как кеширование данных сделать? Как группировать методы в сервисы чтобы никто не запустался?
Хм. Лично я не понимаю, зачем в каждой точке кода, где нужен кеш, думать, как этот кеш сделать. Грубо, если в сервисе А вам нужно N полей объекта, а в сервисе B -- N+2, то придется по новой продумать весь сервис кеширования.
Re[36]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
MC>>А не мог бы ты как нибудь написать тестовое приложение в стиле anemic? Ну чисто customer + order + orderline к примеру в winforms. Во-первых было бы многим полезно, во-вторых можно было бы уже его исопльзовать для обсуждения, приведения примеров кода и т.д. G>Хотел бы, но пока времени нету. Кроме того делать что-то очень простое не хотелось бы, непоказательно будет.
Дык можно набросать за пару часиков основу, а потом уже постепенно ее развивать чтобы становилось все более и более показательнее. К примеру спросил потом кто-то на форуме "а вот как сделать то-то?" — ты взял и добавил это для примера в свое приложение уже по быстрому.
G>Вероятнее всего пример будет на ASP.NET MVC. Писать MVP для winforms ломает — многословно получается. Потом может на wpf сделаю.
Имхо winforms было бы проще для понимания и показательнее... А насчет необходимости MVP.. ну не буду холивар поднимать
Re[35]: Архитектура приложения с несколькими клиентами и одн
Вообще я думаю, что все эти споры потому что у каждого человека больше опыта в чем-то одном. Кто-то годами пишет в стиле rich и уже знает как решать все основные задачи и проблемы, но не очень хорошо знает как решать задачи и проблемы встающие при использовании anemic модели. Другой наоборот — годами пишет anemic, а опыта с rich моделью все-таки немного недостаточно, чтобы быть способным эффективно решать имеющиеся там проблемы. Вот они и начинают спорить друг с другом. В общем-то это почти как и любой спор — из-за того что люди не могут полностью понимать как мыслит, понимает и что и как делает другой человек. Если бы такое понимание вдруг пришло, то думаю что и споры бы сильно уменьшились, и пришло бы понимание что можно без проблем делать и так и так.
Re[36]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
MC>Вообще я думаю, что все эти споры потому что у каждого человека больше опыта в чем-то одном. Кто-то годами пишет в стиле rich и уже знает как решать все основные задачи и проблемы, но не очень хорошо знает как решать задачи и проблемы встающие при использовании anemic модели. Другой наоборот — годами пишет anemic, а опыта с rich моделью все-таки немного недостаточно, чтобы быть способным эффективно решать имеющиеся там проблемы.
У нас тут маленькая проблемка, у нас тут есть человек кторый считает что очень круто знает и то и другое.
Здравствуйте, meowth, Вы писали:
G>>В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными? M>Зависит от запроса.
А разве нельзя Equals() переопределить, чтобы было как надо?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[32]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали:
G>>>В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными? M>>Зависит от запроса.
O> А разве нельзя Equals() переопределить, чтобы было как надо?
Тут видимо имеется в виду что получаются разные instance'ы объектов, а иногда нужно чтобы был только один instance, типа как бы глобальный IdentityMap.
Re[35]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, meowth, Вы писали:
M>>>Здравствуйте, gandjustas, Вы писали:
M>>>>>>>Количество обращений зависит от характера запроса. Если вы имеете в виду SQL-профайлер, то в среднем — от 2х (выборка для механизма безопасности) до 6-8. Это порядка 70%-90% от всех запросов при нормальной работе пользователей. G>>>>>>И у вас на таком начинает база загибатся? M>>>>>Угу. У нас 600 statefull пользователей онлайн сидят, работают. Работают -- это значит "общие данные". Если бы не было кеша, запросов было бы за сотню. G>>>>Всего 600, причем statefull? А запросов в секунду сколько?
M>>>Слишком многозначный термин -- запросов в секунду. M>>>Давайте расчитаем в жестком режиме всякие запросы для 1го пользователя. Итак, различных запросов в секунду от толстого клиента пользователя -- 0.2 (будем считать вместе с heart-beat клиента). Один запрос -- это от 10 до 100 первичных выборок (зависит от данных), или ~2 — 20 первичных выборок в секунду. За счет кеша (cache hit ~0.9) это трансформируется в ~0.2 — 2 SQL Trans/секунду в БД на пользователя.
M>>>Для всех одновременно работающих пользователей это получается (0.2 -- 2) * 600 = (120 — 1200) SQL/сек на БД. Ну, 1200 SQL Trans/cек -- это пик, конечно, потому что пользователи редко долбят все сразу без остановки , но > 120 T/s бывает очень часто.
G>>не такая уж и зверская нагрузка чтобы кластер и распределенный кеш поднимать. M>У меня не БД в кластере, у меня сервера приложений, а сервер БД -- 1.
Это понятно. При распределенной БД были бы совершенно другие проблемы.
M>И распределенный кеш нужен именно поэтому -- чтобы не держать общие данные в кеше на каждом узле и чтобы не париться с настройкой инвалидации данных.
Ну это ему скорости не добавляет.
G>>В принципе прикрутив кеширование по last-modified готовых объектов на клиенте и сервере, отказавшись от LL и собрав правльные joinы и проекции можно и на одном сервере это держать. M>Я не хочу писать это руками -- нашей маленькой команде и так хватает дел. Стоимость решения будет в разы больше. Кроме того, наша модель меняется достаточно часто. M>А так это уже все есть в инфраструктуре.
"Этого" ни в одной инфраструктуре. Подходов к кешированию по last-modified может быть много, и зависят они от сценариев использования данных.
Зато такое кеширование является самым эффективным.
G>>А если еще и справочные данные персистить на клиенте, то можно очень сильно разгрузить сервер. G>>Только при таком объеме базы вся аналитика должна делаться через OLAP с большим временем кеширования. M>>>>>>>По-моему, вы пытаетесь придраться к кешу. Перестаньте уже, не о том разговор. G>>>>>>Кеш — следствие. Причина в куче неконтролируемых запросов, вызванных LL. M>>>>>LL -- это только принцип, как он реализован в конкретном инструменте -- другой вопрос. Если ваша инфраструктура не позволяет его контролировать в достаточной степени, то это плохо. Mike Chaliy вам тоже говорил, что все проблемы rich они заруливают в том числе грамотным тулингом -- выбором инструментов. G>>>>А не проще не иметь таких проблем вообще? M>>> M>>> M>>>Воббще без проблем оно конечно было бы лучше всего (: G>>Так вам это и предлагают, а вы отказываетесь.
G>>Я так понял что некоторых rich привлеккает своей прямолинейностью: пообщались с domain expert — нарисовали domain model. надо кудато поместить логику — прямо в объект с данными. нужны связанные данные — есть LL, все вытянет. Медленно тянет — используем навороченный кеш итп. G>>Anemic заставляет думать на каждом этапе: какую модель данных создать? Какие данные загружать для данной опрации? Как кеширование данных сделать? Как группировать методы в сервисы чтобы никто не запустался? M>Хм. Лично я не понимаю, зачем в каждой точке кода, где нужен кеш, думать, как этот кеш сделать. Грубо, если в сервисе А вам нужно N полей объекта, а в сервисе B -- N+2, то придется по новой продумать весь сервис кеширования.
Не надо ничего по новой продумывать, это все обобщенным кодом делается. Если стратегии кеширования не меняются, то и код не меняется.
Re[37]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Mike Chaliy, Вы писали:
MC>Здравствуйте, MozgC, Вы писали:
MC>>Вообще я думаю, что все эти споры потому что у каждого человека больше опыта в чем-то одном. Кто-то годами пишет в стиле rich и уже знает как решать все основные задачи и проблемы, но не очень хорошо знает как решать задачи и проблемы встающие при использовании anemic модели. Другой наоборот — годами пишет anemic, а опыта с rich моделью все-таки немного недостаточно, чтобы быть способным эффективно решать имеющиеся там проблемы.
MC>У нас тут маленькая проблемка, у нас тут есть человек кторый считает что очень круто знает и то и другое.
А еще с ним пытаются спорить те, кто ни того ни другого не знают
Re[33]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
G>>>>В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными? M>>>Зависит от запроса. O>> А разве нельзя Equals() переопределить, чтобы было как надо? MC>Тут видимо имеется в виду что получаются разные instance'ы объектов, а иногда нужно чтобы был только один instance, типа как бы глобальный IdentityMap.
Интересно, а когда это может причинять неудобства, кроме случая ссылочного сравнения объектов?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[34]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали:
O>Здравствуйте, MozgC, Вы писали:
G>>>>>В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными? M>>>>Зависит от запроса. O>>> А разве нельзя Equals() переопределить, чтобы было как надо? MC>>Тут видимо имеется в виду что получаются разные instance'ы объектов, а иногда нужно чтобы был только один instance, типа как бы глобальный IdentityMap.
O> Интересно, а когда это может причинять неудобства, кроме случая ссылочного сравнения объектов?
Архитектура корпоративных программных приложений (c) Мартин Фаулер :
В процессе загрузки данных необходимо тщательно следить за тем, чтобы ни один из объектов не был считан дважды, иначе в памяти будут созданы два объекта, соответствующих одной и той же записи таблицы базы данных. Попробуйте обновить каждую из них, и неприятности не заставят себя ждать. Чтобы уйти от проблем, необходимо вести учет каждой считанной записи, а поможет в этом типовое решение коллекция объектов (Identity Map, 216). Каждый раз при необходимости считывания порции данных вначале следует проверить, не содержится ли она в коллекции объектов. Если информация уже загружалась, можно предусмотреть возврат ссылки на нее. В этом случае любые попытки изменения данных будут скоординированы. Еще одно преимущество — возможность избежать дополнительного обращения к базе данных, поскольку коллекция объектов действует как кэш-память. Не забывайте, однако, что главное назначение коллекции объектов — учет идентификационных номеров объектов, а не повышение производительности приложения.
Использование коллекции объектов необходимо практически во всех случаях, когда состояние объекта домена нужно хранить в памяти, поскольку появление многочисленных копий одного и того же объекта может привести к непредсказуемым результатам.
Старое изречение гласит: "Человек, который носит две пары часов, никогда не знает, сколько времени". Впрочем, две пары часов — это еще не так серьезно, как загрузка объектов из базы данных. Если вы не будете предельно внимательны, то вполне можете загрузить одни и те же данные в два разных объекта. Легко представить, какая неразбериха начнется, когда вы попытаетесь одновременно внести в базу данных обновления этих объектов...
Описанная ситуация тесно связана и с проблемой производительности. Если одни и те же данные будут загружены несколько раз, это приведет к чрезмерным (и, что самое печальное, совершенно ненужным) расходам на выполнение удаленных вызовов функций. Таким образом, предупреждение повторной загрузки данных не только помогает избежать ошибок, но и значительно ускоряет производительность работы приложения.
Назначение
Как правило, коллекция объектов применяется для управления любыми объектами, которые были загружены из базы данных и затем подверглись изменениям. Основное назначение коллекции объектов — не допустить возникновения ситуации, когда два разных объекта приложения будут соответствовать одной и той же записи базы данных, поскольку изменение этих объектов может происходить несогласованно и, следовательно, вызывать трудности с отображением на базу данных.
Еще одним преимуществом коллекции объектов является возможность использования ее в качестве кэша записей, считываемых из базы данных. Это избавляет от необходимости повторно обращаться к базе данных, если снова понадобится какой-нибудь объект.
Скорее всего, коллекция объектов не понадобится для хранения неизменяемых объектов. Если объект не может быть изменен, вам не нужно беспокоиться о потенциальных конфликтах, связанных с его обновлением. Поскольку объекты-значения (Value Object, 500) являются неизменяемыми, из этого следует, что для работы с ними коллекция объектов, по большому счету, не нужна. Несмотря на это, она может пригодиться и здесь — прежде всего в качестве кэша. Помимо этого, наличие коллекции объектов позволяет предупредить использование некорректного метода проверки на равенство — проблема, весьма распространенная в Java, где нельзя переопределить действие оператора ==.
...
Коллекция объектов помогает избежать конфликтов обновления, возникающих в пределах одного сеанса, однако она бессильна что-либо сделать в случае межсеансовых проблем. Это довольно сложный вопрос, к которому мы вернемся в разделах, посвященных оптимистической автономной блокировке (Optimistic Offline Lock, 434) и пессимистической автономной блокировке (Pessimistic Offline Lock, 445).
Здравствуйте, meowth, Вы писали:
M>Ну имхо вы усложняете. It depends. В смысле, если сервер был 1, и добавить еще один -- это да, может быть очень заморочисто. А если их было 2 или 3 или больше, то добавить еще один -- обычно совершенно не сложно, т.к. архитектура уже приспособлена к децентрализации.
Даже во втором случае увеличение производительности может быть меньше, если бы выделели больше времени на разработку.
Приведу пример из жизни. Он конешно надуманый, но какой есть
Есть у нас продуманая до мелких деталей машина марки ферари и есть чудо российского автопрома — лада. Сколько лад не покупай, не запрягай в одну упряжку ехать со скоростью ферари они не смогут Зато они смогут вести больше людей. Но что делать, если мне не надо именно быстро ехать, а не обеспечивать транспортом толпу людей, которые никуда не спешат?
Здравствуйте, ilvi, Вы писали:
I>Даже во втором случае увеличение производительности может быть меньше, если бы выделели больше времени на разработку. I>Приведу пример из жизни. Он конешно надуманый, но какой есть I>Есть у нас продуманая до мелких деталей машина марки ферари и есть чудо российского автопрома — лада. Сколько лад не покупай, не запрягай в одну упряжку ехать со скоростью ферари они не смогут Зато они смогут вести больше людей. Но что делать, если мне не надо именно быстро ехать, а не обеспечивать транспортом толпу людей, которые никуда не спешат?
Думаю надо обратиться на профильный форум по автомобилям. Догадываться, что вы хотите сказать очень не хочется. Я например понял так, что вы хотите максимально быстрый сервер из возможных, рекомендую взять mysql, отключить транзакции, использовать чистый сиквел и нейтив провайдер для клиента, язык ASM или C.
В этой ветке пытаются понять в каких ситуациях какая модель помогает легче справляться с увеличением сложности проекта. Иногда говорят о том, как победить тормза которые вызывает использование принципа persistance ignorance.
В мире гораздо больше задач в которых надо получить максимально дешевый, стабильно работающий и легко расширяемый сервер, чем задач получить сервер который рвет все остальные сервера по производительности.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[36]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
M>>У меня не БД в кластере, у меня сервера приложений, а сервер БД -- 1. G>Это понятно. При распределенной БД были бы совершенно другие проблемы.
Согласен. Распределенная БД для энтерпрайз -- это другой уровень и совершенно другой ценовой ценовой диапазон решений. Я бы даже сказал, что эта тема счас малоактивна, ибо дорого и не на потоке.
M>>И распределенный кеш нужен именно поэтому -- чтобы не держать общие данные в кеше на каждом узле и чтобы не париться с настройкой инвалидации данных. G>Ну это ему скорости не добавляет.
Конечно, он будет медленнее, чем внутрипроцессный или даже локальный кеш, но у нас на серверах 10гигабит эзернет, который все равно невозможно "забить" данными до отказа -- он отрабатывает гораздо быстрее, чем БД Этот кеш позволяет здорово разгрузить БД, на долю которой остаются в основном пуш-запросы (update, delete).
Если вам интересно, вот результаты эксперимента по cpu utilization. С отключенным распределенным кешем сервер приложений был загружен на 20%, сервер БД -- на 85%. С включенным кешем ситуация обратная -- сервер приложений плотно "приседает" на процессор (85%-90%), а cpu БД не поднимается выше 17%. Это говорит о том, что у нас есть отличный запас по производительности -- в случае "затыка" мы не лимитированы БД, которую было бы сложно отмасштабировать, а можем набросать еще серверов приложений.
G>"Этого" ни в одной инфраструктуре. Подходов к кешированию по last-modified может быть много, и зависят они от сценариев использования данных.
В NHibernate в кеше используется одна из разновидностей такого кеширования. Прямо "из коробки".
G>Зато такое кеширование является самым эффективным.
Согласен, кастомный "ручной" тюнинг во многих случаях является самым эффективным, но он и требует больше всего затрат на наладку и поддержку. Мы не можем себе такое позволить -- нам нужны будут несколько человек, которые анализируют сценарии и занимаются исключительно проблемой производительности. Причем из-за частой смены модели (~20 экспертов постоянно ее оптимизируют и усовершенствуют) нам придется только и делать, что менять схемы кеширования. А учитывая повышенную сложность отладки приложений с кешем...
M>>Хм. Лично я не понимаю, зачем в каждой точке кода, где нужен кеш, думать, как этот кеш сделать. Грубо, если в сервисе А вам нужно N полей объекта, а в сервисе B -- N+2, то придется по новой продумать весь сервис кеширования. G>Не надо ничего по новой продумывать, это все обобщенным кодом делается. Если стратегии кеширования не меняются, то и код не меняется.
Думаю, что для каждого случая надо будет продумывать свою стратегию кеширования. Имхо это затратно.
Мне не сложно запустить по сети несколько инстансов memcached (я это делаю менеджером memcahed, не вставая из-за компьютера). Мне кажется, приобрести лишние планки рамы -- это гораздо дешевле, чем сопровождать изощренные схемы кеширования.
Re[37]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>>>И распределенный кеш нужен именно поэтому -- чтобы не держать общие данные в кеше на каждом узле и чтобы не париться с настройкой инвалидации данных. G>>Ну это ему скорости не добавляет. M>Конечно, он будет медленнее, чем внутрипроцессный или даже локальный кеш, но у нас на серверах 10гигабит эзернет, который все равно невозможно "забить" данными до отказа -- он отрабатывает гораздо быстрее, чем БД Этот кеш позволяет здорово разгрузить БД, на долю которой остаются в основном пуш-запросы (update, delete).
О минимальности требований к железу явно не задумывались.
M>Если вам интересно, вот результаты эксперимента по cpu utilization. С отключенным распределенным кешем сервер приложений был загружен на 20%, сервер БД -- на 85%. С включенным кешем ситуация обратная -- сервер приложений плотно "приседает" на процессор (85%-90%), а cpu БД не поднимается выше 17%. Это говорит о том, что у нас есть отличный запас по производительности -- в случае "затыка" мы не лимитированы БД, которую было бы сложно отмасштабировать, а можем набросать еще серверов приложений.
Это говорит о том что БД используется неэффективно. Сделав правильные запросы, вы б смогли и без кеша напрягать субд не более, чем на 25%, имея ту же 20% заугрузку сервера приложений.
G>>"Этого" ни в одной инфраструктуре. Подходов к кешированию по last-modified может быть много, и зависят они от сценариев использования данных. M>В NHibernate в кеше используется одна из разновидностей такого кеширования. Прямо "из коробки".
Каким образом? Без модификации базы просто так last-modified не натянешь.
При этом кешировать данные, возвращенные запросом — самый эффективный способ расходования памяти.
G>>Зато такое кеширование является самым эффективным. M>Согласен, кастомный "ручной" тюнинг во многих случаях является самым эффективным, но он и требует больше всего затрат на наладку и поддержку.
Это только так кажется. На самом деле стратегий кеширования а одном приложении будет несколько штук всего, при этом все они поддерживаются обощенным кодом. M>Мы не можем себе такое позволить -- нам нужны будут несколько человек, которые анализируют сценарии и занимаются исключительно проблемой производительности.
Естественно имея говотовое приложение, которое во всю испльзует LL, придется выделять отдельую группу для тонинга таких производительности.
M>Причем из-за частой смены модели (~20 экспертов постоянно ее оптимизируют и усовершенствуют) нам придется только и делать, что менять схемы кеширования.
Не придется, причину я выше описал.
M>А учитывая повышенную сложность отладки приложений с кешем...
M>>>Хм. Лично я не понимаю, зачем в каждой точке кода, где нужен кеш, думать, как этот кеш сделать. Грубо, если в сервисе А вам нужно N полей объекта, а в сервисе B -- N+2, то придется по новой продумать весь сервис кеширования. G>>Не надо ничего по новой продумывать, это все обобщенным кодом делается. Если стратегии кеширования не меняются, то и код не меняется. M>Думаю, что для каждого случая надо будет продумывать свою стратегию кеширования. Имхо это затратно.
Думать мозгом гораздо менее затратно, чем писать код. Код тяжелее выкинуть.
M>Мне не сложно запустить по сети несколько инстансов memcached (я это делаю менеджером memcahed, не вставая из-за компьютера). Мне кажется, приобрести лишние планки рамы -- это гораздо дешевле, чем сопровождать изощренные схемы кеширования.
Сам себе противоречишь. Распределенный кеш ораздо более сложен в использовани, чем кеширование по last-modified. Преимущество у него только в том, что его можно использовать дял всего. Только не факт что будет от этого толк.
Здравствуйте, ilvi, Вы писали:
I>Здравствуйте, meowth, Вы писали:
M>>Ну имхо вы усложняете. It depends. В смысле, если сервер был 1, и добавить еще один -- это да, может быть очень заморочисто. А если их было 2 или 3 или больше, то добавить еще один -- обычно совершенно не сложно, т.к. архитектура уже приспособлена к децентрализации.
I>Даже во втором случае увеличение производительности может быть меньше, если бы выделели больше времени на разработку. I>Приведу пример из жизни. Он конешно надуманый, но какой есть I>Есть у нас продуманая до мелких деталей машина марки ферари и есть чудо российского автопрома — лада. Сколько лад не покупай, не запрягай в одну упряжку ехать со скоростью ферари они не смогут Зато они смогут вести больше людей. Но что делать, если мне не надо именно быстро ехать, а не обеспечивать транспортом толпу людей, которые никуда не спешат?
Я так понял, замороченные примеры из жизни -- эта крута, поэтому отвечу вот каким: если бы во рту росли галлюциногенные грибы, то можно было бы трансформировать сознание, не отходя от кассы, так сказать. Понятно, что я хотел сказать?
Я думаю, что в таком случае стоит изучить постановку задачи, а не полагаться на "если бы выделили". А если бы не выделили?
Я, конечно, понимаю, что оптимизировать можно бесконечно, но откуда уверенность, что переделка системы даст заказанный рекваирментом прирост производительности? Для этого нужно исследование, для него в свою очередь нужно время и ресурсы. Это тоже надо учитывать.
Откуда вы возьмете деньги на феррари?
Re[38]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, meowth, Вы писали:
M>>>>И распределенный кеш нужен именно поэтому -- чтобы не держать общие данные в кеше на каждом узле и чтобы не париться с настройкой инвалидации данных. G>>>Ну это ему скорости не добавляет. M>>Конечно, он будет медленнее, чем внутрипроцессный или даже локальный кеш, но у нас на серверах 10гигабит эзернет, который все равно невозможно "забить" данными до отказа -- он отрабатывает гораздо быстрее, чем БД Этот кеш позволяет здорово разгрузить БД, на долю которой остаются в основном пуш-запросы (update, delete). G>О минимальности требований к железу явно не задумывались.
У нас не коробочное приложение. Требования выставил заказчик, мы пишем на том, что есть.
M>>Если вам интересно, вот результаты эксперимента по cpu utilization. С отключенным распределенным кешем сервер приложений был загружен на 20%, сервер БД -- на 85%. С включенным кешем ситуация обратная -- сервер приложений плотно "приседает" на процессор (85%-90%), а cpu БД не поднимается выше 17%. Это говорит о том, что у нас есть отличный запас по производительности -- в случае "затыка" мы не лимитированы БД, которую было бы сложно отмасштабировать, а можем набросать еще серверов приложений. G>Это говорит о том что БД используется неэффективно. Сделав правильные запросы, вы б смогли и без кеша напрягать субд не более, чем на 25%, имея ту же 20% заугрузку сервера приложений.
Я понял вас: у нас неправильно написанное приложение. Правильное -- оно, конешно, лучше было бы, и уж явно не такое, как мы написали — и сервер не грузило бы, и работало мгновенно, и ошибок не выдавыло б никогда.
G>>>"Этого" ни в одной инфраструктуре. Подходов к кешированию по last-modified может быть много, и зависят они от сценариев использования данных. M>>В NHibernate в кеше используется одна из разновидностей такого кеширования. Прямо "из коробки". G>Каким образом? Без модификации базы просто так last-modified не натянешь. G>При этом кешировать данные, возвращенные запросом — самый эффективный способ расходования памяти.
Еще раз говорю, укажите мне на пункт, который говорит о критичности расхода памяти. Это не аргумент.
А зачем для last-modified модифицировать БД? Отметки о модификации хранятся в системе кеширования.
G>>>Зато такое кеширование является самым эффективным. M>>Согласен, кастомный "ручной" тюнинг во многих случаях является самым эффективным, но он и требует больше всего затрат на наладку и поддержку. G>Это только так кажется. На самом деле стратегий кеширования а одном приложении будет несколько штук всего, при этом все они поддерживаются обощенным кодом. M>>Мы не можем себе такое позволить -- нам нужны будут несколько человек, которые анализируют сценарии и занимаются исключительно проблемой производительности. G>Естественно имея говотовое приложение, которое во всю испльзует LL, придется выделять отдельую группу для тонинга таких производительности.
Без комментариев, честно.
M>>>>Хм. Лично я не понимаю, зачем в каждой точке кода, где нужен кеш, думать, как этот кеш сделать. Грубо, если в сервисе А вам нужно N полей объекта, а в сервисе B -- N+2, то придется по новой продумать весь сервис кеширования. G>>>Не надо ничего по новой продумывать, это все обобщенным кодом делается. Если стратегии кеширования не меняются, то и код не меняется. M>>Думаю, что для каждого случая надо будет продумывать свою стратегию кеширования. Имхо это затратно. G>Думать мозгом гораздо менее затратно, чем писать код. Код тяжелее выкинуть.
А, я понял, что вы хотите сказать -- что когда мы писали ПО, мы не думали. Вы тоже любитель ставить диагнозы по фото?
M>>Мне не сложно запустить по сети несколько инстансов memcached (я это делаю менеджером memcahed, не вставая из-за компьютера). Мне кажется, приобрести лишние планки рамы -- это гораздо дешевле, чем сопровождать изощренные схемы кеширования. G>Сам себе противоречишь. Распределенный кеш ораздо более сложен в использовани, чем кеширование по last-modified.
Я не увидел противоречия. Сложен в использовании, если его писать самому и прочее. Тут он из коробки -- несколько параметров в config, и все работает.
G>Преимущество у него только в том, что его можно использовать дял всего. Только не факт что будет от этого толк.
Факт есть -- у нас толк присутствует.
Re[37]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
MC>>>А не мог бы ты как нибудь написать тестовое приложение в стиле anemic? Ну чисто customer + order + orderline к примеру в winforms. Во-первых было бы многим полезно, во-вторых можно было бы уже его исопльзовать для обсуждения, приведения примеров кода и т.д. G>>Хотел бы, но пока времени нету. Кроме того делать что-то очень простое не хотелось бы, непоказательно будет. MC>Дык можно набросать за пару часиков основу, а потом уже постепенно ее развивать чтобы становилось все более и более показательнее. К примеру спросил потом кто-то на форуме "а вот как сделать то-то?" — ты взял и добавил это для примера в свое приложение уже по быстрому.
G>>Вероятнее всего пример будет на ASP.NET MVC. Писать MVP для winforms ломает — многословно получается. Потом может на wpf сделаю. MC>Имхо winforms было бы проще для понимания и показательнее... А насчет необходимости MVP.. ну не буду холивар поднимать
Я присоединяюсь;
Не сочтите за наглость, но хотел бы добавить, что не настаиваю, но весьма желал бы увидеть там те аспекты, которые были затронуты в споре:
а) поддержку версионирования данных;
б) кеширование;
в) опционально, но не критично -- валидацию.
Re[35]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, MozgC, Вы писали:
G>>>>>>В в хибернейте до сих пор осталась "фича", что объекты полученные разными путями (навигационном и запросом) являются разными? M>>>>>Зависит от запроса. O>>>> А разве нельзя Equals() переопределить, чтобы было как надо? MC>>>Тут видимо имеется в виду что получаются разные instance'ы объектов, а иногда нужно чтобы был только один instance, типа как бы глобальный IdentityMap. O>> Интересно, а когда это может причинять неудобства, кроме случая ссылочного сравнения объектов?
MC>Архитектура корпоративных программных приложений (c) Мартин Фаулер :
[поскипано]
Пора уже перечитать...
Я так понимаю, проблема в том, что один и тот же объект будет лежать в памяти в разных экземплярах и изменение одного не приведет к изменению другого? Т.е. получится рассинхронизация данных объекта в разных экземплярах? Т.е. хибернейтовские прокси будут обращаться к разным объектам, хотя id у них будет одинаковый? Вот это новость!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Люблю ставить оценки.
Re[39]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>>>Если вам интересно, вот результаты эксперимента по cpu utilization. С отключенным распределенным кешем сервер приложений был загружен на 20%, сервер БД -- на 85%. С включенным кешем ситуация обратная -- сервер приложений плотно "приседает" на процессор (85%-90%), а cpu БД не поднимается выше 17%. Это говорит о том, что у нас есть отличный запас по производительности -- в случае "затыка" мы не лимитированы БД, которую было бы сложно отмасштабировать, а можем набросать еще серверов приложений. G>>Это говорит о том что БД используется неэффективно. Сделав правильные запросы, вы б смогли и без кеша напрягать субд не более, чем на 25%, имея ту же 20% заугрузку сервера приложений. M>Я понял вас: у нас неправильно написанное приложение. Правильное -- оно, конешно, лучше было бы, и уж явно не такое, как мы написали — и сервер не грузило бы, и работало мгновенно, и ошибок не выдавыло б никогда.
Ну примерно так.
На самом деле при правильном написании с вашими нагрузками хватило бы одного аппсервера, и одни хороший сервак с БД без распределнных кешей.
G>>>>"Этого" ни в одной инфраструктуре. Подходов к кешированию по last-modified может быть много, и зависят они от сценариев использования данных. M>>>В NHibernate в кеше используется одна из разновидностей такого кеширования. Прямо "из коробки". G>>Каким образом? Без модификации базы просто так last-modified не натянешь. G>>При этом кешировать данные, возвращенные запросом — самый эффективный способ расходования памяти. M>Еще раз говорю, укажите мне на пункт, который говорит о критичности расхода памяти. Это не аргумент. M>А зачем для last-modified модифицировать БД? Отметки о модификации хранятся в системе кеширования.
Еще раз: эффективный кеш по last-modified делает очень простыми средствами, без крутого распределенного кеша.
M>>>>>Хм. Лично я не понимаю, зачем в каждой точке кода, где нужен кеш, думать, как этот кеш сделать. Грубо, если в сервисе А вам нужно N полей объекта, а в сервисе B -- N+2, то придется по новой продумать весь сервис кеширования. G>>>>Не надо ничего по новой продумывать, это все обобщенным кодом делается. Если стратегии кеширования не меняются, то и код не меняется. M>>>Думаю, что для каждого случая надо будет продумывать свою стратегию кеширования. Имхо это затратно. G>>Думать мозгом гораздо менее затратно, чем писать код. Код тяжелее выкинуть. M>А, я понял, что вы хотите сказать -- что когда мы писали ПО, мы не думали.
Может и думали, но не в том направлении.
M>Вы тоже любитель ставить диагнозы по фото?
Уже почти профессионал.
M>>>Мне не сложно запустить по сети несколько инстансов memcached (я это делаю менеджером memcahed, не вставая из-за компьютера). Мне кажется, приобрести лишние планки рамы -- это гораздо дешевле, чем сопровождать изощренные схемы кеширования. G>>Сам себе противоречишь. Распределенный кеш ораздо более сложен в использовани, чем кеширование по last-modified. M>Я не увидел противоречия. Сложен в использовании, если его писать самому и прочее. Тут он из коробки -- несколько параметров в config, и все работает.
Ну да, хороший способ не думать.
G>>Преимущество у него только в том, что его можно использовать дял всего. Только не факт что будет от этого толк. M>Факт есть -- у нас толк присутствует.
Значит он отсутвует в другом месте.
Re[40]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
M>>Я понял вас: у нас неправильно написанное приложение. Правильное -- оно, конешно, лучше было бы, и уж явно не такое, как мы написали — и сервер не грузило бы, и работало мгновенно, и ошибок не выдавыло б никогда. G>Ну примерно так. G>На самом деле при правильном написании с вашими нагрузками хватило бы одного аппсервера, и одни хороший сервак с БД без распределнных кешей.
Думаю, что вам виднее
G>>>При этом кешировать данные, возвращенные запросом — самый эффективный способ расходования памяти. M>>Еще раз говорю, укажите мне на пункт, который говорит о критичности расхода памяти. Это не аргумент. M>>А зачем для last-modified модифицировать БД? Отметки о модификации хранятся в системе кеширования. G>Еще раз: эффективный кеш по last-modified делает очень простыми средствами, без крутого распределенного кеша.
При чем здесь это? Если кеш уже есть и умеет делать last-modified, чего б его тогда не поюзать?
G>>>>>Не надо ничего по новой продумывать, это все обобщенным кодом делается. Если стратегии кеширования не меняются, то и код не меняется. M>>>>Думаю, что для каждого случая надо будет продумывать свою стратегию кеширования. Имхо это затратно. G>>>Думать мозгом гораздо менее затратно, чем писать код. Код тяжелее выкинуть. M>>А, я понял, что вы хотите сказать -- что когда мы писали ПО, мы не думали. G>Может и думали, но не в том направлении.
M>>Вы тоже любитель ставить диагнозы по фото? G>Уже почти профессионал.
M>>>>Мне не сложно запустить по сети несколько инстансов memcached (я это делаю менеджером memcahed, не вставая из-за компьютера). Мне кажется, приобрести лишние планки рамы -- это гораздо дешевле, чем сопровождать изощренные схемы кеширования. G>>>Сам себе противоречишь. Распределенный кеш ораздо более сложен в использовани, чем кеширование по last-modified. M>>Я не увидел противоречия. Сложен в использовании, если его писать самому и прочее. Тут он из коробки -- несколько параметров в config, и все работает. G>Ну да, хороший способ не думать.
Зачем писать велосипед?
G>>>Преимущество у него только в том, что его можно использовать дял всего. Только не факт что будет от этого толк. M>>Факт есть -- у нас толк присутствует. G>Значит он отсутвует в другом месте.
Все может быть. Например, у вас
Re[41]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
G>>>>При этом кешировать данные, возвращенные запросом — самый эффективный способ расходования памяти. M>>>Еще раз говорю, укажите мне на пункт, который говорит о критичности расхода памяти. Это не аргумент. M>>>А зачем для last-modified модифицировать БД? Отметки о модификации хранятся в системе кеширования. G>>Еще раз: эффективный кеш по last-modified делает очень простыми средствами, без крутого распределенного кеша. M>При чем здесь это? Если кеш уже есть и умеет делать last-modified, чего б его тогда не поюзать?
Не умеет он. А если умеет, то вносит дофига ограничений, которые сводят на нет все усилия.
M>>>>>Мне не сложно запустить по сети несколько инстансов memcached (я это делаю менеджером memcahed, не вставая из-за компьютера). Мне кажется, приобрести лишние планки рамы -- это гораздо дешевле, чем сопровождать изощренные схемы кеширования. G>>>>Сам себе противоречишь. Распределенный кеш ораздо более сложен в использовани, чем кеширование по last-modified. M>>>Я не увидел противоречия. Сложен в использовании, если его писать самому и прочее. Тут он из коробки -- несколько параметров в config, и все работает. G>>Ну да, хороший способ не думать. M>Зачем писать велосипед?
Распределенный кеш — это не велосипед, а паровой каток.
Вам же предлагают сделать несколько реактивных самолетов.
Re[42]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, meowth, Вы писали:
G>>>Еще раз: эффективный кеш по last-modified делает очень простыми средствами, без крутого распределенного кеша. M>>При чем здесь это? Если кеш уже есть и умеет делать last-modified, чего б его тогда не поюзать? G>Не умеет он. А если умеет, то вносит дофига ограничений, которые сводят на нет все усилия.
Странно, у меня умеет Расскажите про ограничения, а я расскажу, почему я их не встретил (по крайней мере в этом проекте)
M>>>>Я не увидел противоречия. Сложен в использовании, если его писать самому и прочее. Тут он из коробки -- несколько параметров в config, и все работает. G>>>Ну да, хороший способ не думать. M>>Зачем писать велосипед? G>Распределенный кеш — это не велосипед, а паровой каток. G>Вам же предлагают сделать несколько реактивных самолетов.
Вы не поняли. Rich и так предполагает наличие кеша. Я его и использую.
Re[43]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, meowth, Вы писали:
G>>>>Еще раз: эффективный кеш по last-modified делает очень простыми средствами, без крутого распределенного кеша. M>>>При чем здесь это? Если кеш уже есть и умеет делать last-modified, чего б его тогда не поюзать? G>>Не умеет он. А если умеет, то вносит дофига ограничений, которые сводят на нет все усилия. M>Странно, у меня умеет Расскажите про ограничения, а я расскажу, почему я их не встретил (по крайней мере в этом проекте)
Получение результатов запроса с аггрегатными значениями и кешированием по last-modified.
Пример: нужно получить на клиента только измененные с момента последнего обновления ордеры вместе с суммами их заказа.
M>>>>>Я не увидел противоречия. Сложен в использовании, если его писать самому и прочее. Тут он из коробки -- несколько параметров в config, и все работает. G>>>>Ну да, хороший способ не думать. M>>>Зачем писать велосипед? G>>Распределенный кеш — это не велосипед, а паровой каток. G>>Вам же предлагают сделать несколько реактивных самолетов. M>Вы не поняли. Rich и так предполагает наличие кеша. Я его и использую.
Выделеноое — офигенный недостаток. Для shared хостина не подходит вообще никак.
Кроме того требует достаточно много ресурсов.
Re[44]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>Получение результатов запроса с аггрегатными значениями и кешированием по last-modified. G>Пример: нужно получить на клиента только измененные с момента последнего обновления ордеры вместе с суммами их заказа.
Cached query + query filter, и все работает.
M>>Вы не поняли. Rich и так предполагает наличие кеша. Я его и использую. G>Выделеноое — офигенный недостаток. Для shared хостина не подходит вообще никак.
Если вы про ресурс памяти, то он недорогой сейчас. Лишние 8-16 Мб под кэш-память — это немного, можно позволить и на shared hosting даже внутрипроцессно. Кстати, там часто предлагают опцию memcached included 64M, даже на php-хостингах.
G>Кроме того требует достаточно много ресурсов.
Вы о чем? У нас 4 инстанса memcached на машине в режиме интенсивности выше среднего кушают в сумме 0,5-1,5% процессора максимум.
Z>Я например понял так, что вы хотите максимально быстрый сервер из возможных
Правильно поняли. Мне не нужно выполнения 100 однотипных запросов одновременно, на каждый из который уйдет по 2 минуты. Мне нужно выполнение одного запроса, но не дольше чем за 5 секунд
Z>В этой ветке пытаются понять в каких ситуациях какая модель помогает легче справляться с увеличением сложности проекта. Иногда говорят о том, как победить тормза которые вызывает использование принципа persistance ignorance.
Я не против пускай пытаются, чем смогу помогу со своей стороны.
Z>В мире гораздо больше задач в которых надо получить максимально дешевый, стабильно работающий и легко расширяемый сервер, чем задач получить сервер который рвет все остальные сервера по производительности.
Просто мое мнение, что когда говорят: "лучше еще один сервер докупим, чем программист поработает", это ни что иное как признание несостоятельности программиста и желание компании разработчика переложить свои проблемы на шею заказчика. Потому что секономили на работе одного программиста сегодня, а завтра потратились на новый сервак (который тоже не копейки стоит, и дай бог чтоб только один докупили, а не 10), потратились на создание комнаты под серверное хозяйство, потратились на квалифицированную поддержку серверов (при этом ей за каждый месяц платить надо), озадачились на тему сколь же теперь деталей нужно хранить в ЗИПе на все это хозяйство.
При этом исходя из моей практики, людям обычно пофигу на выполнение быстрых запросов 1-3 секунды и совсем не пофигу на выполнение тяжелых запросов от минуты и более. При этом тяжелые запросты выполняются нечасто, а когда вы после оптимизаций делаете скорость их выполнения хотя бы в два раза быстрее, пользователи начинают радоваться как малые дети. И начинают чаще пользоваться тяжелыми запросами, которых раньше старались избежать и просчитать аналитику в уме на авось. При том, что это ускорение давалось простым пересмотром полей на которые надо навесить индексы.
К тому же не всегда дело в быстродействии сервера. При получении данных с промышленных устройств, часто узким местом становиться канал передачи данных. Вот есть у вас подстанция где-то далеко в тайге, и на ней радиомодем. И вы хоть запакупайтесь серверов, но данные быстрее чем это позволяет модем вы с устройства подцепленного к нему не получите. В этом случае надо сидеть и тчательно вымерять алгоритм и формат передачи данных.
Я вполне понимаю, что это все сугубо мой персональный опыт и он может быть единичным из тысячи, но на основании его я считаю, что программист должен до конца отрабатывать свою работы, и не сваливать решение проблем с производительностью на докупку серверов.
П.С.: может сумбурно, но уже спать охото.
Z>Я например понял так, что вы хотите максимально быстрый сервер из возможных
Правильно поняли. Мне не нужно выполнения 100 однотипных запросов одновременно, на каждый из который уйдет по 2 минуты. Мне нужно выполнение одного запроса, но не дольше чем за 5 секунд
Z>В этой ветке пытаются понять в каких ситуациях какая модель помогает легче справляться с увеличением сложности проекта. Иногда говорят о том, как победить тормза которые вызывает использование принципа persistance ignorance.
Я не против пускай пытаются, чем смогу помогу со своей стороны.
Z>В мире гораздо больше задач в которых надо получить максимально дешевый, стабильно работающий и легко расширяемый сервер, чем задач получить сервер который рвет все остальные сервера по производительности.
Просто мое мнение, что когда говорят: "лучше еще один сервер докупим, чем программист поработает", это ни что иное как признание несостоятельности программиста и желание компании разработчика переложить свои проблемы на шею заказчика. Потому что секономили на работе одного программиста сегодня, а завтра потратились на новый сервак (который тоже не копейки стоит, и дай бог чтоб только один докупили, а не 10), потратились на создание комнаты под серверное хозяйство, потратились на квалифицированную поддержку серверов (при этом ей за каждый месяц платить надо), озадачились на тему сколь же теперь деталей нужно хранить в ЗИПе на все это хозяйство.
При этом исходя из моей практики, людям обычно пофигу на выполнение быстрых запросов 1-3 секунды и совсем не пофигу на выполнение тяжелых запросов от минуты и более. При этом тяжелые запросты выполняются нечасто, а когда вы после оптимизаций делаете скорость их выполнения хотя бы в два раза быстрее, пользователи начинают радоваться как малые дети. И начинают чаще пользоваться тяжелыми запросами, которых раньше старались избежать и просчитать аналитику в уме на авось. При том, что это ускорение давалось простым пересмотром полей на которые надо навесить индексы.
К тому же не всегда дело в быстродействии сервера. При получении данных с промышленных устройств, часто узким местом становиться канал передачи данных. Вот есть у вас подстанция где-то далеко в тайге, и на ней радиомодем. И вы хоть запакупайтесь серверов, но данные быстрее чем это позволяет модем вы с устройства подцепленного к нему не получите. В этом случае надо сидеть и тчательно вымерять алгоритм и формат передачи данных.
Я вполне понимаю, что это все сугубо мой персональный опыт и он может быть единичным из тысячи, но на основании его я считаю, что программист должен до конца отрабатывать свою работы, и не сваливать решение проблем с производительностью на докупку серверов.
П.С.: может сумбурно, но уже спать охото.
Здравствуйте, ilvi, Вы писали:
I>Я вполне понимаю, что это все сугубо мой персональный опыт и он может быть единичным из тысячи, но на основании его я считаю, что программист должен до конца отрабатывать свою работы, и не сваливать решение проблем с производительностью на докупку серверов.
У программиста должны быть приоритеты, расстановка которых зависит не только от желаний, возможностей и персонального опыта онного.
Re[31]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ocenochka, Вы писали: O> А что на счет PI?
PI — то, что его поклонники называют Perstistence Ignorance, а противники — Persistent Ignorance.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Ziaw, Вы писали:
Z>Пример из практики, при переводе на клиент-сервер одной из систем сделали из рич модели тощую, руководствуясь примерно теми же мотивами, что и ты декларируешь. Ядро логики мне не удалось изолировать так же хорошо как и в жирной, хотя я проектировал ее на три года позже чем жирную (смею надеяться, что за три года в голове прибавилось ). Реюз кода уменьшился и, как я ни старался, сейчас требуется намного больше знаний о системе для написания новой логики. Сейчас я уже не так уверен, что решение проблем рич модели было бы дороже. И уж точно не сомневаюсь в праве рич моделей на жизнь.
О, прекрасно. Давайте поговорим об этом примере — нужно же понять, где неотъемлемые проблемы анемика, а где неправильная готовка. А то на вымышленных примерах обе стороны могут биться сколько угодно. Это сродни диалогу "а я брата приведу" — "а я двух двоюродных". При том что оба оппонента сироты.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Ziaw, Вы писали:
Z>>Пример из практики, при переводе на клиент-сервер одной из систем сделали из рич модели тощую, руководствуясь примерно теми же мотивами, что и ты декларируешь. Ядро логики мне не удалось изолировать так же хорошо как и в жирной, хотя я проектировал ее на три года позже чем жирную (смею надеяться, что за три года в голове прибавилось ). Реюз кода уменьшился и, как я ни старался, сейчас требуется намного больше знаний о системе для написания новой логики. Сейчас я уже не так уверен, что решение проблем рич модели было бы дороже. И уж точно не сомневаюсь в праве рич моделей на жизнь. S>О, прекрасно. Давайте поговорим об этом примере — нужно же понять, где неотъемлемые проблемы анемика, а где неправильная готовка. А то на вымышленных примерах обе стороны могут биться сколько угодно. Это сродни диалогу "а я брата приведу" — "а я двух двоюродных". При том что оба оппонента сироты.
Мнк сложно описать эти проблемы не приводя в пример килобайты кода, схему данных, требования. Вполне возможно это неправильная готовка. Некоторые проблемы с реюзом запросов мог бы решить linq, но мне нужна поддержка oracle и firebird, так что как орм он не может быть использован.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[11]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
Z>Мнк сложно описать эти проблемы не приводя в пример килобайты кода, схему данных, требования. Вполне возможно это неправильная готовка. Некоторые проблемы с реюзом запросов мог бы решить linq, но мне нужна поддержка oracle и firebird, так что как орм он не может быть использован.
А, ну тогда спорить не о чем. Без linq анемика начинает очень жестко сосать — ей нужен адекватный язык для выражения запросов. Рич модель обходит эту тему с тыла, предлагая навигацию+LL.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
Z>>Мнк сложно описать эти проблемы не приводя в пример килобайты кода, схему данных, требования. Вполне возможно это неправильная готовка. Некоторые проблемы с реюзом запросов мог бы решить linq, но мне нужна поддержка oracle и firebird, так что как орм он не может быть использован. S>А, ну тогда спорить не о чем. Без linq анемика начинает очень жестко сосать — ей нужен адекватный язык для выражения запросов. Рич модель обходит эту тему с тыла, предлагая навигацию+LL.
Если в линк будут добавлены DML операции и провайдеры хотя бы к Oracle и DB2, а лучше к большинству промышленных RDBMS true anemic model будет очень и очень хороша. Я бы даже придумал ей другое название, чтобы отличать от ADM которая не RDM лишь по признаку отсутствия логики в классах. Предлагаю Data Centric Domain Model (DCDM).
Мне очень нравится подход, работы напрямую с базой, где объекты модели лишь выполняют функцию DTO.
Впрочем если nh2linq наконец переделают на генерацию AST SQL вместо генерации критериев, к нему будет иметь смысл прикрутить те же DML и использовать stateless session. В итоге получим crossDb и crossCache из коробки, плюс богатый мэппинг. (про нужность кеша и мэппинга можно не возражать, я знаю твое мнение
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[13]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
Z>Если в линк будут добавлены DML операции и провайдеры хотя бы к Oracle и DB2, а лучше к большинству промышленных RDBMS true anemic model будет очень и очень хороша. Я бы даже придумал ей другое название, чтобы отличать от ADM которая не RDM лишь по признаку отсутствия логики в классах. Предлагаю Data Centric Domain Model (DCDM).
Ну, надежда на это велика весьма есть — см. опять же на IQToolkit.
Z>Мне очень нравится подход, работы напрямую с базой, где объекты модели лишь выполняют функцию DTO.
Z>Впрочем если nh2linq наконец переделают на генерацию AST SQL вместо генерации критериев, к нему будет иметь смысл прикрутить те же DML и использовать stateless session. В итоге получим crossDb и crossCache из коробки, плюс богатый мэппинг. (про нужность кеша и мэппинга можно не возражать, я знаю твое мнение
Автор linq2hn прямо сейчас полощет мозг команде С# (на пару с автором linq2llblgen) насчёт умения правильно готовить. По сравнению с этими парнями VladD2 — просто синоним галантности. Я бы предложил ему заняться "переделкой на генерацию AST SQL", но боюсь попасть под горячую руку.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
S>Автор linq2hn прямо сейчас полощет мозг команде С# (на пару с автором linq2llblgen) насчёт умения правильно готовить. По сравнению с этими парнями VladD2 — просто синоним галантности.
Ayende? Тоже требует ввода присваивания в экспрешены?
S>Я бы предложил ему заняться "переделкой на генерацию AST SQL", но боюсь попасть под горячую руку.
Прошу прощения, AST HQL, иначе никакого crossDb не выйдет. Парсер hql теперь генерит AST HQL, вместо генерации сиквела, так что принципиальная возможность генерации его же из експрешенов уже есть.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[15]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
Z>Прошу прощения, AST HQL, иначе никакого crossDb не выйдет. Парсер hql теперь генерит AST HQL, вместо генерации сиквела, так что принципиальная возможность генерации его же из експрешенов уже есть.
Поясню, раньше развитие linq2nh уперлось в плохо расширяемый и неполный синтаксис ICriteria (QueryObject by hibernate). Я даже сам пытался переделать провайдер на генерацию hql, но генерация текста малоприятное занятие и, оценив объем, я отказался от продолжения. Теперь можно генерить hql в виде дерева выражений, так что я очень надеюсь, что преобразователь ExressionTree -> HqlTree не за горами.
В свете введения update & delete в hql DML будет сделать не слишком сложно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[15]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
Z>Ayende? Тоже требует ввода присваивания в экспрешены?
Проще, они просят MS поделиться опытом написания LINQ провайдеров. Как выясняется — вообще нифига не тривиальная штука, по разным причинам.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Мы уже победили, просто это еще не так заметно...
Re[16]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, IB, Вы писали:
IB>Проще, они просят MS поделиться опытом написания LINQ провайдеров. Как выясняется — вообще нифига не тривиальная штука, по разным причинам.
Даже реверс инженеринг кода не помогает? Черт, плохие новости
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[17]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, IB, Вы писали:
IB>>Проще, они просят MS поделиться опытом написания LINQ провайдеров. Как выясняется — вообще нифига не тривиальная штука, по разным причинам.
Z>Даже реверс инженеринг кода не помогает? Черт, плохие новости
А сам не пробововал?
Я вот сгоряча полез Linq2SQL реверсинженирить, захотел найти какой-нить способ DML туда прикрутить.
Забросил быстро, много там всего.
Re[18]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, gandjustas, Вы писали:
G>А сам не пробововал?
Реверсить не пробовал, пробовал писать свой провайдер для HQL.
Основные проблемы были в том, что идет генерация текста, а не другого expression tree, решал генерацией промежуточного ET, по которому генерил текст. Основная проблема — много там всего, одному мне не поднять. У линка есть офигенный слой генерации сиквела который уже есть в NH, обкатан и работает. Поэтому провайдер должен быть проще чем сам линк.
G>Забросил быстро, много там всего.
Ага, но этож не концептуальная проблема. Тем более им не нужен слой генерации сиквела, может быть он там размазан?
... << RSDN@Home 1.2.0 alpha 4 rev. 1176>>
Re[7]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали: M>Да. Там 9 страниц, со второй начинается интересное: "The Cost of GUIDs as Primary Keys", http://www.informit.com/articles/article.aspx?p=25862
Полная херня. Интересное начинается с седьмой, и на ней же и заканчивается.
1. Как показал чувак, при чтениях GUID проигрывает всего 10% по сравнению с интом. Это, скорее, аргумент в пользу, чем против.
2. Падение производительности в 10 раз на вставках ничего не показывает. Поясняю почему:
2.1. отношение размера ключа к размеру данных фантастически велико — он сам это признаёт.
2.2. эксперимент ставился в условиях "один клиент хреначит много данных". Конечно же, в этом случае разбрасывание PK по разным страницам даст негативный эффект. В реальной жизни, где вставка ведется во многих параллельных транзакциях, это даст обратный эффект — благодаря тому, что блокировки будут более равномерно размазаны по страницам.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали:
M>Ой-ёй, только не guid =) Он слишком рандомный; это убивает индекс, и MS-SQL плохо на них реагирует (низкой производительностью).
Ничего подобного. С производительностью все хорошо и с индексами тоже, если в реальной жизни пользоваться а не синтетические тесты гонять.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Мы уже победили, просто это еще не так заметно...
Re[8]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, Sinclair, Вы писали:
S>Полная херня.
Постараюсь запомнить этот аргумент как довод более опытного разработчика, спасибо.
S>Интересное начинается с седьмой, и на ней же и заканчивается. S>1. Как показал чувак, при чтениях GUID проигрывает всего 10% по сравнению с интом. Это, скорее, аргумент в пользу, чем против.
Безотносительно остального окружения, то, что он проигрывает -- это плюс? Поясните в этом контексте, пожалуйста.
S>2. Падение производительности в 10 раз на вставках ничего не показывает. Поясняю почему: S>2.1. отношение размера ключа к размеру данных фантастически велико — он сам это признаёт.
Т.е. вы априори считаете, что дело просто в размере пакета с данными (guid "ширше"), так?
S>2.2. эксперимент ставился в условиях "один клиент хреначит много данных". Конечно же, в этом случае разбрасывание PK по разным страницам даст негативный эффект. В реальной жизни, где вставка ведется во многих параллельных транзакциях, это даст обратный эффект — благодаря тому, что блокировки будут более равномерно размазаны по страницам.
Ваша правда в рассуждениях, и на ней я основывался, когда пояснял, что "guid.comb" как алгоритм лучше, чем sequence распределяет блокировки, но не бросается хаотически по страницам, как чистый guid.
Также в правильно организованной сесси NHibernate вставка осуществляется "пачкой" (в commitе), в этом случае появляется как раз ситуация "клиент хреначит многоданные". Использование guid.comb здесь имхо оправдано как по сравнению с sequence, так и с original guid.
Re[9]: Архитектура приложения с несколькими клиентами и одни
Здравствуйте, meowth, Вы писали: S>>Полная херня. M>Постараюсь запомнить этот аргумент как довод более опытного разработчика, спасибо.
Это не довод. Это тезис, который аргументируется далее по ходу поста.
M>Безотносительно остального окружения, то, что он проигрывает -- это плюс? Поясните в этом контексте, пожалуйста.
Поясняю: четырёхкратное увеличение размера ключа приводит всего лишь к 10% проигрышу в производительности, при значительном увеличении удобства использования. Вот это увеличение трудно измерить; каждый делает выводы для себя. Если лично в вашем случае GUID будет удобнее INT хотя бы на 15% — то этот эксперимент явно свидетельствует в его пользу.
M>Т.е. вы априори считаете, что дело просто в размере пакета с данными (guid "ширше"), так?
Нет, я априори считаю, что в данных условиях роль индекса при вставке чрезмерна — по сравнению с реальным сценарием. Поэтому любые замедления, связанные с индексом, очень сильно отражаются на общем результате. В реальных сценариях вставка данных будет весить больше, и замедление индексных вставок будет не столь заметным.
M>Ваша правда в рассуждениях, и на ней я основывался, когда пояснял, что "guid.comb" как алгоритм лучше, чем sequence распределяет блокировки, но не бросается хаотически по страницам, как чистый guid.
Я не уверен, что цена в реальных сценариях будет настолько высока, чтобы оправдать приседания с самостоятельной генерацией GUID. Лично мне вот неочевидно, где гарантии уникальности сформированного таким образом GUID. M>Также в правильно организованной сесси NHibernate вставка осуществляется "пачкой" (в commitе), в этом случае появляется как раз ситуация "клиент хреначит многоданные". Использование guid.comb здесь имхо оправдано как по сравнению с sequence, так и с original guid.
NHibernate мог бы в таких случаях переходить на UuidCreateSequential и иметь гарантии как уникальности, так и упорядоченности, безо всяких наколенных "алгоритмов".
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
S>Поясняю: четырёхкратное увеличение размера ключа приводит всего лишь к 10% проигрышу в производительности, при значительном увеличении удобства использования. Вот это увеличение трудно измерить; каждый делает выводы для себя. Если лично в вашем случае GUID будет удобнее INT хотя бы на 15% — то этот эксперимент явно свидетельствует в его пользу.
Так я и не спорю. При выборе между типом поля для Id из guid и int я выберу guid, мне тоже так удобнее.Мне только не нравится алгоритм генерации.
S>Я не уверен, что цена в реальных сценариях будет настолько высока, чтобы оправдать приседания с самостоятельной генерацией GUID. Лично мне вот неочевидно, где гарантии уникальности сформированного таким образом GUID.
Никаких приседаний, Nhibernate занимается им самостоятельно.
Гарантия уникальности основана на следующем:
Пример:
E25AFE33-DB2D-4502-9BF0-919001862D20
83E689D3-8549-4094-B223-919001862D20
CC22A56D-0CD5-43C5-990E-919001862D20
D5149998-1718-468C-B1AD-919001862D20
CBD0182D-4A0E-40AC-9A4C-919001862D20
Левые 20 16ричных разрядов уникальны, т.е. вероятность их повторения 1/(16^20) = 8.3e-25.
С другой стороны, новый полностью уникальный guid (левая часть) не может генериться чаще, чем примерно 300 в секунду. Т.е. для того, чтобы получить неуникальный uid, нужно вставить не менее, чем 8.3e-25 * 300 = ~2.5e19 записей в секунду.
Как-то так.
S>NHibernate мог бы в таких случаях переходить на UuidCreateSequential и иметь гарантии как уникальности, так и упорядоченности, безо всяких наколенных "алгоритмов".
В таком случае есть следующая проблема: если мы перекладываем генерацию uid на БД, то а) мы обязаны вставлять записи по одной (увеличивая количество round-trips) и подтягивать потом Id назад в ORM (через SCOPE_IDENTITY()) б) смысл UoW теряется, потому что мы обязаны вставлять записи сразу, как только мы их добавили в UoW, а также держать открытой транзакцию (на случай, если захотим откатить) дольше, чем если бы это делалось batch insert.
Здравствуйте, meowth, Вы писали:
M>Никаких приседаний, Nhibernate занимается им самостоятельно.
M>Гарантия уникальности основана на следующем: M>Пример: M>E25AFE33-DB2D-4502-9BF0-919001862D20 M>83E689D3-8549-4094-B223-919001862D20 M>CC22A56D-0CD5-43C5-990E-919001862D20 M>D5149998-1718-468C-B1AD-919001862D20 M>CBD0182D-4A0E-40AC-9A4C-919001862D20 M>Левые 20 16ричных разрядов уникальны, т.е. вероятность их повторения 1/(16^20) = 8.3e-25.
Это хреновая гарантия. Вообще, все алгоритмы генерации GUID хорошо известны и тщательно продуманы. Для них известны некоторые свойства. Мне не нравится идея переходить от обоснованных алгоритмов к самописаным без должного основания. Нет, я понимаю, что это не магия, но тем не менее.
S>>NHibernate мог бы в таких случаях переходить на UuidCreateSequential и иметь гарантии как уникальности, так и упорядоченности, безо всяких наколенных "алгоритмов".
M>В таком случае есть следующая проблема: если мы перекладываем генерацию uid на БД, то а) мы обязаны вставлять записи по одной (увеличивая количество round-trips) и подтягивать потом Id назад в ORM (через SCOPE_IDENTITY()) б) смысл UoW теряется, потому что мы обязаны вставлять записи сразу, как только мы их добавили в UoW, а также держать открытой транзакцию (на случай, если захотим откатить) дольше, чем если бы это делалось batch insert.
Ничего не понимаю. Зачем нам перекладывать генерацию на БД? Основное преимущество GUID — возможность распределённой генерации. Ну так и надо им пользоваться. Пусть гибернейт не страдает фигнёй, а пользует документированный UuidCreateSequential().
M>Кроме того, в MsSQL2005 и MsSQL2008 SCOPE_IDENTITY() и @@INDETITY() слегка "поломатые". https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
Это вообще не имеет отношения к проблемам GUID.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
S>Ничего не понимаю. Зачем нам перекладывать генерацию на БД? Основное преимущество GUID — возможность распределённой генерации. Ну так и надо им пользоваться. Пусть гибернейт не страдает фигнёй, а пользует документированный UuidCreateSequential().
Не волнуйтесь, это тоже поддерживается.
Хотя, согласно вашим рассуждениям, это в реальности ни на что не влияет, у меня тем не менее вопрос -- насколько такой guid будет index-friendly?
M>>Кроме того, в MsSQL2005 и MsSQL2008 SCOPE_IDENTITY() и @@INDETITY() слегка "поломатые". https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811 S>Это вообще не имеет отношения к проблемам GUID.
Это имело отношение к предположению, что ведется выборка сгенерированного uid'а из БД, которое оказалось преждевременным
Re[13]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали: M>Хотя, согласно вашим рассуждениям, это в реальности ни на что не влияет, у меня тем не менее вопрос -- насколько такой guid будет index-friendly?
В той же статье на той же странице приведен листинг 3. Это и есть те GUID, которые возвращаются UuidCreateSequential(). Именно их пытается эмулировать автор статьи при помощи наколеночного алгоритма.
M>Это имело отношение к предположению, что ведется выборка сгенерированного uid'а из БД, которое оказалось преждевременным
Обе функции не имеют никакого отношения к выборке сгенерированного UID из БД.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
M>>Хотя, согласно вашим рассуждениям, это в реальности ни на что не влияет, у меня тем не менее вопрос -- насколько такой guid будет index-friendly? S>В той же статье на той же странице приведен листинг 3. Это и есть те GUID, которые возвращаются UuidCreateSequential(). Именно их пытается эмулировать автор статьи при помощи наколеночного алгоритма.
Вопрос остается в силе. Обратите, пожалуйста, внимание на то, чем отличаются эти серии guidов. В предыдущем постах и вы, и я согласились, что sequential-like uuid плохо дружит с блокировками в параллельных транзакциях. Это именно то, что мы видим в UuidSequential.
Guid.Comb:
E25AFE33-DB2D-4502-9BF0-919001862D20
83E689D3-8549-4094-B223-919001862D20
CC22A56D-0CD5-43C5-990E-919001862D20
D5149998-1718-468C-B1AD-919001862D20
CBD0182D-4A0E-40AC-9A4C-919001862D20
M>>Это имело отношение к предположению, что ведется выборка сгенерированного uid'а из БД, которое оказалось преждевременным S>Обе функции не имеют никакого отношения к выборке сгенерированного UID из БД.
Извините мою непонятливость, но хотелось бы услышать, каким образом вы выбирали бы только что сгенерированный базой identity (в предположении, что uuid генерятся базой)
Re[15]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали:
M>Вопрос остается в силе. Обратите, пожалуйста, внимание на то, чем отличаются эти серии guidов. В предыдущем постах и вы, и я согласились, что sequential-like uuid плохо дружит с блокировками в параллельных транзакциях. Это именно то, что мы видим в UuidSequential.
M>UuidCreateSequential: M>B3BFC6B1-05A2-11D6-9FBA-00C04FF317DF M>B3BFC6B2-05A2-11D6-9FBA-00C04FF317DF M>B3BFC6B3-05A2-11D6-9FBA-00C04FF317DF M>B3BFC6B4-05A2-11D6-9FBA-00C04FF317DF M>B3BFC6B5-05A2-11D6-9FBA-00C04FF317DF
M>Guid.Comb: M>E25AFE33-DB2D-4502-9BF0-919001862D20 M>83E689D3-8549-4094-B223-919001862D20 M>CC22A56D-0CD5-43C5-990E-919001862D20 M>D5149998-1718-468C-B1AD-919001862D20 M>CBD0182D-4A0E-40AC-9A4C-919001862D20
Гм. Еще раз читаем статью.
Then I found out that it wasn't the first (high) byte that was important for the new ordering, but the last (low) bytes
.
Парень добился улучшения, генерируя одинаковые правые байты, что выполняется и для sequential гуидов — там MAC адрес платы клиента.
S>>Обе функции не имеют никакого отношения к выборке сгенерированного UID из БД. M>Извините мою непонятливость, но хотелось бы услышать, каким образом вы выбирали бы только что сгенерированный базой identity (в предположении, что uuid генерятся базой)
Я, конечно, давно ничего не писал на SQL, но по-памяти будет примерно так:
create table mytable
(
ID uniqueidentifier not null primary key default (NEWID()),
varchar(max) Name
)
GO
insert into mytable(Name) values('Пётр Cаныч') output inserted.ID
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, Sinclair, Вы писали:
S>Гм. Еще раз читаем статью. S>
Then I found out that it wasn't the first (high) byte that was important for the new ordering, but the last (low) bytes
. S>Парень добился улучшения, генерируя одинаковые правые байты, что выполняется и для sequential гуидов — там MAC адрес платы клиента.
Ладно, в любом случае надо будет тестировать этот вопрос в ситуации с "многотранзакций", чтобы детально ответить на вопрос о частоте коллизий при блокировках у обоих алгоритмов.
S>Я, конечно, давно ничего не писал на SQL, но по-памяти будет примерно так: S>
S>create table mytable
S>(
S> ID uniqueidentifier not null primary key default (NEWID()),
S> varchar(max) Name
S>)
S>GO
S>insert into mytable(Name) values('Пётр Cаныч') output inserted.ID
S>
К сожалению, MsSQL >= 2005.
Re[17]: Архитектура приложения с несколькими клиентами и одн
Здравствуйте, meowth, Вы писали: M>Ладно, в любом случае надо будет тестировать этот вопрос в ситуации с "многотранзакций", чтобы детально ответить на вопрос о частоте коллизий при блокировках у обоих алгоритмов.
А, да, точно — мы же говорим об апп.сервере; тогда, действительно, начнутся коллизии из-за постоянства правых частей. Техника будет нормально работать для двузвенки. В трёхзвенке надо мерить всё отдельно.
M>К сожалению, MsSQL >= 2005.
Ну для < 2005 этот синтаксис и не работает.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.