powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по архитектуре приложения (ASP.NET, C#)
25 сообщений из 46, страница 1 из 2
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39371854
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем доброго дня.

стоим перед выбором, как правильнее спроектировать приложение.

Приложение будет проверять счета от поставщиков(например сверка кол-ва и цен).
Счета будут приходить как бумажные, так и в электронном виде.
бумажные будут вбиваться через web, который планируется сделать в ASP.NET (возможно Core).

т.е. проект будет состоять из веб-части и как минимум одного Worker'а, который с Web ничего общего не имеет

мой вопрос в том, насколько богомерзко все эти процессы засунуть в ASP.NET (напрмер запускать их отдельным Thread'ом в Startup.cs)?

Просто, если пойти другим путем(для Worker'ов делать отдельное приложение), то нужно как-то связывать web и процессы(например для оповещения Worker'а о поступлении нового счета).
А это значит или настроить между ними соединение(на ум приходит WCF) или делать каждые пару минут проверку, не появились ли новые счета в БД. В общем ни одно из решений мне не нравится как-то.

Что скажете?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39371873
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот попытался схематично обозначить варианты решений







альтернативные варианты приветствуются
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39371986
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs,

Вообще можно по разному. Точнее как вам удобно/умеете.
А так я бы предложил сделать так.

Сделать для проверки счетов отдельное приложение/сервис (СПС).
СПС получает данные из очереди (MS MQ)
Результат проверки пишет в БД и/или отправляет в другую очередь.

Есть "клиенты" веб (для ввода в ручную) и SOAP(для электронного)
Которые отправляют ч/з очередь соответствующие счета в СПС.

Пишется отдельно приложение для просмотра результатов проверки.
Данные берутся из БД и/или очереди.

Где-то так.
Но еще раз повторю. Лучше в начале сделайте как можете/умеете.
Потом делаете рефакторинг. ;-)
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372108
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
хотелось бы сразу все сделать по-хорошему
про MS MQ почитал - интересно
из плюсов отметил, что сообщения не теряются даже в случае временной недоступности адресата
из минусов - по умолчания, я так понял, сообщения передаются только в контексте одного компьютера, для отправки на другие ПК, используется Active Directory?

что вы имеете в виду под СПС?
на тему варианта номер 1, вот набрел на статью http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
значит, кому-то еще приходит в голову такое порно ))
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372111
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs,

IMHO нормальная архитектура должна рассматривать отказоустойчивость.
Если документы в базе данных то они под транзакционным контролем, и взаимодействие с сервисом проще так-же пустить под транзакционный контроль.
Вариант 1/2B: добавленный документ коммитед, комуникациа с сервисом или/сервис недоступен. Как будете востанавливать процесс?
Вариант 2A: вполне рабочий. Можно так-же использовать транзакционную очеред как отдельный компонент для доставки нотификаций к сервису но IMHO в вашем случае преимуществ не вижу а недостатки очевидны: +1 компонента, которую надо поддерживать, синхронный бекап не получите.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372157
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за мнение
mikronВариант 1/2B: добавленный документ коммитед, комуникациа с сервисом или/сервис недоступен.
в варианте 1 как это может произойти?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372158
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

в варианте 2B предыдущий оратор предложил использовать MS MQ например
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372166
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsспасибо за мнение
mikronВариант 1/2B: добавленный документ коммитед, комуникациа с сервисом или/сервис недоступен.
в варианте 1 как это может произойти?
Элементарно: сервисным процесс завершился по ошибке или просто по сбою питания.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372171
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsmikron,

в варианте 2B предыдущий оратор предложил использовать MS MQ например
Конечно можно. Но как будете бэкапить синхронно базу и очередь? А теперь представьте что вам нужно восстановить бэкап. Как будете наполнять очередь?

Я бы взял 2А и если нужно уменьшить задержку в обработке документов, то дополнить его не трензакционным, не персистентным, легковесным возможно даже не гарантированным каналом для оповещения сервиса о поступлении новых данных.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372191
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronyabsспасибо за мнение
пропущено...

в варианте 1 как это может произойти?
Элементарно: сервисным процесс завершился по ошибке или просто по сбою питания.
вы правы
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372194
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronКонечно можно. Но как будете бэкапить синхронно базу и очередь? А теперь представьте что вам нужно восстановить бэкап. Как будете наполнять очередь?
как я себе это представляю:
клиент:
1. сохраняет invoice в БД
2. если коммит без ошибок, то пишем в очередь
сервис:
1. читает сообщение из очереди
2. обрабатывает invoice
3. стирает сообщение из очереди
mikronЯ бы взял 2А и если нужно уменьшить задержку в обработке документов, то дополнить его не трензакционным, не персистентным, легковесным возможно даже не гарантированным каналом для оповещения сервиса о поступлении новых данных.
задержка вообще не волнует
хоть полчаса
P.S. Сеть продуктовых магазинов все равно платит в последний день ))
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372365
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs,

1. IIS по умолчанию не предназначен для запуска фоновых процессов, он вырубает приложение через 20 минут бездействия, поэтому нужен внешний процесс
2. очередь можно построить либо на реляционной базе данных, либо с использованием MSMQ и аналогов
3. запуск обработки может быть либо по таймеру, либо когда появляются данные

решения:
1.
1.1. загуглите hangfire и аналоги, эта штука будет вызывать фоновые процессы на вашем IIS сервере, что-то вроде планировщика как услуга
1.2. если по каким-то причинам не хочется использовать внешний сервис - обернуть свой планировщик в виндовый сервис, загуглить Quartz.NET или аналоги и использовать в качестве основы
2. я не вижу особой сложности приложения, запредельной производительности, поэтому для простоты необходимо использовать реляционную базу данных как очередь. MSMQ надо изучать, разворачивать, настраивать, использовать провайдеры/библиотеки для доступа к функциям. лишнее звено, тем более, если надо будет синхронизировать данные в БД и в очереди с учетом транзакции - это потенциальная точка риска, а однозначных плюсов я не вижу. делаете таблицу в БД, туда сливаете свои документы, добавите статус (новый, в обработке, обработано), потом запускаете фоновый поток, который будет брать очередные 10-100 записей и обрабатывать их. если понадобится увеличить производительность - запускаете второй поток и синхронизируете доступ к таблице через сериалайзед транзакцию и изменение статуса новый -> в обработке -> обработано
3. по умолчанию планировщик запускает фоновый процесс по расписанию (каждую минуту например), так же желательно предусмотреть, чтобы следующий цикл не запускался, пока не завершится предыдущий. можно предусмотреть внеочередной запуск обработки. этот метод можно будет вызывать из UI, когда например пользователь нажмет кнопку "сохранить"

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

вопросы?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372551
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsспасибо
хотелось бы сразу все сделать по-хорошему
про MS MQ почитал - интересно
из плюсов отметил, что сообщения не теряются даже в случае временной недоступности адресата
из минусов - по умолчания, я так понял, сообщения передаются только в контексте одного компьютера, для отправки на другие ПК, используется Active Directory?

что вы имеете в виду под СПС?
на тему варианта номер 1, вот набрел на статью http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
значит, кому-то еще приходит в голову такое порно ))
А агрументы есть, почему это порно? :) Годами работает без проблем.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372552
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs, нагрузка-то какая предполагается?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372661
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА агрументы есть, почему это порно? :) Годами работает без проблем.
порно - это я про вариант номер 1
ну потому что IIS создан для хостенья веб-приложений и, как тут уже один из ораторов высказался, по умолчанию он настроен укладывать спать приложение после Х минут неактивности

нагрузка, думаю, смешная будет
в день поступает приблизительно 200-300 счетов
около 20 пользователей
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39372752
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsнагрузка, думаю, смешная будет
в день поступает приблизительно 200-300 счетов
около 20 пользователей
hangfire или аналог и запускать фоновую задачу после каждого "сохранить", можно передавать ид документа по одному или пачкой
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373036
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsskyANAА агрументы есть, почему это порно? :) Годами работает без проблем.
порно - это я про вариант номер 1
ну потому что IIS создан для хостенья веб-приложений и, как тут уже один из ораторов высказался, по умолчанию он настроен укладывать спать приложение после Х минут неактивности

нагрузка, думаю, смешная будет
в день поступает приблизительно 200-300 счетов
около 20 пользователей
200-300 счетов в день, 20 пользователей? :)

При такой нагрузке никакой worker не нужен. Прилетел файл, сохранили, Task.Run. Всё.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373038
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и даже Task.Run не нужен.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373156
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs, skyANA
еще бы знать время обработки одного документа
* если будет минута и выше, пользователям будет казатся что сайт/приложение зависло, поэтому было бы хорошо сделать фоновую обработку
* если обработка занимает несколько секунд - то да, делать ее сразу же, и никаких фоновых задач
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373206
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77если будет минута и выш
а вы не делайте минуту и выше.
Что можно в БД делать 60 секунд с 4-мя 10-тью ядрами?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373251
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77yabs, skyANA
еще бы знать время обработки одного документа
* если будет минута и выше, пользователям будет казатся что сайт/приложение зависло, поэтому было бы хорошо сделать фоновую обработку
* если обработка занимает несколько секунд - то да, делать ее сразу же, и никаких фоновых задач
ТС пишет: "Приложение будет проверять счета от поставщиков(например сверка кол-ва и цен)".

Это что за счёт такой должен быть, чтобы его больше минуты обрабатывать?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373252
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже если минуты, то почему именно фоновый процесс на сервере? На клиенте Web Worker пишется за 15 минут.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373296
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да кто знает что там, может опрос десятка внешних систем по 30 секунда каждая

про веб воркер не знал, не пользовался, не могу ничего сказать, а если случайно браузер закроют - что будет?
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373298
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77да кто знает что там, может опрос десятка внешних систем по 30 секунда каждая

про веб воркер не знал, не пользовался, не могу ничего сказать, а если случайно браузер закроют - что будет?
Что-то на схеме нет внешних систем :)

Если браузер закроют, то ничего не будет.
...
Рейтинг: 0 / 0
Вопрос по архитектуре приложения (ASP.NET, C#)
    #39373466
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТС пишет: "Приложение будет проверять счета от поставщиков(например сверка кол-ва и цен)".

Это что за счёт такой должен быть, чтобы его больше минуты обрабатывать?

Не счет обрабатывается, а проверка.
Причем не понятно, с какая там будет задержка.
Хорошо если нет связи с внешними системами.
А если есть, а на "той стороне" оператор ручками делает проверку счета. :-)

Но опять же это зависит от конкретной постановки задачи.
Возможно очередь и асинхронная обработка проверки счета это оверинжениринг.
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по архитектуре приложения (ASP.NET, C#)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]