Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

Как можно разделить функции одной программы между несколькими?   Найти похожие ветки 

 
Сергей Ю.   (2005-02-13 17:26) [0]

Суть проблемы в следующем: есть мной написанная прога по администрированию работы компьютерного клуба, делает следующее : периодически пингует машины, проверяет связь с клиентскими программами ("закрывалками"), садит/снимает клиентов, ведет их лицевые счета в базе на MS-SQL серваке, считывает траффик на My-SQL сервере и т.д. При 30-50 машинах все работает более-менее стабильно, но вот при увеличении клиентов до 80-100 прога часто "вылетает". Ставить несколько таких программ нехочется, т.к. администратор зала должен следит за всеми машинами "на одном экране". Так вот решил сделать такую вещь - разделить функции этой программы на несколько отдельных программ, думаю так легче будет отследить ошибки и прочие проблемы. Но вот как проводить между ними обмен данными?
Я не проффессионал, так любитель-самоучка. Кто что может посоветовать почитать по этому поводу?
Заранее спасибо за ваши ответы.


 
Eraser ©   (2005-02-13 18:07) [1]

Сергей Ю.

А что за программа, если не секрет?

Так вот решил сделать такую вещь - разделить функции этой программы на несколько отдельных программ

Зря. Твоя программа отнюдь не пример сверхзагруженности! MS SQL может работать с тысечами клиентов.


 
Сергей Ю.   (2005-02-13 19:11) [2]

Что за программа написано в тексте :) Сверхзагруженность не является следствием работы с MS SQL сервером, а следствием постоянной обработки различных операций, например: клиенты при подключении/отключении посылают моей программе соответсвующие сообщения, их необходимо обработать и изменить состояние клиента, произвести записи в БД о счете клиента, произвести записи в БД для траффика и т.д. В этоже время программа должна обрабатывать данные о счетах рабоающих клиентов, обновлять данные траффика и т.д. А клиентов около сотни и все что-то шлют, что-то делают. Поэтому я и думаю переработать структуру программы. Чтоб один модуль занимался слежением за клиентом, другой считал трафффик, третий снимал деньги со счета и т.д. Можно конечно это сделать на основе БД и SQL, но может есть другие способы обмениваться прогам инфой?


 
Cobalt ©   (2005-02-14 03:19) [3]

Скорее всего, проблема в коде - где-то банальные ошибки, типа "потсавлю задержку 0,5 сек, ничего страшного не случится"


 
Slym ©   (2005-02-14 04:41) [4]

2 Cobalt
Или синхронизация потоков забыта...
или try except не в том порядке
или маздай глючный


 
Сергей Ю.   (2005-02-14 08:51) [5]

Ну задержек никаких нет, try|except нигде неиспользуется, маздай используется win2000prof, кроме него, BDE и моей проги ни чего нет - чистая машинка. А что значит "синхронизация потоков"?


 
BiN ©   (2005-02-14 09:25) [6]

Сергей Ю.   (13.02.05 17:26)  
Так вот решил сделать такую вещь - разделить функции этой программы на несколько отдельных программ, думаю так легче будет отследить ошибки и прочие проблемы. Но вот как проводить между ними обмен данными?


C:\Program Files\Borland\Delphi7\Demos\Ipcdemos


 
Anatoly Podgoretsky ©   (2005-02-14 10:57) [7]

Сергей Ю.   (14.02.05 08:51) [5]
try|except нигде неиспользуется, вот тебе и причина, надо использовать.


 
TUser ©   (2005-02-14 11:11) [8]

Если Try... except нигде не используется, то непонятно, почему она на 30 машинах работает.

В принцыпе, если все написано правильно (что отнюдь не факт), то проблема может быть в слабости самой машины. Поставить помощьнее процессор (или два), памяти добавить - не помогает?

Кстати, как часто клиенты что-нибудь "говорят" серверу?

PS. Переписать все нафик !)


 
Сергей Ю.   (2005-02-14 16:32) [9]

Забавный народ - программеры, вместо конкретного решения проблемы все предлагают править имеющуюся прогу, мне и самому лень все переделывать (благо деньги за проект уже получены и благополучно пропиты :)), но хочется все сделать красиво, т.е. взять и "переписать все нафик" :) Но чтоб как я хочу, чтоб все раздельно работало!


 
DVM ©   (2005-02-14 16:39) [10]


> клиенты при подключении/отключении посылают моей программе
> соответсвующие сообщения, их необходимо обработать и изменить
> состояние клиента, произвести записи в БД о счете клиента,
> произвести записи в БД для траффика и т.д. В этоже время
> программа должна обрабатывать данные о счетах рабоающих
> клиентов, обновлять данные траффика и т.д. А клиентов около
> сотни и все что-то шлют, что-то делают.

Клиенты должны обращаться к БД и там интересоваться о своем состоянии и там же выкладывать свои сообщения. Тогда все будет работать быстро.


 
Сергей Ю.   (2005-02-14 18:29) [11]

А чем плох обмен текстом через сокеты?


 
Petr V. Abramov ©   (2005-02-14 20:50) [12]

> но вот при увеличении клиентов до 80-100 прога часто "вылетает".
 Решить задачу "чтоб не вылетела" надо. Если не решите, возникнет проблема "глючит при разделении между >N программами.

P.S. Т может оказаться малО


 
Leonid Troyanovsky ©   (2005-02-14 22:23) [13]


> Petr V. Abramov ©   (14.02.05 20:50) [12]
> P.S. Т может оказаться малО


Хотя меня T, вроде(тьфу-тьфу) пока не беспокоило, но, все же,
хотелось уточнить, какой его размер следует считать нормальным?

--
Regards, LVT.


 
Сергей Ю.   (2005-02-15 08:42) [14]

Может я задам глупый вопрос, но что такое "Т"?


 
Petr V. Abramov ©   (2005-02-15 13:06) [15]

> Может я задам глупый вопрос, но что такое "Т"?
 имелось в виду N :))))


 
Arm79 ©   (2005-02-15 14:05) [16]

Забавно. Я тоже работаю с большими потоками данных, и ничего...

Мне не понятно, зачем используются 2 SQL-сервера, но не суть важно.

По поводу обмена данными между 2 частями программы - сервером и клиентами. Может стоит перейти с сокетов на MSMQ-очереди? Конечно, не думаю, что сокеты плохие, но мне кажется, что очереди для обмена данными для вас подойдут больше, тк меньше ошибок придется обрабатывать... Если надо, могу небольшой модульчик прислать. Только адреса мыла не вижу.

Я лично не стал бы делить свою программу на несколько маленьких. Максимум, использовал бы dll.

По поводу ответа на, собственно, вопрос. WM_COPYDATA. Можно Mapping использовать. MailSlots тоже вроде можно. Вариантов несколько. Можно вроде бы даже с сокетами. Просто писать и читать с 127.0.0.1

ЗЫ Используейте try except и try finally. Очень рекомендую.


 
Сергей Ю.   (2005-02-15 17:50) [17]

2 сервера, т.к. один работает с инетом и там считается траффик, другой ms-sql потому-что дб со счетами клиентов работает с 1С, а 1С-ка только с ним и работает.
Про MSMQ где можно почитать?
"писать и читать с 127.0.0.1"? - я по сокетам веду обмен с клиентскими программами в локалке.
try except поставил во всех местах где возникают exception-ы.
Тут другая беда - если раньше она валилась и при этом что-то говорила, то теперь она может просто пропадать ни чего при этом невыдавая на экран, типа ее просто закрыли :(, что-бы это могло быть?


 
Leonid Troyanovsky ©   (2005-02-15 21:39) [18]


> Petr V. Abramov ©   (15.02.05 13:06) [15]
> > Может я задам глупый вопрос, но что такое "Т"?
>  имелось в виду N :))))


Пусть x = T.
Хотя, T может быть малО. Лучше, пусть будет x = N.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2005-02-15 21:44) [19]

Сергей Ю.   (15.02.05 17:50) [17]
А try такого вида

try
  ...
except
end


 
Сергей Ю.   (2005-02-15 23:29) [20]

Дак именно такого и использую, а какого еще?


 
Arm79 ©   (2005-02-16 11:58) [21]

MSMQ - MSDN, раздел Platform SDK->Component Services->Message Queueing


try
 ...
except
 on E: Exception
   do begin
     WriteToLog(E.ClassName + " - " + E.Message);
   end;
end


 
Ермак ©   (2005-02-16 14:46) [22]

Проблема не в количестве машин, а в ошибке в проге в принципе. Надо ловить ошибку... Если она, как ты говоришь, без выдачи сообщения падает, то выход один - писать в лог-файл...
В принципе, 100 машин - это не ахти какая большая нагрузка. Про почтовые ящики и другие механизмы верхнего уровня забудь - они медленнее, чем сокеты, просто потому, что являются надстройкой над ними.
Писать программу надо было изначально многопоточной, даже пожно открывать несколько сокетов на несколько портов, каждый для своей задачи. Не обязательно своершенно разбивать на несколько прграмм, лучше несколько потоков в одной. Если все-таки захочешь на несколько - то используй файлы проецируемые в память (FIleMapping). Читать ДжРихтера Программирование Вин2000 для профессионалов, Финогенова Программирование в ВИндоус. Правда исходники там на С, но разберешься.

А теперь внимание, есть у меня подозрение, почему у тебя все тормозит и падает. Если ты используешь протокол UDP, то это известная проблема, и обойти ее трудно. Дело в том, что этот протокол низкоуровневый. Если в TCP пакет никуда не денется, даже если твоя прога в этот момент стоит и ковыряется в носу, то в UDP - не успел поймать - улетел пакет... Ну и, естественно, если программа не учитывает это и не передает данные повторно, то логика нгарушается, и все "необъяснимо падает". Используй протокол с соединением - TCP - он надежен и сетку грузит на порядок меньше.


 
creage   (2005-02-18 19:19) [23]

Сергей Ю., может поделишься кодом, который у тебя считает траффик на машинах? Очень надо! Я вот, тоже, пишу такую же прогу, но никак не могу найти, как реализовать свой прокси? Все, не то, все глючное... Может у тебя нормальное!? Поделись!


 
Сергей Ю.   (2005-02-19 17:39) [24]

Своего прокси у меня нет, на серваке раздающем инет под линуксом стоит какая-то прога которая считает траффик и пишет его в бд, я оттуда беру и сдираю бабки с клиента.


 
Arm79 ©   (2005-02-19 18:27) [25]

Ермак ©   (16.02.05 14:46) [22]
Одна поправка. Действительно, медленнее, чем сокеты, но не намного. Во всяком случае, 100 машин - не помеха. У нас так реалтаймовская система на них построена. Несколько тысяч клиентов. Система очередей обеспечивает гарантированную доставку сообщений.

Про многопоточность согласен. Нужна.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.038 c
3-1107439716
Basil
2005-02-03 17:08
2005.03.06
Отображение изменений в БД


3-1107446707
fess
2005-02-03 19:05
2005.03.06
blob -> Query


1-1108804782
Object
2005-02-19 12:19
2005.03.06
Уважаемые мастера, помогите разобраться с TList !!!!


1-1108850142
viktorovich
2005-02-20 00:55
2005.03.06
Вопрос по Memo


14-1108657168
TmpGuest
2005-02-17 19:19
2005.03.06
Delphi - язык или среда ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский