2016-07-04 2 views
1

Попытка выяснить, какие опции у меня есть, чтобы программа, выполняемая локально, получала свои вычисления или результаты вычислений из удаленного источника.Варианты технологии C# для хранения/управления расчетами удаленно

Задача: У меня есть приложение для сбора данных, которое считывает множество инструментов и собирает данные во время тестирования оборудования. Эти данные, а не различные формы агрегации (min, max, average и т. Д.), А также несколько вычислений, применяются к нему, и результат сохраняется в базе данных. Этот процесс выполняется несколько раз во время теста. Это приложение работает на машине, предназначенной для выполнения этого теста, но пользователи вне теста также должны выполнять те же вычисления для экспериментов, анализа данных и т. Д.

В прошлом наши два приложения (одно с оборудованием и один с пользователями) будут обновляться каждый раз, когда расчет будет изменен, а затем развернут повсюду. Это боль.

Вопрос: Я ищу возможные варианты решения этой проблемы.

То, что я нашел до сих пор.

1). WCF.

Нравится: Необходимо только обновить сервер, и обе программы теперь могут воспользоваться новым расчетом.

Концерн: DataContract будет содержать несколько классов, которые должны быть переданы функции (ей). (Общий размер «данных» может варьироваться от 1 МБ до 1 ГБ в зависимости от ситуации). Не уверен, что в настоящий момент объем данных является реальной проблемой.

2). Храните скомпилированные библиотеки DLL и загружайте/загружайте их. Запросить сервер для библиотеки классов. Загрузить. Загрузите его в память и используйте вычисления.

Нравится: Не нужно передавать много данных взад и вперед.

Концерн: DLL, который сейчас находится на каждом компьютере. Люди не могут быть принуждены обновить до правильной версии, что может вызвать проблемы. DLL на локальном компьютере может представлять угрозу безопасности.

+0

Дополнительная информация: При выполнении приложения для проверки оборудования имеется от 1 до 2 пользователей. За пределами тестирования около 10-20 пользователей, большинство из которых только смотрят на результаты расчетов. (По сути, запрос к базе данных). Из этой группы есть небольшое подмножество, которое в настоящее время имеет возможность пересчитывать результаты. Я не знаю, как часто это выполняется группой, но с любыми пользователями, если вы забираете что-то, что они могут в настоящее время делать, они склонны бороться с ним, хотя на практике они, вероятно, никогда не будут использовать эту функцию ... –

+0

Все эти процессы, повторил еще 25 раз. IE) У меня около 25 тестовых систем, которые изолированы друг от друга, но мы стараемся, чтобы системы программного обеспечения были одинаковыми, чтобы упростить поддержку инструментов. Я не забочусь о том, чтобы увязнуть сервер, поскольку каждая система имеет свой собственный сервер. Меня больше интересует количество данных, передаваемых через сеть, и общая отзывчивость приложения. –

ответ

0

Попробовав несколько вариантов, которые мы обнаружили, что передача данных туда и обратно было слишком громоздким. Вместо этого мы решили динамически загружать DLL со всеми требуемыми вычислениями и использовать набор интерфейсов для определения поведения.

Что я узнал и нашел, было аккуратно, что я могу хранить DLL в базе данных и загружать его непосредственно в память без необходимости скопировать его на жесткий диск, тем самым обеспечивая дополнительный уровень защиты. Использование SQL и FILESTREAM. Он также предоставляет своего рода контроль версий, в котором я могу выбрать, какую версию DLL загружать из базы данных и вычислять/пересчитывать различные значения.

// Read in File 
using (SqlFileStream fileStream = new SqlFileStream(path, transaction, System.IO.FileAccess.Read)) 
{ 
     byte[] buffer = new byte[size]; 
     int bytesRead = fileStream.Read(buffer, 0, buffer.Length); 

     // Load Assembly 
     Assembly DLL = Assembly.Load(buffer); 

     Type myInterfaceType = DLL.GetType("MyNamespace.MyClass"); 

     // Get access to the root interface 
     IMyInterface myClass = (IMyInterface)Activator.CreateInstance(myInterfaceType); 

} 
0

Это довольно сложный вопрос, и я думаю, что существует множество способов, которыми вы могли бы попытаться его решить. Вот несколько идей, которые могут получить вы начали

  1. Используйте Akka.Net и посмотрите на Akka.Remote, который может быть в состоянии решить проблему удаленного Deploy. Но я не уверен, что это будет соответствовать тому, что вам нужно, если у вас есть пользователи, которые решили присоединиться к кластеру ad hoc, а не иметь фиксированный набор мест для распределения вычислений?

  2. Если вычисления являются простыми математическими формулами, вы можете сохранить их в виде набора правил и загрузить формулы. То есть принимая больше подхода к движению правил. См. Возможно C# expression trees

  3. Браузерное решение. Это явно выигрывает от простоты точки удаленного развертывания. Существует много вариантов, если вы не хотите использовать JavaScript, например.PureScript, F # (Fable), ClojureScipt, ELM и, возможно, даже C# с JSIL/Bridge. Переход от рабочего стола к сети достаточно большой сдвиг, хотя так убедитесь, что вы знаете, что вы находитесь в :)

+0

Также я думаю, что многое зависит от того, насколько вы действительно хотите локального или удаленного. То, что я не понимаю из вашего вопроса, - это то, что нужно рассчитать локально или удаленно. Требуется ли каждому пользователю только агрегированные данные? Если это так, им действительно нужно делать какие-либо вычисления или просто просматривать результаты? Если есть удаленные вычисления, то подход, основанный на WCF/услуге, означает, что ваш сервер будет выполнять большую работу и передавать много данных. В какой-то момент вам нужно учитывать это тоже – Andre

+0

Спасибо за информацию. Мне нужно будет немного почитать на Akka.Remote. (Его внешний вид очень похож на структуру актера, с которой я знаком в LabVIEW). Деревья выражений C# не будут работать, потому что вычисления слишком сложны. Регрессия, таблицы поиска, многочлены 4-го порядка и т. Д. (Я рассчитываю производительность для турбинных двигателей). Я рассмотрел решение для браузера, но команде сейчас не комфортно двигаться в этом направлении. –

+0

Да, переход на браузер основан на большом шаге :) Еще один вариант - посмотреть на решение сетки/сетки. Опять же, это действительно зависит от того, можете ли вы/хотите полагаться на наличие клиентов или если они присоединяются к ad-hoc для просмотра только результатов. В любом случае удачи, звучит и интересная проблема. – Andre

Смежные вопросы