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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Миллион элементов в json - это сильно (жирно).
    Предлагаю следующий вариант:
    - В качестве брокера использовать любой брокер сообщений/менеджер очередей с ACK/NACK механизмом (Redis Streams, RabbitMQ, Kafka)
    - Все json разбиваем на 2 категории - большие и маленькие в зависимости от размера (кот. поддерживает брокер)

    Алгоритм будет следующий:
    Producer:
    - Приходит запрос с json
    - Если json маленький, то отправляем в брокер напрямую
    - Если json большой, то сохраняем его в отдельную БД и получаем ID этой записи, в брокер отправляем ID этой записи

    Consumer:
    - Получает сообщение из брокера
    - Если json содержится в сообщении (когда маленький), то сохраняем в БД
    - Если json был большим и передан ID из БД, то читаем этот JSON из временный БД и сохраняем в целевую БД
    - Коммитим сообщение

    Пример такого запроса:
    // Маленький объект
    {
       "data": {
           "key": "value"
        },
        "id": null
    }
    
    // Большой объект
    {
        "data": null,
        "id": 13123123
    }


    P.S. название паттерна хранения большого объекта во внешнем хранилище и передача только его id не помню
    Ответ написан
  • Где можно применить hexagonal architecture?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Чистая архитектура - это просто идея, а не готовая архитектура. Гексагональная - частный случай чистой.
    В блоге Роберта Мартина первыми строками идет:
    Over the last several years we’ve seen a whole range of ideas regarding the architecture of systems. These include:

    Hexagonal Architecture (a.k.a. Ports and Adapters) by Alistair Cockburn and adopted by Steve Freeman, and Nat Pryce in their wonderful book Growing Object Oriented Software
    Onion Architecture by Jeffrey Palermo
    Screaming Architecture from a blog of mine last year
    DCI from James Coplien, and Trygve Reenskaug.
    BCE by Ivar Jacobson from his book Object Oriented Software Engineering: A Use-Case Driven Approach
    Ответ написан
    1 комментарий
  • Насколько разумно при композиции позволять компоненту управлять родителем?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    С точки зрения ЯП/Рантайма, это приведет к кольцевой зависимости, а это порождает различные баги (например, освобождение памяти), поэтому так лучше не делать.
    С точки зрения проектирования, Car не должен знать о Driver - это Driver должен знать о Car, т.к. он ей управляет. Здесь, по факту, водитель - это контроллер какого-то объекта.
    Ответ написан
    2 комментария
  • Какой самый простой способ организовать SSO?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Самый популярный фреймворк для SSO - OAuth.
    Про него много где уже писали. Например, вот некоторые ссылки:
    - https://habr.com/ru/articles/77648/
    - https://habr.com/ru/companies/vk/articles/115163/
    - https://oauth.net/2/

    Также есть еще и OpenID Connect. Это фреймворк построенный вокруг OAuth:
    - https://habr.com/ru/companies/nixys/articles/566910/
    - https://openid.net/developers/how-connect-works/

    Поймешь как они решают эту проблему - поймешь как решить свою.
    На вопрос прямого ответа не дам - много букв
    Ответ написан
    Комментировать
  • Как следует разбить микросервисы?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как по мне, для MVP достаточно будет монолита. + т.к. модели практически одинаковые, то будет проще.
    Если выстрелит, то сделай рефакторинг под модульный монолит, а потом и микросервисы.
    Ответ написан
    Комментировать
  • Как реализовать SQL движок в своём приложении?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. GraphQL - специальный язык запросов. Можно изменять/обновлять/добавлять/читать. Есть полноценный пакет, который парсит запрос и выполняет его. Можно к In memory коллекциям подкрутить. Но это не SQL

    2. OData - тоже язык запросов. Можно изменять/добавлять/читать/удалять. Он достаточно старый и разобраться сложнее. Тоже есть фреймворк, который автоматизирует работу по парсингу/выполнению. Это также не SQL

    3. In Memory sqlite - можно запустить SQLite в памяти и проксировать запросы уже ему.
    Ответ написан
    Комментировать
  • На что опереться при проектировании API (паттерны, концепции)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ну я вроде и рассказал, что это противоречит тому же SOLID

    Проектировать API надо по требованиям предметной области.

    SOLID, REST и т.д. - это конечно же хорошо, но когда из-за них архитектура становится трудной к пониманию - тупое следование им только усугубит ситуацию.

    а почему я не могу в API сделать метод DELETE и в него передавать и тип объекта, и его id


    Почему нет? Если объекты создаются динамически, а не предопределены, то передавать их тип - хорошая идея.
    Все зависит от проблемы.

    Есть где кратко изложенная теория по этому поводу?


    Вряд-ли. Все зависит от проблемы/предметной области.
    Могу посоветовать алгоритм:
    1. Выявить функциональные требования к системе
    2. Представить их в виде условных функций
    3. Переписать их в виде вызовов API (за основу можно взять готовые паттерны проектирования: REST, SOAP и т.д.)

    Посмотрите на API VK или Telegram. Это не REST, но тоже удобно
    Ответ написан
    3 комментария
  • О чём архитектура ПО?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Я запутался, что в итоге такое архитектура? Это про код, про инфраструктуру или про технологии?

    Архитектура это про то, как компоненты связаны между собой.

    Заметь, что такое "компоненты" не сказано. Это может быть и код, и инфраструктура, и сервис.
    Например, архитектуру кода можно представить через диаграмму классов UML. Архитектуру инфраструктуры, можно через C4.

    Как понять о каком типе архитектуры речь, когда о ней заходит разговор?


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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Anti-Corruption Layer - это понятие из DDD. Оно обозначает слой (это может быть отдельный сервис или функция валидации), который проверяет запрос на корректность.

    Адаптер - это больше паттерн проектирования, который, грубо говоря, трансформирует запрос из одного формата в другой. Например, из XML в JSON, или если стоит прокси, то превращает `X-Redirected-From` в `Redirected-From` в HTTP заголовках.

    Адаптер может выполнять роль Anti-Corruption Layer и наоборот
    Ответ написан
    Комментировать