|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobмоя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставьЕсли писать код, не задумываясь о взаимодействиях и возможных блокировках (как это обычно и происходит), тогда да. Лично мне Ваш подход вполне себе понравился. Однако, существуют методы написания и тестирования именно параллельных процессов, и если грамотно распараллелить процессы, то можно получить вместо дополнительных проблем дополнительный выигрыш. Одна точка зрения предпочитает вполне обоснованно обходить возможные трудно выявляемые проблемы с блокировками, а не бороться с ними. Эта точка зрения мне вполне понятна, когда нужно получить достаточно быстро результат, который не заведет в тупик. Другая точка зрения - управлять блокировками при распараллеливании. Такой подход более рискованный, но позволяет получить более качественное решение, правда, более серьезными усилиями и более высокими затратами времени (как правило). Возможно, приверженец этого подхода имеет настолько большой опыт, что научился видеть проблемы параллельной обработки данных на стадии написания кода и может грамотно их разруливать на этой стадии. А возможно он недооценивает риски такого подхода, тут мне трудно судить. По-моему, в принципе оба подхода имеют право на жизнь. ПМСМ, ваш спор - о предпочтениях. Кстати, о параллелизме. Существует очень классная нотация именно для параллельных процессов - BPMN. Изначально она нацелена на распараллеливание именно бизнес -процессов, но по-моему, идеи, которые в нее заложены, позволяют на ее основе реализовать также визуальное программирование любых параллельных процессов. В такой нотации лично мне были бы совершенно не страшны блокировки и иные проблемы параллельной обработки - они очень красиво в ней разруливаются. Так что обобщать, ПМСМ, не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 17:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Добрый день Много лет эксплуатировал и дорабатывал систему, в которой работа с резервами строилась на основе механизмов уровней изоляции и блокировок на уровне SQL сервера(sybase). Собственно в SQL серверах эти механизмы для таких задач и сделаны. Не скажу что была высоко нагруженная, но около 130 человек в ней постоянно молотили продажи товаров с нескольких складов с резервированием, с обменом резервами, с переносом резервом при перемещении между складами и т.п. Никаких ошибок(резервы потерялись, резервы выше чем склад и т.п.) и тормозов не наблюдалось при работе с резервами. Никто ничего специально не параллелил. Каждая транзакция запускалась в своей сессии на SQL сервере по мере необходимости. + постоянно шло обращение к данным по складам для рассылки клиентам, интернет магазина, отчетам и т.п. Глобальными переделками резервов занимались автоматы по ночам через те же процедуры с транзакциями(для оптимизации логистики, чтобы товар не гонять между складами), но и при этом в системе работали удаленно люди и тоже все было нормально. Были и удаленные склады в системе(базы разнесены и в репликации). Резервировали через заявки на резервирование на удаленном складе, которая посылалась в другую базу и в результате устанавливался/не устанавливался резерв. Прочитав пост, засомневался, сложилось мнение что так было делать нехорошо. Надо было все последовательно делать(резервирование по очереди), т.к. уровни изоляции "не решают". Или запускать постоянно процедуру пересчета резервов по всем заказам с очисткой старых. Или все это обсуждается чисто в рамках 1С или NAV, в которых какие-то проблемы с этим по каким-то своим причинам? Тогда извиняюсь, просто автор просил поделится у кого как в других системах. Я конечно понимаю, что если хочется полного автомата резервирования, который очень умный и прямо в момент резервирования будет анализировать остатки, продажи, коэффициенты реализации резервов, ограничения на суммы, на лету оптимизировать резервы, где лучше зарезервировать и т.п., то алгоритм внутри транзакции будет очень сложным и эта транзакция может всех держать. Но так транзакции не стоит писать, транзакции с блокировками должны быть быстрыми. Тогда можно по другому - быстро в транзакции зарезервировать где получится максимально быстро, а потом запускать параллельно процесс оптимизации. Неужели у автора надо резервы оптимизировать постоянно, при каждом событии на товаре? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 18:45 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobразумеется, я названия перепутал однако сути это не меняет, мы ж не о блокировках спорили, а о некорректности параллельного резервирования моя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставь Резервирование товара "Гвозди" никак не влияет на процесс резервирования товара "Молотки", и эти два процесса могут выполняться параллельно без плачевных результатов . Но тут как раз важен уровень изоляции. Если мы используем Read uncommitted, то при ошибках в алгоритме у нас будут некорректные данные в системе. А вот при уровне SERIALIZABLE часть ошибок (не все!!!) отловит и предотвратит СУБД. В частности, СУБД сможет предотвратить большую часть ошибок, связанных с одновременной работой многих пользователей, в том числе с параллельным резервированием. Да, мы можем получить блокировки (и тормоза) при неоптимальном алгоритме. Но тормоза мы заметим сразу, и сразу же сможем их исправить. А логические ошибки резервирования часто сразу не видны. Я знаю примеры, когда фирмы годами работали с системой, в которой регулярно возникали ошибки резервирования. И не исправляли их как раз потому, что воспроизвести и локализовать ошибку, возникающую именно при параллельной работе пользователей, очень сложно. Последовательное резервирование имеет большой плюс - проще реализовать корректную логику работы. Но, к сожалению, при росте фирмы (больше магазинов, сотрудников, заказов) не всегда возможно придерживаться строго последовательного вычисления резервов - расчет резервов начинает сильно тормозить и становится узким местом. И приходится параллелить расчет резервов и использовать прочие хитрости, чтобы ускорить расчет резервов. Разумеется, всё сильно зависит от специфики бизнеса. В некоторых случаях резервирование в течении 20-30 минут - вполне приемлемо, а в других случаях 10 секунд - уже очень долго и необходимо ускорять. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 18:50 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
GaryaКстати, о параллелизме. Существует очень классная нотация именно для параллельных процессов - BPMN. Изначально она нацелена на распараллеливание именно бизнес -процессов, но по-моему, идеи, которые в нее заложены, позволяют на ее основе реализовать также визуальное программирование любых параллельных процессов. В такой нотации лично мне были бы совершенно не страшны блокировки и иные проблемы параллельной обработки - они очень красиво в ней разруливаются. Я бы разделял понятия бизнес-процесс и бизнес-операция, т.к. бизнес-процесс, как правило, состоит из нескольких бизнес-операций, которые выполняются в различных транзакциях.Бизнес-операция, на мой взгляд, это набор действий выполняемых в пределах одной транзакции. Конкурируют за свободные ресурсы именно бизнес-операции, например, при установке резерва конкурентным ресурсом является свободное количество товара. Поэтому мне не понятно, как BPMN поможет "разрулить" конкуренцию за ресурсы. Мы в системе Oremax широко используем возможности СУБД для разрешения конкуренции бизнес-операций за ресурсы - транзакционный механизм. Для увеличения производительности мы рекомендуем нашим клиентам использовать уровень изоляции транзакций Read Commited. Параноики могут использовать и более жёсткие уровни. При этом, для надёжности функционирования мы внутри транзакций предварительно блокируем записи, которые будут изменены в процессе работы. Например, если говорить о резервировании, то у нас есть таблица сводной информации о количестве свободного товара на складе и количестве резерва в разрезе Номенклатура+Склад, в которой мы блокируем записи перед началом резервирования. Поскольку задания (запросы) на резервирование поступают постоянно от разных пользователей, то, естественно, возникает конкуренция, которую "разруливает" СУБД за счёт своего тразакционного механизма. s_ustinov, мне кажется, что вы излишне усложняете алгоритм. Задачу резервирования мы решили другим способом, при том, что система может работать при оффлайновых репликациях. Я не знаю насколько наш подход применим для вас, т.к. Oremax не имеет ничего общего ни с 1С ни с MS Dynamics. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 19:08 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
antand, привет!!!! antand, будучи пользователем Oremax, описал своё впечатление о её работе :-). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 19:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxЯ бы разделял понятия бизнес-процесс и бизнес-операция, т.к. бизнес-процесс, как правило, состоит из нескольких бизнес-операций, которые выполняются в различных транзакциях.Бизнес-операция, на мой взгляд, это набор действий выполняемых в пределах одной транзакции. Конкурируют за свободные ресурсы именно бизнес-операции, например, при установке резерва конкурентным ресурсом является свободное количество товара. Поэтому мне не понятно, как BPMN поможет "разрулить" конкуренцию за ресурсы.В BPMN имеется собственное понятие "длинной транзакции" (или "бизнес-транзакции"). В отличие от "короткой" СУБД-шной транзакции такие транзакции, в соответствии с их концепцией, могут длиться месяцами. Однако, такие транзакции реализуются без взаимных блокировок. Каким образом? Таким, что нотация предполагает доступ к данным иных выполняющихся в данный момент экземпляров процесса. Из любого экземпляра процесса (транзакции) можно получить доступ к данным других экземплярам как этого же самого процесса, так и других процессов, определить, какие данные наиболее приоритетны в данный момент для каких процессов и "разрулить" конфликты доступа несколькими разными способами, которые на уровне СУБД выглядели бы как "низкоуровневые". В частности, откат "длинной транзакции" может быть осуществлен не "на полном автомате" возвратом всех данных в исходное состояние на момент "до транзакции", но и явно указанными действиями, которые могут корректировать и/или дополнять механизм отката по умолчанию. Обращение к данным может быть организовано с использованием механизма "событий" которые обрабатываются от многих совершенно разных процессов единообразно, если эти процессы обращаются к дефицитным ресурсам, например, с помощью "самодельных очередей", которые реализуются отдельными подпроцессами, к которым обращаются все остальные процессы, которым может потребоваться дефицитный ресурс. И тут уже только от фантазии и профессионализма разработчика зависит, как реализовать механизмы разруливания различных конфликтов. Важно, что эти механизмы открыты, их можно делать самим, оперируя не "таблицами", "строками", "индексами" и иными объектами концепции СУБД и "данностью" в виде правил ACID, а можно самому явно прописать механизмы блокировок при обращении к данным из разных процессов и с разными целями. Кажется, что это делает разработку более низкоурвневой. С одной стороны это действительно так. С другой стороны, нотация BPMN имеет специальные средства для распараллеливания потоков данных и потоков управления, сбора "пучка потоков" в один поток, взаимодействия различных потоков между собой посредством сигналов или сообщений. Посредством этой нотации можно совмещать довольно сложные участки обработки данных, которые требуют отчасти строго-последовательной обработки, а местами допускают распараллеливание. Легко и просто делается "пообъектная" обработка, которую можно выполнить для коллекции объектов либо путем "последовательного перебора" объектов, либо созданием отдельного экземпляра процесса для каждого объекта, требующего обработки. Потому такая нотация, если ею заменяется "программирование вообще" может творить чудеса. Все эти "мютексы", "сигналы", "сообщения", которые есть в операционной системе - это классно, но где они в языках высокого уровня? Их нет! Нужно писать код с использованием древнего "последовательного" алгоритмического подхода, а взаимодействие параллельных процессов рисовать где-то отдельно на бумажке или пытаться впихнуть в мозг до получения вывиха мозга. Удобных средств визаулизации параллельного программирования, параллельных алгоритмов - не было. Пока не появился BPMN. В нем реализованы революционные идеи. Разработчик, глядя на схему процессов, "проваливаясь" в детализацию схемы (детализируя, выполняя декомпозицию), либо выходя на верхний уровень, может одновременно наблюдать и удобно укладывать у себя в голове множество совершенно разных процессов, выполняющихся в разных ритмах, имеющих множество экземпляров каждый, но при этом взаимодействующих таким образом, что это взаимодействие не выносит мозг. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 20:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobПрограммист 1спропущено... Все так плохо? ps Предыдущие 3 системы wms (не 1с) уже провалились... Акселотовскую ВМСку я внедрял в 2009 году в Альбе (обувь, опт и розница)...ну внедрили и внедрили, работало нормально ))) там главное подробно прописать весь необходимый функционал, а то у акселотов всегда оказывается, что если надо добавить небольшую фичу, например инвентаризацию, то для этого якобы полсистемы надо переворошить и данные перезаливать, потому что потому. и инструментария админского там нету от слова совсем....типа откатить кривую транзакцию только вручную тыком по регистрам...пришлось самим обработки писать. Доработки стоят очень дорого, внутри ОЧЕНЬ накручено, сами толком не разобрались, решили не рисковать, благо меня познакомили с уволенным экс-разрабом, он все дорабатывал, а то допилы обошлись бы нам дороже основного внедрения. Каждая версия акселота совершенно не похожа на предыдущую архитектурно, то ли каждый раз убеждаются в неудачности, то ли разработчики у них разбегаются и каждый раз другие. я бы посоветовал посмотреть WMS Arena сразу скажу, что я не совсем объективен, я эту систему доводил до ума и до коробочного состояния у арены гигантский плюс: система изначально написана и дорабатывается компанией TDM Electric, причем компания сама на этой системе работает. соответственно, все неудобности и шероховатости устраняются не потому что так надо клиентам, а потому что так надо им самим ))) ну и все вкусности, придуманные за 9 лет существования TDM, вошли в эту систему...ну и не пропадет никуда ни сама система, ни экспертиза ее доработок и эксплуатации изначально содрана наполовину с Exceed, наполовину с манхэттена, написана на 1С, правила, шаблоны и т.д. настраиваются в текстовых окнах без программистов и конфигураторов. на удивление нетребовательна: склад в 50 000 ячеек, 20 000 артикулов, 20 терминалов, 3 оператора фунциклировал на "сервере" в один четырехъядерник с 32 гигами ОЗУ крупнейшее внедрение: склады сети ОллГуд компания АвтоАльянс, та вообще внедрила у себя эту систему самостоятельно...все люди были брошены на ОллГуд, альянсу сказали что сейчас заниматься ими некому, максимум по телефону подсказать, так они сами справились еще из плюсов: можно обучать и стажировать своих складских прям на складе TDM, там народ опытный уже 9 лет на ней работает если интересно или будут вопросы, свяжитесь со мной, я вас с ведущим внедренцем познакомлю, он вам все покажет, расскажет и скидку предложит )))Разбираюсь с акселотом сам. Пока не перейду на уровень разработчика - не начну внедрение. (Версия последняя - вроде вполне ничего.) А доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда. ps За арену - спасибо. Не знал что есть и такой вариант - посмотрю на досуге. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 20:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
antand работа с резервами строилась на основе механизмов уровней изоляции и блокировок на уровне SQL сервера(sybase). ... около 130 человек в ней постоянно молотили продажи товаров с нескольких складов с резервированием, с обменом резервами, с переносом резервом при перемещении между складами и т.п. Никаких ошибок(резервы потерялись, резервы выше чем склад и т.п.) и тормозов не наблюдалось при работе с резервами. ... Никто ничего специально не параллелил. Если у вас резервирование работает "на основе механизмов уровней изоляции и блокировок на уровне SQL", то очень вероятно, что специально параллелить ничего и не надо. Такая система достаточно неплохо масштабируется без дополнительных усилий. Надо помнить, что современные "промышленные" СУБД рассчитаны на совсем другие нагрузки. antandПрочитав пост, засомневался, сложилось мнение что так было делать нехорошо. Надо было все последовательно делать(резервирование по очереди), т.к. уровни изоляции "не решают". Или запускать постоянно процедуру пересчета резервов по всем заказам с очисткой старых. Нормальный подход, если у вас ничего не тормозит и не возникает ошибок. Всё дело в задачах и нагрузке. antandЯ конечно понимаю, что если хочется полного автомата резервирования, который очень умный и прямо в момент резервирования будет анализировать остатки, продажи, коэффициенты реализации резервов, ограничения на суммы, на лету оптимизировать резервы, где лучше зарезервировать и т.п., то алгоритм внутри транзакции будет очень сложным и эта транзакция может всех держать. Но так транзакции не стоит писать, транзакции с блокировками должны быть быстрыми. Тогда можно по другому - быстро в транзакции зарезервировать где получится максимально быстро, а потом запускать параллельно процесс оптимизации. Неужели у автора надо резервы оптимизировать постоянно, при каждом событии на товаре? Во первых, для резервирования "прямо в момент резервирования ... анализировать остатки, продажи, коэффициенты реализации резервов, ограничения на суммы" не надо. Вы путаете с алгоритмами расчета пополнения складов. Для резервирования нужны остатки и всё. А вот сколько модулей делать - долго думал. Можно было сделать два модуля. Один бы быстро делал резервирование, второй бы выполнял различные коррекции (учтенные перемещения, приходы от поставщиков, списания и т.д.). Или можно было все совместить в одном модуле. Проще оказалось реализовать всё в одном модуле. Просто резервирование (где придется не получалось бы, все равно надо по приоритетам) без корректировок можно было сделать со средним временем работы примерно 1 секунда. Но тогда при каждом подборе для межскладских перемещений (а их создавалось несколько десятков в день) пришлось бы выполнять корректировки резервов. То есть как минимум делать в системе при создании межскладского перемещения вызов этого отдельного модуля корректировок, ждать, когда он выполнится, продумать, как во время этого пересчета должны блокироваться записи резервирования и т.д.. А вариант с одним модулем (резервирование + корректировки) работает ненамного дольше (в среднем 2-4 секунды). И при этом модуль резервирования работает "автономно" от системы - напрямую он ниоткуда не вызывается. А так как один модуль это всегда проще, чем два модуля, и для пользователей разница в 2-3 секунды не критична, то решили обойтись одним модулем. Это сильно упростило разработку - когда таблицу резервов меняет код, который расположен строго в одном единственном месте - это сильно упрощает проблему с блокировками и отлов ошибок. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 20:58 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxМы в системе Oremax широко используем возможности СУБД для разрешения конкуренции бизнес-операций за ресурсы - транзакционный механизм. Для увеличения производительности мы рекомендуем нашим клиентам использовать уровень изоляции транзакций Read Commited . Параноики могут использовать и более жёсткие уровни. При этом, для надёжности функционирования мы внутри транзакций предварительно блокируем записи , которые будут изменены в процессе работы. Например, если говорить о резервировании, то у нас есть таблица сводной информации о количестве свободного товара на складе и количестве резерва в разрезе Номенклатура+Склад, в которой мы блокируем записи перед началом резервирования. Поскольку задания (запросы) на резервирование поступают постоянно от разных пользователей, то, естественно, возникает конкуренция, которую "разруливает" СУБД за счёт своего тразакционного механизма. А не проще использовать SERIALIZABLE и ничего внутри транзакции дополнительно не блокировать? Oremaxs_ustinov, мне кажется, что вы излишне усложняете алгоритм. Задачу резервирования мы решили другим способом, при том, что система может работать при оффлайновых репликациях. Я не знаю насколько наш подход применим для вас, т.к. Oremax не имеет ничего общего ни с 1С ни с MS Dynamics. Описанный алгоритм резервирования (не реализация) - специфика фирм, работающих с запчастями и им подобных. У таких фирм значительная часть заказов резервируют товары на других складах (не на том складе, откуда будет отгрузка). В результате и резервирование на нескольких складах, и межскладские перемещения на основе резервирований должны создаваться автоматически. Если вы решили эту проблему более простым способом - опишите ваше решение. Лично мне интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:08 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1сА доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда . А как это у вас получилось? Сумма уж очень внушительная... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:12 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Программист 1с А доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда. ps За арену - спасибо. Не знал что есть и такой вариант - посмотрю на досуге. круто барин гуляет! мне за каждые полляма мозг размножают, а тут люди ярды теряют а возьмите меня к себе, у меня WMSы взлетают всегда, даже когда собственник активно помогает ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:45 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПрограммист 1сА доверять внедрение очередной - пусть даже самой лучшей фирме... и так уже на последнем внедрении потеряли больше миллиарда . А как это у вас получилось? Сумма уж очень внушительная... да exceed c полным циклом предобследований, доработками, интеграциями и лицензиями на столько потянет а коллега наверняка имел в виду еще и потери бизнеса, там же склады штормило и, судя по отказу от использования системы, штормило так, что решили утопиться и возродиться заново ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garya_bobмоя позиция: параллельные процессы приведут к плачевным результатам, какой уровень изоляции не ставьЕсли писать код, не задумываясь о взаимодействиях и возможных блокировках (как это обычно и происходит), тогда да. Лично мне Ваш подход вполне себе понравился. Однако, существуют методы написания и тестирования именно параллельных процессов, и если грамотно распараллелить процессы, то можно получить вместо дополнительных проблем дополнительный выигрыш. Одна точка зрения предпочитает вполне обоснованно обходить возможные трудно выявляемые проблемы с блокировками, а не бороться с ними. Эта точка зрения мне вполне понятна, когда нужно получить достаточно быстро результат, который не заведет в тупик. Самое любопытное, что предпочитаем мы одно и то же. По моему мнению, правильный подход при написании ERP системы - включить SERIALIZABLE и "писать код, не задумываясь о взаимодействиях и возможных блокировках". С точки зрения прикладного программиста СУБД сама обеспечит "ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений". Фактически, спор был только об используемых терминах. GaryaДругая точка зрения - управлять блокировками при распараллеливании. Такой подход более рискованный, но позволяет получить более качественное решение, правда, более серьезными усилиями и более высокими затратами времени (как правило). Возможно, приверженец этого подхода имеет настолько большой опыт, что научился видеть проблемы параллельной обработки данных на стадии написания кода и может грамотно их разруливать на этой стадии. А возможно он недооценивает риски такого подхода, тут мне трудно судить. По-моему, в принципе оба подхода имеют право на жизнь. ПМСМ, ваш спор - о предпочтениях. А вот здесь вы описываете подход, который предлагает 1С. Управляемый режим позволяет повысить параллельность работы пользователей в клиент-серверном варианте работы за счет использования более низкого уровня изоляции транзакций базы данных (Read Committed). При записи данных в транзакции объекты встроенного языка автоматически блокируют необходимые данные. Разработчику требуется управлять блокировками данных в тех случаях, когда бизнес-логика требует согласованного и целостного чтения данных в транзакции. Лично мне такой подход очень не нравится. Это весьма сложная задача - "вручную" обеспечить в прикладном коде ACID. Подавляющее большинство прикладных программистов не имеют необходимых навыков и знаний, чтобы сделать это без ошибок. Лично моё мнение - целостностью данных должна заниматься СУБД, а: https://msdn.microsoft.com/ru-ru/library/jj856598(v=sql.120).aspx]Программисты SQL ответственны за начало и завершение транзакций в точках, которые осуществляют логическую целостность данных. Программист должен определить последовательность изменений данных, которые оставляют данные в целостном состоянии по отношению к деловым правилам организации . Программист включает эти инструкции модификации в одну транзакцию, чтобы Компонент SQL Server Database Engine смог обеспечить физическую целостность транзакции. То есть, если есть проблема с тормозами (блокировками), надо не пытаться вручную управлять блокировками, а проанализировать и исправить код. Тормоза всегда являются следствием "длинных" транзакций, а длинные транзакции, в свою очередь - результат некорректного и/или неоптимального кода. И только в самом-самом крайнем случае нужно управлять блокировками. Но я с трудом представляю себе такие ситуации в ERP системах пусть даже для очень крупных компаний. Ну нет в этой области задач с настолько большими потоками данных и с настолько высокими требованиями к "отзывчивости" системы. Это не АСУТП, где иногда надо обеспечить гарантированную скорость отклика в несколько миллисекунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 22:05 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
_bobs_ustinovпропущено... А как это у вас получилось? Сумма уж очень внушительная... да exceed c полным циклом предобследований, доработками, интеграциями и лицензиями на столько потянет а коллега наверняка имел в виду еще и потери бизнеса, там же склады штормило и, судя по отказу от использования системы, штормило так, что решили утопиться и возродиться заново )))Естественно потери бизнеса. Оплата всех услуг внедерния wms от силы 5млн рублей. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 22:16 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПо моему мнению, правильный подход при написании ERP системы - включить SERIALIZABLE и "писать код, не задумываясь о взаимодействиях и возможных блокировках". С точки зрения прикладного программиста СУБД сама обеспечит "ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений".Это не всегда срабатывает. Более того, такой подход может привести к дедлокам, если в транзакции Т1 производится блокирование ресурса Р1 с ожиданием освобождения ресурса Р2, а транзакция Т2 блокирует ресурс Р2 и ожидает освобождения ресурса Р1, заблокированного транзакцией Т1. Использования "правильных" уровней блокировок недостаточно - все равно приходится вникать в логику. Кроме того, когда используется некий промежуточный язык, который сам формирует запросы к СУБД, например, язык 1С, при не совсем правильном использовании, может статься, проверка статуса будет выполнена в одном SQL запросе в первой транзакции, а модификация записи после проверки статуса - в другом запросе, во второй отдельной транзакции. И между этими транзакциями СУБД успеет изменить статус проверяемой записи за счет третьей транзакции, выполненной, к примеру, совсем другим пользователем. Так что включать мозг и думать тщательно требуется по любому. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 23:01 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garya… С другой стороны, нотация BPMN имеет специальные средства для распараллеливания потоков данных и потоков управления, сбора "пучка потоков" в один поток, взаимодействия различных потоков между собой посредством сигналов или сообщений. Посредством этой нотации можно совмещать довольно сложные участки обработки данных, которые требуют отчасти строго-последовательной обработки, а местами допускают распараллеливание. Легко и просто делается "пообъектная" обработка, которую можно выполнить для коллекции объектов либо путем "последовательного перебора" объектов, либо созданием отдельного экземпляра процесса для каждого объекта, требующего обработки. Потому такая нотация, если ею заменяется "программирование вообще" может творить чудеса. Все эти "мютексы", "сигналы", "сообщения", которые есть в операционной системе - это классно, но где они в языках высокого уровня? Их нет! Нужно писать код с использованием древнего "последовательного" алгоритмического подхода, а взаимодействие параллельных процессов рисовать где-то отдельно на бумажке или пытаться впихнуть в мозг до получения вывиха мозга. Удобных средств визаулизации параллельного программирования, параллельных алгоритмов - не было. Пока не появился BPMN. В нем реализованы революционные идеи. Разработчик, глядя на схему процессов, "проваливаясь" в детализацию схемы (детализируя, выполняя декомпозицию), либо выходя на верхний уровень, может одновременно наблюдать и удобно укладывать у себя в голове множество совершенно разных процессов, выполняющихся в разных ритмах, имеющих множество экземпляров каждый, но при этом взаимодействующих таким образом, что это взаимодействие не выносит мозг. Согласен красиво. Но на мой взгляд весьма трудоёмко. Обычно при столкновении красоты с жизнью страдает красота - заказчики платят за вариант, который решает их насущные задачи за минимальные деньги. Есть ли примеры систем автоматизации бизнеса, реализованных с помощью BPMN? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:09 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov А не проще использовать SERIALIZABLE и ничего внутри транзакции дополнительно не блокировать? Это не профессионально :-). В этом случае Дидлоки, «тормоза» и проблемы обеспечены. К тому же, тогда мы не будем отличаться в лучшую сторону от слишком известных систем. s_ustinov Описанный алгоритм резервирования (не реализация) - специфика фирм, работающих с запчастями и им подобных. У таких фирм значительная часть заказов резервируют товары на других складах (не на том складе, откуда будет отгрузка). В результате и резервирование на нескольких складах, и межскладские перемещения на основе резервирований должны создаваться автоматически. Кратко о резервировании в Oremax. Места резервирования: • «Свои» склады. Разрешено прямое резервирование. • «Чужие» склады, например, территориально удалённые склады. Прямое резервирование запрещено. Направляется заявка на резерв. • В пути (товары ещё не поступившие от поставщика). Объекты резервирования: • Номенклатурная единица на складе • Номенклатурная единица в пути • Конкретный экземпляр товара на складе Места размещения данных: • Локальная база данных. • Удалённая база данных. Синхронизация удалённых баз данных осуществляется с помощью офлайновых репликаций (SQL Remote). Имеется таблица Резервы (код записи, код состояния, код склада, код номенклатуры, количество резерва, количество запрошено, …). Одна запись – один резерв. По одной строке заказа может быть несколько резервов на разных складах. Запись резерва может имеет состояния: • Проект - Хранение в базе данных и не более того • Заявка - Передача заявки на резервирование владельцу склада • Действующий - Резерв действует • Завершен - Резерв полностью завершен • Аннулирован - Резерв не действует • Отклонён - отрицательный ответ на заявку • В пути • Обработан – служебное состояние ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:12 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinov, Продолжение. Упрощённая схема резервирования на «чужом» складе в отрыве от общей схемы документооборота: • Запуск процедуры резервирования для строки заказа. • В соответствии с имеющейся информацией о наличии свободного товара на «чужом» складе создаётся запись в Резервах с указанием «количество запрошено». • Запись переводится в состояние Заявка. После этого запись становится недоступной (алгоритмически, не блокировка) для модификации тому, кто создал заявку. • Если есть репликации, то через SQLRemote запись попадает в такую же таблицу Резервы в другой базе с учётом транзакционной последовательности операций в исходной базе. • Каждые пару минут в базе запускается событие, которое вызывает процедуру обработки Заявок на резерв. • Процедура обработки Заявок в соответствии с имеющейся информацией о наличии свободного товара обрабатывает заявку и присваивает состояние Отклонён при отсутствии свободного товара или присваивает состояние Действующий и доступное количество резерва при наличии некоторого свободного количества. Если пользователь подписан на получение оповещений об изменении в резервах, то ему направляется сообщение о результатах операции. • Если есть репликации, то SQLRemote запись попадает в такую же таблицу Резервы в локальной базе. • Запись резерва становится доступной для модификации в локальной базе как человеком (например, уменьшить резерв), так процедурам автоматической обработки (например, процедурам передачи товара на другой склад) При перемещении товара, зарезервированного на «чужом» складе на другой склад, например, склад отгрузки, вместе с товаром перемещается резерв. Запись в Резервах для удалённого склада приобретает состояние Завершён далее создаётся новая запись в Резервах для склада получения с сохранением остальных реквизитов и в состоянии Действующий. Что касается автоматического создания документов на перемещение, то это, разумеется, возможно и делается при внедрении в соответствии с требованиями заказчика, например, на основании плана отгрузок. Для этого в заданное время запускается пользовательская процедура, которая создаёт пакет документов. Эта процедура оформляется как пользовательская процедура без изменения стандартных процедур и, следовательно, без потери возможности обновления программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:14 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Garyas_ustinovПо моему мнению, правильный подход при написании ERP системы - включить SERIALIZABLE и "писать код, не задумываясь о взаимодействиях и возможных блокировках". С точки зрения прикладного программиста СУБД сама обеспечит "ПОСЛЕДОВАТЕЛЬНОЕ выполнение транзакций в СУБД, независимо от того, как вы их выполняете на сервере приложений".Это не всегда срабатывает. Более того, такой подход может привести к дедлокам, если в транзакции Т1 производится блокирование ресурса Р1 с ожиданием освобождения ресурса Р2, а транзакция Т2 блокирует ресурс Р2 и ожидает освобождения ресурса Р1, заблокированного транзакцией Т1. Использования "правильных" уровней блокировок недостаточно - все равно приходится вникать в логику. Согласен. Более того, такой подход не просто может, а почти наверняка приведед к дедлокам. Но в том то и прелесть SERIALIZABLE, что проблемы с блокировками появятся существенно раньше, чем при другом уровне изоляции. И уже на раннем этапе мы увидим большинство "проблемных" мест. А дальше - надо сидеть и анализировать код. И убирать проблемные места, оптимизируя и правильно разбивая код на отдельные транзакции (как Микрософт советует). Полностью от блокировок и взаимных блокировок избавиться, скорее всего, не получится. Но снизить их до приемлемого уровня - вполне. Например, в моей реализации резервирования, весь код процедуры разбит на отдельные транзакции, блокировок по которым очень мало. - Прочитали данные по остаткам, скопировали во временные таблицы - завершили транзакцию. Очень короткая транзакция, может блокироваться только чтение из таблиц остатков. - Делаем длинный пересчет резервов во временных таблицах - транзакция длинная (несколько секунд), но блокировок нет по определению, так как для каждого экземпляра процедуры СУБД создает свой экземпляр временных таблиц, в которых и выполняются расчеты. - Удалили в таблице резервов старые записи и записали новые резервы (скопировали из временной таблицы) - завершили транзакцию (единственное место в коде, где меняются данные в таблице резервов). Очень короткая транзакция - таблица резервов относительно небольшая, индексов мало, удаляется / вставляется несколько сотен записей за одну транзакцию. Блокировки могут быть только от других экземпляров процедуры, но одновременно несколькими экземплярами процедуры резервы по одному и тому же товару не считаются. А чтение из таблицы (например, проверить при отгрузке, что резервов хватает) можно и с более низким уровнем изоляции делать - на логику работы не повлияет. В текущем варианте такая операция выполняется раз в секунду (больше просто не надо), но легко можно несколько десятков раз в секунду обновлять данные. В результате блокировок практически нет, и без особых усилий можно довести пиковую скорость расчета резервов до ста - двухсот тысяч товаров в минуту (а по каждому товару может быть несколько резервов по разным заказам). А это уже уровень крупных внедрений. GaryaКроме того, когда используется некий промежуточный язык, который сам формирует запросы к СУБД, например, язык 1С, при не совсем правильном использовании, может статься, проверка статуса будет выполнена в одном SQL запросе в первой транзакции, а модификация записи после проверки статуса - в другом запросе, во второй отдельной транзакции. И между этими транзакциями СУБД успеет изменить статус проверяемой записи за счет третьей транзакции, выполненной, к примеру, совсем другим пользователем. А это как раз ошибка в ДНК Но не программистов, а систем. И 1С, и навик "выросли" из десктопных приложений - вот у них и остались "родовые травмы". При желании поставщика исправить это можно относительно малой кровью. Другое дело, что ни Microsoft, ни 1С это не очень надо. У Microsoft есть AX, у которого с масштабируемостью более-менее нормально. У 1С... Не знаю, но скорее всего они считают, что не имеет смысла напрягаться - и так купят. Да и даже в текущем виде не настолько всё плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:20 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxs_ustinov А не проще использовать SERIALIZABLE и ничего внутри транзакции дополнительно не блокировать? Это не профессионально :-). В этом случае Дидлоки, «тормоза» и проблемы обеспечены. К тому же, тогда мы не будем отличаться в лучшую сторону от слишком известных систем. А можно привести хотя бы один пример, в котором при использовании SERIALIZABLE "Дидлоки, «тормоза» и проблемы обеспечены"? Просто я таких примеров не знаю, и на данный момент считаю, что проблемы возникают не от SERIALIZABLE, а от недостаточно качественного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:43 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
OremaxУпрощённая схема резервирования на «чужом» складе в отрыве от общей схемы документооборота: • Запуск процедуры резервирования для строки заказа. • В соответствии с имеющейся информацией о наличии свободного товара на «чужом» складе создаётся запись в Резервах с указанием «количество запрошено». Предположим, свободные остатки есть на 10 разных складах. Как система определит, на каком складе пытаться сделать резерв? OremaxПри перемещении товара, зарезервированного на «чужом» складе на другой склад, например, склад отгрузки, вместе с товаром перемещается резерв. Запись в Резервах для удалённого склада приобретает состояние Завершён далее создаётся новая запись в Резервах для склада получения с сохранением остальных реквизитов и в состоянии Действующий. А как обрабатываются ошибки? Например, на складе было 10 штук. Все они были зарезервированы под конкретный заказ покупателя и перемещены на другой склад. Но при приемке на склад получатель в коробке нашли только 8 штук. 2 штуки то ли потерялись в пути, то ли их никогда в коробке не было... Но в результате на складе отправителе у нас 0 штук, на складе получателе 8 штук в резерве под заказ покупателя. Что происходит с резервом на потерянные 2 штуки товара? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:51 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovOremaxпропущено... Это не профессионально :-). В этом случае Дидлоки, «тормоза» и проблемы обеспечены. К тому же, тогда мы не будем отличаться в лучшую сторону от слишком известных систем. А можно привести хотя бы один пример, в котором при использовании SERIALIZABLE "Дидлоки, «тормоза» и проблемы обеспечены"? Просто я таких примеров не знаю, и на данный момент считаю, что проблемы возникают не от SERIALIZABLE, а от недостаточно качественного кода. Поскольку данный уровень предполагает блокирование считанных данных даже без их модификации, то, например, если такой уровень устанавливается на сессию и на экран выводятся какие-либо списки, то программа фактически становится "однопользовательской". Если в процедуре - чтение также может стать несколько затруднительным при активных операциях в базе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 14:43 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
s_ustinovПредположим, свободные остатки есть на 10 разных складах. Как система определит, на каком складе пытаться сделать резерв? У нас: 1) Склад отгрузки 2) Свои склады 3) Чужие склады в согласованном порядке s_ustinovА как обрабатываются ошибки? Например, на складе было 10 штук. Все они были зарезервированы под конкретный заказ покупателя и перемещены на другой склад. Но при приемке на склад получатель в коробке нашли только 8 штук. 2 штуки то ли потерялись в пути, то ли их никогда в коробке не было... Но в результате на складе отправителе у нас 0 штук, на складе получателе 8 штук в резерве под заказ покупателя. Что происходит с резервом на потерянные 2 штуки товара? В данном случае резерв это только часть бизнес операции и рассматривать его отдельно от решения учёта товара не имеет смысла ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 14:49 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxна экран выводятся какие-либо списки, то программа фактически становится "однопользовательской". Курсоры? Тяжело придумать пример более плохого кода. OremaxЕсли в процедуре - чтение также может стать несколько затруднительным при активных операциях в базе. А можно пример задачи, где это будет возникать? Если все транзакции с таблицей короткие, то просто чтение и само отработается без проблем, и блокировок не создаст. Если, повторюсь, чтение оформить как отдельную транзакцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 15:06 |
|
Алгоритм резервирования для нескольких складов
|
|||
---|---|---|---|
#18+
Oremaxs_ustinovПредположим, свободные остатки есть на 10 разных складах. Как система определит, на каком складе пытаться сделать резерв? У нас: 1) Склад отгрузки 2) Свои склады 3) Чужие склады в согласованном порядке То есть есть таблица приоритетов? Или что значит "в согласованном порядке"? Например, есть свободные остатки на: склад отгрузки - 10 штук Свой склад 1 - 5 штук Свой склад 2 - 40 штук Свой склад 3 - 20 штук Чужой склад 1 - 50 штук Чужой склад 2 - 30 штук Надо зарезервировать 30 штук - где именно будут созданы резервы? Oremaxs_ustinovА как обрабатываются ошибки? Например, на складе было 10 штук. Все они были зарезервированы под конкретный заказ покупателя и перемещены на другой склад. Но при приемке на склад получатель в коробке нашли только 8 штук. 2 штуки то ли потерялись в пути, то ли их никогда в коробке не было... Но в результате на складе отправителе у нас 0 штук, на складе получателе 8 штук в резерве под заказ покупателя. Что происходит с резервом на потерянные 2 штуки товара? В данном случае резерв это только часть бизнес операции и рассматривать его отдельно от решения учёта товара не имеет смысла А можно поподробнее - в связке с решением учета товара? :) Это действительно интересный вопрос - именно при подобных ситуациях часто начинаются проблемы с резервами. То резервы пропадают, то кладовщики не могут нормально учесть складские операции из-за резервов. Как вы решили задачу обработки таких ситуаций? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 15:15 |
|
|
start [/forum/topic.php?fid=29&msg=39381361&tid=1525788]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
177ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 292ms |
0 / 0 |