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

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

    Мне показалось, что архитектура переусложнена. Может, чего-то недопонял. Prometheus метрики забирает (scraping) со всех узлов самостоятельно через http: //apiendpoint/metrics .

    То есть схема такова (data flow):
    [api 1..N] => Prometheus scraper => Prometheus TSDB

    Не понял зачем весь огород с очередями и воркерами. Какую задачу он призван решить?
    Прометей не может обращаться напрямую к узлам? А даже если нет, то можно предоставить ему доступ через прокси-сервер.

    Клиент моего продукта получает крайние справа данные за сутки/неделю/месяц по названию группы (group_name) в виде графика
    Для получения данных есть язык запросов PromQL по API.

    В конфигурации Prometheus можно переопределить интервал сбора метрик с узлов. Каждый узел должен уметь отдавать метрики в заданном формате. Благо, есть библиотеки. Средствами библиотеки пишем метрики (новый запрос к АПИ от клиента - делаем increment группе), которые автоматически агрегируются необходимым образом для Prometheus и выдаются по запросу скрэпера. Ответственность за тайминг сбора метрик лежит на Прометее.

    Данные временных серий хранятся в БД Prometheus в оптимальном виде. Или в совместимой с ней VictoriaMetrics, если того мало.

    Prometheus для хранения двух метрик users_amount{group=} и users_online{group=}
    Вроде бы OK.

    тысячи лэйблов в Prometheus - это ок?
    А зачем тысячи меток? Из-за кол-ва групп?
    Цититрую:
    CAUTION: Remember that every unique combination of key-value label pairs represents a new time series, which can dramatically increase the amount of data stored. Do not use labels to store dimensions with high cardinality (many different label values), such as user IDs, email addresses, or other unbounded sets of values.
    То есть не рекомендуют.

    если в Prometheus настроена pull модель для двух метрик, то он меня будет пинать раз в 5 минут делая два запроса по каждой метрике и я ему отдаю пачкой данные для тысяч лэйблов, у меня верное понимание?
    Метрики собираются одинажды для узла (endpoint), который должен представлять из себя отдельную группу со своими парами users_amount, users_online. Если так нельзя, то тогда Прометей тогда, наверное, не подходит. По крайней мере, я так себе представляю.

    Если по каким-то причинам Прометей не устроит, тогда можете рассмотреть ClickHouse, куда данные нужно отправлять пачками (с воркеров или как хотите). Но тогда всю логику сами разгребать будете. Redis'ом или как хотите.
    Ответ написан
  • Правильно ли копировать данные между микросервисами?

    Каждому микро-сервису необходима разная информация по фильму.
    Возможно, через брокер сообщений нужно отправлять достаточное количество информации, необходимой для работы каждого сервиса. Тогда не нужно обращаться за данными к другому.

    Те берут необходимые данные сохраняют в локальную бд и работают с ними. С этим возможна куча проблем в виде несогласованности данных и т. п.
    Надо бы прояснить отчего несогласованность и прочие проблемы. Иначе как можно помочь, не зная проблемы?

    Паттерн Event Sourcing говорит о том, что все изменения состояния приложения должны быть представлены как последовательность событий.
    Я не знаю какой брокер сообщений используете вы, но для возможности реконструировать всю последовательность изменений заново в каждом микросервисе, нужно изначально хранить их в каком-то центральном журнале событий. Apache Kafka весьма подходит для этих целей.
    Если не Kafka, то нужно обеспечить возможность отправлять одно и то же событие по нескольким каналам, чтобы каждый из микросервисов смог получить всю необходимую информацию.
    Изменения в СУБД должны происходить атомарно, чтобы избежать несогласованности данных.

    Шаблон источников событий
    https://martinfowler.com/eaaDev/EventSourcing.html
    https://microservices.io/patterns/data/event-sourc...
    Ответ написан
  • Как правильно организовать очереди?

    А в чём проблема отправлять из сервис_1 в брокер и идентификатор пользователя и идентификатор сервиса (экземпляра), к которому он подключен? Тогда каждый экземпляр сервис_2 будет знать кому предназначена команда. Не вижу смысла плодить очереди на каждого пользователя (и тем более заниматься их управлением) и даже для каждого экземпляра сервис_1.
    Так что я за более простой вариант:
    Или это все одна очередь и каждое сообщение должно быть вычитано каждым инстансом сервиса_1 а затем отфильтровано?
    Ответ написан
  • Какие основные процессы могут быть в бэк-энде мобильного приложения?

    С позиции разработчиков, в общих чертах мобильное приложение отправляет какой-то запрос на сервер, а тот при его получении обрабатывает и возвращает ответ затем идет обработка ответа. Мобильное устройство управляется пользователем, имеет свой пользовательский интерфейс, имеет какие-то данные на самом устройстве и умеет обмениваться ими с сервером, находящимся где-то удаленно и доступным по интернету.
    У сервера есть API, предоставляющий набор публичных сервисов мобильному приложению и, возможно, другим видам.
    На сервере может присутствовать аутентификация пользователя, если необходимо представлять персональные услуги. После идентификации пользователя программа на сервере выполняет какие-то действия. Возможно, обновляет данные в СУБД и выдает ответ.
    Разработчик мобильного приложения должен уметь построить пользовательский интерфейс, в котором будет продумана бизнес-логика приложения а также логика взаимодействия с сервером.
    Разработчик программы на сервере должен уметь построить программу, которая будет принимать различные запросы от клиентов и уметь их обрабатывать согласно бизнес-логике, а также продумать структуру данных в СУБД и способы взаимодействия с ней.
    Валидацию данных принято выполнять и на клиенте и на сервере.
    В построении мобильного приложения и серверного приложения есть уйма нюансов помимо применяемых технологий.
    С позиции менеджера продукта есть тоже много забот.
    Ответ написан
    Комментировать
  • Сбор и обработка данных по APIs на NodeJs?

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

    Можно создать 100 потоков или 100 корутин и отправлять данные в очередь, а оттуда в БД.
    Ответ написан
    Комментировать
  • Правильное добавление/обновление таблиц в базах данных?

    Можно в Memcached выполнять агрегацию лайков пачками по 10k плюс ограничением по времени до 5 сек. и затем обновлять агрегированные значения в БД. Напрямую или через очередь.
    Для начала хотя бы так.
    Кроме этого, на клиенте можно оттягивать отправку после 1-го клика при помощи техники debounce. Также по теме https://levelup.gitconnected.com/debounce-in-javas...
    Ответ написан
    3 комментария
  • Какие технологии использовать для постоянного мониторинга страниц?

    1-й сервис периодически сканирует результаты позиций сайтов. При получении каждого отдельного результата сайта или определенного их количества (скажем, 10), отправляется задача в очередь "ПозицииСайтов".
    2-й сервис-воркер в необходимом количестве экземпляров получает задачи по сканированию из "ПозицииСайтов". При этом фиксируется в БД начало операции сканирования сайта и по окончанию проверки помечается что задача выполнена.
    Ответ написан
    Комментировать
  • Как архитектурно организовать поисковый микросервис на golang?

    Все верно. Самая обычная практика.
    Только вместо Redis можно и Memcached (быстрее). https://medium.com/@Alibaba_Cloud/redis-vs-memcach...
    Использовать in-memory k/v хранилище как советует Сергей Тихонов так же можно, однако в таком случае при перезапуске сервиса (ошибки и т.д.) потеряются данные в кэше и уйдет время на разогрев кэша.
    Ответ написан
    Комментировать
  • Как синхронизировать веб-приложение и андроид приложение на java?

    Я представляю себе архитектуру проекта так:
    Служба-процесс, которая
    парсит данные, выполняет расчёты и добавляет в базу данных.

    Веб-служба, обслуживающая HTTP запросы от мобильного приложения. Когда поступают запросы по парсингу, она добавляет задачу в очередь, а служба-парсер обрабатывает ее. Если что-то быстрое, то по месту и обновляет данные.
    Ответ написан
    Комментировать
  • Выбор коммуникации между сервисами?

    По окончанию регистрации необходимо отправить уведомление, поэтому логично сделать это через брокер сообщений (RabbitMQ и др.).
    Служба Уведомления представляет из себя потребителя очереди и рассылает письма асинхронно относительно регистрации.
    Сам транспорт менее важен чем то когда событие будет обработано.
    Транспортом может быть и HTTP, и WebSocket.
    Ответ написан
    Комментировать
  • Как реализовать распознавание авто номеров на Питоне через Opencv?

    Нужно разбить задачу на подзадачи:
    1. Программная часть:
      • периодически захватывать изображение с камеры для определения наличия авто перед воротами (определение наличия транспортного средства на изображении)
      • распознавание области номера автомобиля (определение координат параллелограмма на изображении) и выравнивание области
      • непосредственно распознавание номера авто (OCR)
      • логика обработки номера авто

    2. Аппаратная часть: как взаимодействуют между собой различные устройства

    OCR: достаточно использовать Tesseract
    Поиск: распознавание номера автомобиля opencv
    Ответ написан
    Комментировать
  • Как передавать данные с различных датчиков?

    Думаю, лучше начать со статьи Мониторинг температуры гермозоны с помощью 1-wire ....
    Когда дело дойдет до выбора системы мониторинга, то кроме Zabbix есть и другие варианты.
    Ответ написан
    Комментировать
  • Какую выбрать архитектуру для распределённой системы по обработке изображения (docker, микросервисы)?

    Исходя из
    этого
    Не знаю, насколько вам интересно будет погружаться в саму бизнес-логику. Вкратце она такая:
    - Service1 делает обработку изображения. OpenCV + python скорее всего (нахождение контуров, вырезка и прочее). На выходе будет порядка 3-9 изображений
    - Service2 делает распознавание. Тут или tesseract или нейронная сеть. На выходе несколько текстов.
    - Service3 делает обработку нескольких текстов и выдаёт результирующий текст. Скорее всего тут будут python-библиотеки.
    уточнения, вижу архитектуру такой:
    Поскольку сервисы взаимосвязаны между собой так, что их нужно вызывать поочередно, то логично связать обработку данных при помощи очереди сообщений:
    Изображение (ID=123) -> Очередь Нарезка Изображений (OpenCV) -> каждое полученное нарезанное изображение кладём в Очередь OCR -> распознанный текст кладём в Очередь Анализ Текста.

    Для обработки изображения в Очереди Нарезка Изображений кладем его по некоторому пути (им может быть путь в AWS S3) и воркер этой очереди с инстанса некоторой ВМ обращается по заданному пути и результаты работы сохраняет по заданному пути для обработанных изображений и каждое из них в отдельности (путь и ID изображения) кладёт в Очередь OCR.
    Ответ написан
  • Как правильно хранить данные в бд?

    Если помимо MySQL уже используется какое-либо K/V решение, то лучше сериализовать и поместить туда.
    Если только MySQL и объем данных небольшой, то можно сериализовать (средствами языка, MsgPack, JSON, ...) в 1 поле типа BLOB и каждый раз брать оттуда. Опционально можно ещё сжать каким-то алгоритмом типа GZip, Deflate. Но важно замерить что в итоге быстрее (внешний API или кэшированные данные). Возможно, овчинка выделки не стоит.
    Ответ написан
    Комментировать
  • Что производительнее для большого проекта Laravel vs Nuxt + node.js?

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

    Можно сделать оффлайн-поиск так:
    Для каждого извлеченного кадра видео вычислять его хэш (phash или dhash) и записывать его вместе с идентификатором файла видео и номером кадра в таблицу в СУБД SQLite.
    Затем выполняешь запрос для поиска кадров-кандидатов с применением расстояния Хэмминга:
    SELECT video_id, frame_num
    FROM hashes_table
    WHERE hamming_distance(image_hash, frame_hash) < N;


    Другие способы предложены в opencv-finding-picture-frame-in-video
    Ответ написан
    Комментировать
  • Как и с какой библиотекой создать триггеры MySQL на C++?

    Как создать триггеры: https://habr.com/ru/post/37693/
    Создать можно разово любым клиентом MySQL.
    Как управлять периферийными устройствами : нужно читать соответствующие руководства.
    Ответ написан
    Комментировать
  • Как правильно синхронизировать данные?

    Можно сливать данные из API во временные таблицы со структурами, идентичными необходимым сущностям.
    Затем перед слиянием нужно удалить записи, идентификаторы (ключи) которых отсутствует во временной таблице.
    Для остальных записей просто merge.
    https://en.wikipedia.org/wiki/Merge_(SQL)
    Ответ написан
    Комментировать