Ответы пользователя по тегу Проектирование программного обеспечения
  • Веб-приложение на 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 не рассматриваю как подходящий вариант работы.
    Ответ написан
    Комментировать
  • Как держать тысячи процессов?

    Не нужно такого количества процессов. Для этого обходятся потоками одного процесса.
    Чтобы обрабатывать много HTTP запросов, можно обходиться несколькими процессами (как это делает Nginx). Информацию можно обновлять в независимых от бота процессах - воркерах.
    Ответ написан
    Комментировать