Ответы пользователя по тегу Проектирование программного обеспечения
  • Как сформировать технологический стек для веб-приложения с геоинформационной системой отслеживания грузового транспорта?

    Собирался использовать в качестве БД PostgreSQL или MySQL, а вот с выбором фреймворков и других компонентов возникают проблемы.
    Вот и замечательно. Обычно берут одну из этих СУБД, чаще первую.

    Если вы имеете в виду подготовительные этапы в виде декомпозиции, ТЗ, то эти этапы собраны в упрощенном виде.
    Надо продолжать собирать требования и на их основе искать решения.

    Нужно взяться за протоколы передачи данных.
    Начиная с геолокации:
    1. что за устройства устанавливаются на грузовой транспорт?
    2. куда должны передаваться данные?
    3. с какой частотой?
    4. какие ограничения у этих устройств?
    5. кто получатель геолокации? какие посредники при сборе геолокационных данных?
    6. что происходит при получении геолокационных данных?

    В зависимости от решаемых задач с данными подбирается стек технологий.

    Фреймворки обычно не играют решающую роль в выборе тех. стека, если только не набран опыт в некоторых из них.
    Ответ написан
    Комментировать
  • Веб-приложение на Django и фоновый процесс обработки данных, как сделать?

    2) Создать отдельное приложение, которые будет проводить контроль, результаты выкидывать в БД, а уже Django приложение будет при выполнении запроса передавать на сайт информацию с БД

    Можно при помощи отдельного приложения периодически опрашивать датчики и отправлять результаты в какую-нибудь внешнюю систему мониторинга или СУБД временных серий. На Джанго можно только показывать графики с TSDB / системы мониторинга. Роль оповещения могут взять на себя как Джанго, так и внешние средства.

    Использовать Celery - по необходимости, если есть нужда в фоновой обработке задач.
    Ответ написан
    Комментировать
  • Как обеспечить многопользовательскую поддержку в LLM?

    С точки зрения движка LLM есть один ресурс, который нужно делить на всех клиентов, переключаясь с одного на другого по обработке каждого вопроса. Поэтому движок должен уметь получать контекст пользователя, обрабатываемого в данный момент. Получив его, отправить запрос движку, подождать окончания ответа, а затем поставить текущий сеанс на паузу.
    Можно доработать схему, работая с пулом доступных движков.

    Добавлено
    Получив его ...
    имеется в виду, веб-приложением.

    От движка требуется способность переключаться между сеансами контекстов.
    Ответ написан
    Комментировать
  • Какой формат хранения сборника норм внутри приложения использовать?

    Первое, что в голову пришло - перелить это все в несколько разных JSON-файлов по разделам.
    Работать с набором JSON файлов не практично. Стоит работать с СУБД.
    Воообще, с начала стоит упорядочить все справочники, поработав над нормализацией данных. Нужно избавляться от неструктурированных данных, насколько это возможно.

    Следом пришла мысль завести базу на SQLite со всеми нормами, и уже ее разворачивать при запуске приложения.
    А это уже хороший выбор. Советую начать с неё.
    Для поддержки JSON: https://sqlite.org/json1.html

    Какой наилучший вариант для хранения справочника и быстрого парсинга оного для подгрузки в приложение?
    Все справочники подгружать сразу при инициализации программы не нужно. Некоторые особо критичные данные можно подгрузить в начале, но только если они не занимают сотню МБ в памяти.

    MongoDB точно не нужно выбирать на начальном этапе. Если на каком-то этапе будут чувствоваться ограничения SQLite, то стоит обратить внимание на Postgres.
    Ответ написан
    4 комментария
  • Как создать сервис для покупки билетов?

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

    И как ставить что конкретное место уже куплено
    Состояния: куплено/не куплено. Догадки о типе есть? Если нет, то надо взяться за задачу по-проще.
    Принято, что места не сразу покупаются, а только по факту оплаты. Значит, нужно еще хранить привязку состояния места к тому, кто его бронирует.

    Добавлено:
    Изначально предупреждаю, что без хороших навыков в проектировании получится полная ерунда. Я сам участвовал в проекте, в котором строили залы с рядами, с гибкой системой цен, возможностью бронирования мест и покупки покупателями. Знаю, что там много сущностей и бизнес модели тоже могут быть разными в зависимости от технических возможностей и реализации.
    Ответ написан
    Комментировать
  • Как сделать рассылку «ползучей»?

    А есть ли данные по распределению времени спустя которое пользователь приходит с момента рассылки?

    Нужно учитывать также и время, наиболее оптимальное для пользователя. Вот, пришла ему рассылка в неудобное время. Что будет делать пользователь? Или проигнорирует её вообще или отложит сеанс на потом.

    Для расчёта оптимального времени нужно знать среднее время сеанса пользователей и тогда, поделив кол-во пользователей на среднее кол-во возможных поочерёдных сеансов в сутки, получим скорость в кол-ве одновременных пользователей в один сеанс. Оно и является скоростью для рассылки пользователям.
    Тогда нужно наладить рассылку с периодичностью согласно скорости рассылки.

    И, возможно, нужно подумать также о том как решать проблему с одновременным посещением пользователей. Почему бот упирается в лимит и какой именно? Вычислительных ресурсов не хватает? Чего-то другого?
    Ответ написан
  • Как правильнее реализовать consumer'a rabbitmq в микросервисе grpc на go?

    Если я верно понял, вопрос о том как сделать так, чтобы можно было слушать gRPC и RabbitMQ с одного сервиса.
    Тогда можно в теле main.go
    app := NewApp()
    app.Start()

    в структуре App можно декларировать ссылки на хэндлеры соединений для gRPC, RabbitMQ.

    func (a *App) Start() {
      go listenGRPC()
      go listenMQ()
    }


    Микросервис запустит 2 горутины, каждая из которых будет слушать и обрабатывать свои соединения независимо.
    Ответ написан
    Комментировать
  • Какие можно использовать технологии/форматы для хранения бинарных пользовательских данных в десктопном приложении?

    Хочется хранить весь профиль пользователя (то, что обычно называют Vaults или Spaces в похожих приложениях) включая бинарные файлы (библиотеки изображений, мультимедиа, документов и т.п. файлов) в едином файле с быстрым доступом, вместо иерархии папок на файловой системе.

    Хранить в архивах ZIP, TAR/PAX, конечно, можно, но не сильно удобно: вместо работы с файлами придётся работать с библиотеками для работы с архивами: то записать в архив, то прочесть с него. С точки зрения производительности вряд ли будет столь же эффективно, как с файловой системой (даже с иерархией папок).

    Можно просто держать пользовательские настройки и файлы - отдельно. И ничего особо мудрить тогда не нужно и будет очень универсально. Хотя, с точки зрения кросс-платформенности, скорее всего, будет не так всё хорошо. Но если пользоваться библиотеками поддерживающими кросс-платформенность - так лучше, конечно.

    В настольных приложениях общие настройки и данные хранят в /etc , /usr/share , /usr/lib (Linux) , пользовательские - согласно спецификациям XDG и в Windows - в своих директориях.

    Медиа-файлы, конечно, должны быть доступны приложению простым образом, без необходимости писать/читать в/из архив(а). Особенно, если необходимо запустить ассоциированное с типом файла внешнее приложение, как видео-проигрыватель.

    Более гибкий вариант: использовать SQLite или какую-то K/V СУБД (тот же Redis!). В добавок к кросс-платформенности получаем возможность простым API работать с данными, не занимаясь мелочью типа открыть-закрыть файл, (де)сериализовать данные (настройки всякие), записать/прочесть блок данных. Ими занимается драйвер СУБД (обычно библиотека) и сама СУБД.

    Дополнительный гибридный вариант - использовать файлы локально и удалённо (с SDK): допустим с каким-нибудь объектным хранилищем, по протоколу S3 или другому. Как вариант, даже, использовать драйвер VFS для прозрачной работы с неким хранилищем, которое с точки зрения настольного приложения будет работать, как обычная ФС.

    Для примеров можно взять типичные приложения типа веб-браузера или какого-нибудь мессенджера и посмотреть какие технологии используются в них.
    Ответ написан
    Комментировать
  • Как спроектировать python приложению, реализующее консьюмера RabbitMQ и требующего HealthCheck?

    У приложения потребителя очереди должен иметься менеджер соединения с RabbitMQ. Как только соединение было установлено, запускается поток с веб-сервером и health-check. У потребителя очереди - основой поток, у веб-сервера - дочерний. Каждый работает независимо друг от друга. Для менеджера соединения с RabbitMQ может использоваться функция обратного вызова в библиотеке.
    Таким образом, при вызове /health (или /health/live) всегда возвращается статус 200.
    При внезапном разрыве соединения с RabbitMQ менеджер соединения приложения штатным образом пытается восстановить соединение (скажем, до N раз каждую секунду) и если облом, то выходим из приложения с ненулевым статусом (допустим, 1). Если приложение падает, то вместе с ним и health-check, что вызовет триггер по перезапуску приложения у процесса, который ведет мониторинг приложения.
    Мониторинг самого RabbitMQ обычно ведется отдельными от приложения средствами. RabbitMQ может запускаться как on premises, так и в SaaS (допустим, CloudAMQP).
    Ответ написан
    Комментировать
  • Подскажете по архитектуре "мультисервисного" приложения?

    НО! Они все пользуются одной и той же БД, из которой "черпают" данные "общего назначения": юзеры, ассеты, события и пр.

    Вот я и хочу "общую часть" вынести куда-то отдельно. И спрашиваю как это принято делать: библиотека? модуль? сервис?
    Можно сделать как подключаемую библиотеку (пакет Java), вынеся всё в ядро самое необходимое. Вокруг библиотеки ядра могут быть созданы какие-то библиотеки-обвески. Репозиториев библиотек может быть несколько, для простоты. Каждая библиотека может иметь свою версию и использоваться монолитом при сборке.

    Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....
    Ну зачем так? Нет смысла дробить даже на десятки, не говоря уже о тысячах.

    Начните с разделения по модулям, где у каждого компонента своя зона ответственности и нет переплетений зависимостей с другими компонентами.
    Нужно знать больше подробностей о предметной области и текущей архитектуре проекта, чтобы дать дополнительные советы.
    Ответ написан
    1 комментарий
  • Как правильно создать архитектуру приложения?

    Чтобы веб-сайт работал независимо от своего источника данных, нужно построить систему периодического обновления данных (скрейпинг, REST API или как угодно), занося данные в СУБД или сначала в очередь.

    но не понимаю парсить надо все марки или только выбранную
    все, чьи данные будут фигурировать на сайте.

    Далее, имея данные у себя, можно подумать о реализации запросов для фильтров из клиента и подобрать СУБД для этих целей.
    Ответ написан
    Комментировать
  • Как реализовать передачу файлов между двумя компьютерами?

    Существуют множество способов, один из которых - ZeroMQ - передача сообщений по сети и их обработка.
    Представим, что на компьютере 1 пользователь выбрал картинку.
    А где находится источник изображения, физически? Это общий ресурс для обоих компьютеров? По какому протоколу доступен?
    Предположим, речь об изображении, получаемому по HTTP. Тогда достаточно знать лишь его URL и так можно оповестить о событии при помощи ZeroMQ. Получив ссылку, программа на 2-ом компьютере скачивает изображение и отображает в нужной области экрана.
    Если нужно передавать данные с одного компьютера в режиме реального времени, то существуют технологии наподобие RDP, VNC и т.д.

    Добавил:
    какую БД можно использовать в моих целях
    не факт, что в ней есть необходимость.
    Ответ написан
  • Выбор архитектуры: web или desktop?

    Есть много вопросов к тому что из себя будет представлять конечный программно-аппаратный комплекс и для каких условий работы он предназначен. Одно дело, когда он расположен где-то в "тепличных" условиях в офисе/дома. И совсем другое дело, когда находится в шумном и пыльном цехе, где по кнопкам и экрану будут тыкать грязными руками. Ко второму должны предъявляться совсем другого уровня требования по надежности и не только.

    физически подключать свой ноут к серверу
    В смысле? Пойдут в серверную и будут подключать ноут к серверу кабелем? Что за бред? Если не бред, то по какому протоколу? И этот ноутбук нужен для постоянной работы с оборудованием? Или "сервером" будет достаточно мощный ПК? ПК и ноутбук в цехе? Серьёзно?

    с видеокамер на которых отображается деталь
    Это видеокамеры со встроенными экранами? Или же без, а изображение должно передаваться по кабелю на сервер?

    будет потоковое видео и его обработка
    К потоковой обработке видео, я полагаю, есть достаточно высокие требования и к железу и к коммуникациям (ширина канала, задержки, кабели, маршрутизаторы и т.д.). Должен быть чип DSP (если встраиваемое оборудование) или достаточно мощный процессор на ПК/сервере, который потянет обработку.

    web или desktop
    Десктоп - настольное оборудование, web - передача данных преимущественно по HTTP. Одно другому не мешает. Наверное, речь больше про выбор клиент-серверной технологии, таких как терминал-сервера с терминал-клиентами (Citrix и др.) или же комбинированного оборудования с периферией (допустим, ПК с подключеннами экраном, веб-камерой и другими устройствами). Из-за необходимости обработки видео терминал-сервер, похоже, не подходит.

    Если, скажем, брать (промышленный) вариант ПК, тогда обработка видео будет происходить на нём и по сети гонять ничего не надо. Тогда настольное приложение может состоять из модулей обработки видео, бизнес-логики и пользовательского интерфейса - всё в одном. Для настольных приложений обычно берут C# (WPF), C++ (Qt), Delphi, Java (Swing, JavaFX). Модуль обработки видео можно использовать, подключив как библиотеку (SO, DLL), реализованную на любом высокопроизводительном ЯП.

    Веб-технологии пока достаточно специфичны и ограничены. У меня нет пока представления как происходит пакетная обработка видео в вебе. WASM едва только пробует войти в веб и мало распространён. Одно дело на веб-приложении крутить фильмы, а нечто другое - обрабатывать на лету и встроить в пользовательский интерфейс. Так что к настольным веб-приложениям я пока несколько скептически отношусь. Они пока не предназначены для промышленного использования.
    Ответ написан
    Комментировать
  • Можно ли следить за изменениями в sqlite3 на локальном устройстве?

    К примеру, СУБД Apache CouchDB (NoSQL) умеет сама автоматически реплицировать данные автоматически. RQlite вроде бы также.
    Альтернативно можно при любых изменениях бота, подписавшись на изменения, отправлять событие по SQS и альтернативных протоколам, которые будет слушать другая копия программы и записывать в локальную БД.
    Ответ написан
    Комментировать
  • В чем преимущества таблицы uploads для проецирования загруженных файлов в базу данных?

    Аватарка - это другая сущность, которая сбоку от пользователя.
    Ответ написан
    Комментировать
  • Какую архитектуру приложения использовать для мониторинга?

    Предлагаю хранить данные в СУБД временных серий Prometheus и дать менеджерам доступ к админке в Grafana. Кто-нибудь один должен создать панели с графиками, подключая к СУБД источника данных.

    Добавлено
    Чтобы не тормозить основную СУБД приложения, создать slave replica и подключить Grafana к ней.

    Схема:
    App (W) -> DB master
    Grafana (R) -> DB slave
       \
        (R)
       Prometheus


    Добавлено
    Забыл, что Prometheus сама забирает метрики с устройств, у которых есть HTTP endpoint торчащие наружу и выдающие данные по строго заданому темпу сэмплирования (скажем, раз в 5 сек). Тогда может и слейв реплика нужна разве что веб-сервисам, которые берут данные с нее.
    Ответ написан
    3 комментария
  • Как организовать управление данными программы?

    Вместо операций над списками работаешь с БД. Брать данные с БД - обычное дело.
    Ответ написан
    Комментировать
  • Как впихнуть компилятор в бота телеграм?

    Странная задача какая-то.
    1. Компилятор "впихивать" не нужно. Достаточно скомпилировать 1 .exe со всеми 10-ю функциями внутри. Ну или 1 основной .exe, который умеет подгружать необходимый набор функций, каждая из которых скомпилирована в свою .dll
    2. Распространять exe+dll файлы через бот напрямую не нужно. Достаточно закинуть их на хостинг и выдавать ссылку на Zip ботом. Туда можно включить и конфигурационный файл с информацией о включенных функциях.
    Ответ написан
  • Можно ли с помощью rabbitMQ можно ли создать очередь в которой для каждого пользователя последовательно будет выполнятся запрос на другой сайт?

    Если ответ клиенту на его запрос выдается не сразу, а с задержкой в связи с ограничениями из-за API третьей стороны, то логично ввести систему заявок. При запросе регистрируют заявку клиента, заносят данные в СУБД, кладут в очередь и сразу выдается ответ с номером заявки и ожидаемым временем готовности. Когда обработчик очереди берет задачу с учетом задержки 5 секунд, получает ответ от API и заносит ответ в готовой для последующего чтения форме в СУБД для соответствующего номера заявки. Независимо от обработчика очереди, клиенты обращаются за получением готовых результатов. И если таковые готовы (проверка по колонке в таблице), выдается ответ. Если еще не готов, выдается следующее ожидаемое окно времени. И т.д., до лимита проверок.

    Если же перед ответом дожидаться пока пройдет 5 секунд, то такая система быстро захлебнется при наплыве запросов и будут исчерпаны ресурсы. Поэтому RPC не рассматриваю как подходящий вариант работы.
    Ответ написан
    Комментировать