|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
.NET 3.x Грязное копирование данных30.09.2015, 08:59. Показов 3012. Ответов 41
Метки нет (Все метки)
Есть некое хранилище данных в произвольной форме (лист, таблица, словарь, массив и т.д. - можно выбрать любой вариант). Хост-приложение с этим хранилищем беспрерывно работает(изменяет). Множество клиентов могут подключатся и запрашивать эти данные.
Проблема в том, что при рассылке данных объект-хранилище захватывается на некоторое время и с ростом числа клиентов, одновременно требующих эти данные, время отклика сильно возрастает(что логично) вплоть до полной блокировки логики программы. Вопрос: можно ли сделать что-то вроде "грязного" чтения таблицы в SQL? Т.е. получить данные не блокируя к ним доступ для основного приложения? Или любые другие варианты для решения проблемы. Какая-нибудь общая область памяти?.. ВАЖНО: нет 3.5.
0
|
|
| 30.09.2015, 08:59 | |
|
Ответы с готовыми решениями:
41
Оффтоп из темы "Грязное копирование данных"
Как запретить копирование данных с диска |
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
||||||||||||||||||||||||||
| 02.10.2015, 09:04 [ТС] | ||||||||||||||||||||||||||
|
Вот весь код. Это худо бедно работает. Убрал всю шелуху.
Кликните здесь для просмотра всего текста
Интерфейс сервиса(тип возвращаемого объекта не принципиален):
Клиент:
Попробовал перевести сервис на "Per-Session", но как перевести с HttpBinding на TcpBinding пока не понял
0
|
||||||||||||||||||||||||||
|
|
|||
| 02.10.2015, 10:17 | |||
|
Но источники не советуют так делать. В идеале нужно передавать не схему данных (таблицу), а сами данные, в виде массива (или еще какой-то коллекции). В остальном да, код простой, попробую сделать то же у себя. Что именно вам в нем не нравится? Скорость работы?
0
|
|||
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
| 02.10.2015, 11:28 [ТС] | |
|
insite2012, как я писал выше, способ передачи данных не принципиален - я пробовал передавать, например, массив структур. Это дело не меняет.
Не нравится то, то что при увеличении числа пользователей(в моем конкретном случае начиная с 5 штук) полностью завешивается серверная часть. Причем если закрыть несколько клиентов(т.е.убрать из очереди на выполнение) без перезагрузки, то работа сервиса восстанавливается. Машина-хост, конечно, слабенькая, но не настолько. ЗЫ логику GetData я урезал до минимума, для тестов. там буквально создается таблица с несколькими записями и все. Добавлено через 10 минут Нужно сделать так, чтобы запросы от клиентов не выстраивались в синхронную очередь. Добавлено через 31 минуту Результаты теста такие: запрос посылается раз в 1 секунду, ответ получается за 0.25 секунды(включая всю серверную логику). Как только количество клиентов возрастает до 4х штук, то на суммарное обслуживание всех запросов начинает тратится 1 секунда впритык(4 * 0.25). При более чем 5 клиентах появляется накапливающаяся очередь и дальше начинаются проблемы.
0
|
|
|
|
|
| 02.10.2015, 12:53 | |
|
z0rg, я тут немного поразмыслил, и вот какие выводы.
1. Службу лучше делать как службу уровня вызова, она лучшая по масштабируемости. 2. Исходы из п.п. 1 все вызовы должны быть синхронными, асинхронность не допускается (поскольку по выходу из метода и возврату управления клиенту экземпляр службы сразу же уничтожается. 3. Попробовать добавить в коллекцию аспектов поведения службы аспект, отвечающий за регулирование нагрузки(ServiceThrottlingBehavior, вот он: https://msdn.microsoft.com/ru-... .110).aspx). 4. У меня есть одна работающая служба на хосте в сети, я могу добавить в нее тестовый метод, примерно как ваш, дам ссылку, и протестируете его на производительность по числу подключенных клиентов. Посмотрим, не влияет ли ваша машина, где находится хост.
1
|
|
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
| 02.10.2015, 13:39 [ТС] | |
|
insite2012,
1,2. В данной задаче производительность - первичное требование, а масштабируемость и всякие "шашечки" по возможности. Поэтому я готов испробовать любые извращения, чем, собственно, и занимаюсь сейчас. А вот если что-то получится, тогда и буду думать о том, насколько по-индусски вышло и стоит ли это применять. 3. Сейчас попробую. 4. Не вижу пока смысла. Если выясниться, что это мой хост не тянет, то мне от этого легче не станет =). Если я не найду приемлемого решения, то придется отказаться от удобного WCF и придумать что-то более низкоуровневое. Добавлено через 17 минут ServiceThrottlingBehavior ни с минимальными ограничениями, ни с максимальными никак вообще на работу не влияет. Я даже засомнивался, правильно ли я это использовал, но попробовав добавить эти правила другим способом - убедился в их бездейственности в данном случае.
0
|
|
|
|
||
| 02.10.2015, 14:34 | ||
|
Ну и если хостовый компьютер действительно слаб, то вряд ли что-то сможете с этим сделать, по крайней мере, с WCF. Возможно, используя что-то более низкоуровневое...
1
|
||
|
Master of Orion
|
|
| 02.10.2015, 15:21 | |
|
z0rg, почитайте эту статью
1
|
|
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|||
| 02.10.2015, 16:07 [ТС] | |||
|
insite2012, да где же тут производительность, когда маленький запрос вешает даже фоновые потоки =)?
Я все же решил проверить свой хост на другой машине, благо у меня под рукой множество машин с разными системами. Закинул на комп с win7 и нормальным железом - тот же результат(для точности я убрал всю логику и оставил простой sleep). Что это за хост, который не в состоянии обслуживать несколько клиентов параллельно?... Я уверен, что если я поставлю SQL сервер на ту слабую машину, то она будет в состоянии обслуживать сотню пользователей с такими же запросами. Пускай и медленно, но будет. Опять возвращаюсь к мысли:
0
|
|||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
|
| 03.10.2015, 08:17 | |
|
z0rg, а чем класс RunMetod не устраивает? Способен без проблем обработать хоть сотни тысяч запросов к источнику от тысяч потоков без всякого зависания системы. Причем запись можно делать асинхронно: “плюнул” порцию данных в источник и забыл. Чтение должно быть синхронным, нужно дождаться результата.
0
|
|
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
||
| 05.10.2015, 08:42 [ТС] | ||
|
Как бы то ни было, в ходе разбирательств выяснилось, что проблема не связана с источником данных вообще.
0
|
||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
|||
| 05.10.2015, 11:33 | |||
|
1
|
|||
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
| 05.10.2015, 14:35 [ТС] | |
|
Готово! Ларчик просто открывался!
Можете начинать думать про меня всякие гадости.Я с самого начала чувствовал, что что-то не так... Я для удобства отладки сервис сделал на винформсе - и в этом было все дело! Когда я начал пробовать кое-что из той статьи от Psilon, я сделал консольный хост и все просто заработало с настройками из коробки (c per-call и т.д). Нет слов... Несколько дней долбления в дверь, а она открывалась внутрь... Правда, теперь есть косяк с вызовом событий, но это уже мелочи. В общем, всем плюсов, пасибо, расходимся.
0
|
|
|
|
|||
| 05.10.2015, 14:39 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
| 05.10.2015, 15:13 [ТС] | |
|
insite2012, ненене, на тот момент никаких событий не было. Я же говорил, что для тестов я оставил голые вызовы, которые слипами имитировали вид бурной деятельности.
Добавлено через 3 минуты ЗЫ сейчас, кстати, все и с событиями работает очень быстро, никаких дедлоков. просто пока что сама "карусель" запускается кривым способом. завтра придумаю как сделать красиво.
0
|
|
|
|
||
| 05.10.2015, 15:39 | ||
|
Но есть способ устранения (реентерабельность+CallbackBehavior).
0
|
||
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
| 05.10.2015, 15:57 [ТС] | |
|
В моем случае виновата была серверная сторона. Сейчас связка <ВинФорм-клиент + консольный хост> летает. Конечно, если при исключении ВинФорма и с клиентской стороны произойдет еще прирост производительности - я буду очень рад, но уже сейчас работа удовлетворительна.
0
|
|
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 05.10.2015, 16:08 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|||
| 05.10.2015, 16:18 [ТС] | |||
|
0
|
|||
|
Master of Orion
|
|
| 05.10.2015, 16:29 | |
|
z0rg, а зачем вам вообще винформа? Всё это прекрасно оформляется как windows service - просто запускаете службу и включается АПИ, который отдает данные. Надоело или обоновить надо - взяли и остановили. Я такую штуку делал, очень удобно.
0
|
|
|
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
|
|
| 05.10.2015, 16:29 [ТС] | |
|
ЗЫ стоит добавить, что я не изобретаю велосипед на коленке. и конкретно эта небольшая задача не есть АСУТП, а только косается другой системы в точке получения данных.
0
|
|
| 05.10.2015, 16:29 | |
|
Сделать копирование в ссылочном типе данных как по значению, так и по ссылке
SqlBulkCopy копирование данных из разных источников Копирование базы данных первичный ключ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|