hren wrote:Ваши оценки неправильны. Я не буду анализировать странное с моей точки зрения предположение о том, что для передачи данных о блокировке одной записи нужно переслать по сети 0.5 КБайта (см. мое замечание о прямых руках из предыдущего сообщенияМитяй wrote:1000 терминалов, допустим, 1 транзакция в минуту. Допустим, в одной транзакции лочится 100 записей. Допустим, сообщение о блокировке занимает 0.5 кб со всей служебной информацией. Получаем 1000 * 100 *2 (залочить / разлочить) = 200,000 сообщений и 100 Mb в минуту, примерно 30,000 / 1.5MByte в секунду. 10Mbit сеть такого точно не потянет, 100MBit будет загружена на 20% _теоретического_ предела (который весьма теоретичен для мелких сообщений).) В реальности же, эти данные как правило вообще не нужно пересылать и вот почему.
Уведомление клиенту о кратковременных блокировках в реальной системе отправляется не раз в минуту, а гораздо чаще. В системе продажи театральных и подобных билетов, в разработке которой я участвовал, данные о блокировках обновляются у клиента по умолчанию раз в 5 секунд. Казалось бы все еще хуже, чем Вы написали. Однако это не так. Дело в том, что обновлению подвергаются только те данные, которые в каждый момент времени интересуют каждого клиента. Рассмотрим сценарий работы кассира с покупателем. Пока кассир просматривает расписания и обсуждает с покупателем, какой зал и какое представление выбрать, никакого принудительного обновления данных не требуется. Когда выбран конкретный сеанс или спектакль, кассир открывает схему зала, на которой видны статусы мест. В этот момент один раз из базы отдается полная схема статусов мест. Затем раз в пять секунд, пока сервер приложений знает, что у данного клиента открыта схема зала, он посылает клиенту инкрементальные обновления, то есть только изменения статусов с использованием специализированного протокола. Поскольку с одним залом и одном сеансом одновременно редко работает больше двух-трех кассиров, статусы мест меняются довольно медленно. Оптимизированая сервисная посылка, содержащая данные об изменениях статусов мест в среднем (статистика реальной системы) по объему не превышает 10 байт (чаще всего передается только флаг отсутствия изменений). Что в 50*100*2 раз меньше Вашей оценки для одного рабочего места. А учитывая, что работа со схемой зала занимает не более 30% активного времени каждого кассира, трафик будет еще меньше. И даже с учетом того, что данные во время работы со схемой передаются в 12 раз чаще, чем Вы предположили, на самом деле, даже при предложенной Вами недетской активности пользователей суммарный сервисный трафик не превысит 10 байт *12 раз в минуту * 1000 р. мест * 30% времени ~ 40 КБайт в минуту или менее 1 КБайта в секунду. Причем это будет пиковый трафик на уровне теоретического предела активности. Модема 14400 вполне хватитВы мне расскажите как это выглядит с точки зрения пользователя. В том же сценарии билетной кассы. Вот перед ним схема зала. Вот он хочет сформировать заказ из трех билетов, один из которых уже включен в непроданный пока заказ другого кассира. Изначально кассир этого не видит, в отличие от моей схемы, где статусы обновляются сами. Что он делает дальше и как реагирует система?А стандартными средствами это делается (в Информиксе)-
set wait to 10 -- seconds
set isolation to repeatable read
begin
select ... -- records locked by share lock, if anybody updates record
we wait for 10 sec
update ... -- if somebody locked this record we wait for 10 sec
commit
Прэлэстно. Значит, сервер приложений раз в пять секунд запускает select для каждого терминала ? При 1000 работающих терминалов - 200 selectов в секунду ? Или вы пошли дальше, и наваяли заодно и типа сервер базы данных ?
Кстати, расскажите как вы уместите TCP пакет в 10 байт. Или вы предлагаете и свой протокол связи заодно наваять ?
И это при том, что по условиям задачи, "с одним залом и одном сеансом одновременно редко работает больше двух-трех кассиров, статусы мест меняются довольно медленно. ". Т.е. для ваших условий вполне подходит Commited Read / Update с весьма редкими случаями отказа клиенту в уже выбранном месте. И вся ваша система нагорожена исключительно для того, чтобы _наглядно_ показать клиенту, что он долго щелкал клювом и у него увели место из-под носа ?