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

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Если брать стандартную структуру проекта - я бы отталкивался от того есть ли смысл эту структуру делать доступной. Если да - тогда смотрел бы в сторону /pkg, если нет /internal.

    По хорошему, я бы сделал отдельный пакет для этой структуры и в зависимости от того используется ли она для внутренних целей или нет - положил бы пакет в /pkg или в /internal

    Для чего используется ваша глобальная структура?
    Ответ написан
    Комментировать
  • Какая есть хорошая книги про микросервисную архитектуру?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Лучшее, что я читал по микросервисам - "Крис Ричардсон - Микросервисы. Паттерны разработки и рефакторинга", но там немногим больше 500 страниц :)

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

    Правда там примеры на Java, но легко "заходят".

    Ну и сайт автора книги https://microservices.io/ - там почти всё тоже, что и в книге.

    Примеры кода из книги https://github.com/microservices-patterns/ftgo-app...
    Ответ написан
    1 комментарий
  • Как работают современные мессенджеры?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    как сервер за столь короткое время умеет прошерстить базу данных, найти сообщения конкретного пользователя и отдать их

    Я бы делал немного иначе, например пользователь отправляет сообщение, которое принимает сервер.
    В случае, если получатель сообщения также подключен - сервер параллельно доставляет получателю сообщение, за счёт этого имеем быструю доставку сообщений, и параллельно сохраняет сообщение в базу.

    Что касается быстрой загрузки истории сообщений - то тут нужно сохранять сообщения таким образом, чтобы сообщения одного пользователя всегда были на одном и том же сервере (если используется шардинг). Тогда обычный SELECT из базы по user_id будет вполне себе быстро работать даже на огромной базе. Также таблицы можно еще партицировать, чтобы еще быстрее загружать последние сообщения в истории.

    Что касается безопасности, если не использовать e2e шифрование, как вариант, можно использовать обычные RSA ключи. Например на сервере генерируем два ключа, открытый отправляем кленту, он шифрует им сообщение и передает сообщение на сервер. Вы на сервере его расшифровываете при помощи закрытого ключа. Для отправки сообщения клиенту, можно сделать тоже самое. Клиент также генерирует два RSA ключа и открытый ключ отправляет серверу. Когда серверу нужно доставить сообщение клиенту, он шифрует сообщение открытым ключём, который ему высылал клиент и отправляет ему.

    Мне тоже интересно узнать другие варианты решения этой задачи, буду следить за этой темой :)

    Хорошее дополнение по хранению сообщения и организации поиска от Ильи
    Распределение нагрузки решается шардингом — получается много небольших БД вместо одной огромной. Скорее всего каждое сообщение разбивается по словам/частям слов и сохраняется в поисковый индекс типа слово—message_id и такой индекс строится для каждого пользователя и тоже шардируется. При поиске сначала получаем идентификаторы подходящих сообщений из поискового индекса, потом выгружаем сообщения из БД с сообщениями.

    Дополнение от Stalker_RED
    только не "сообщения одного пользователя всегда были на одном и том же сервере" а сообщения из одного чата/канала/группы (включая чаты, в котором всего два участника). То-же самое касается построения индекса.
    Ответ написан
    7 комментариев
  • Как приспособить программу к многочисленным изменениям?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Если я верно понял задачу, то у вас база в одном формате, а данные приходят в разных.
    Если это так, тогда вам нужно просто сделать 3 класса:
    1 - преобразовывает данные в формате 1 во внутреннюю структуру (пригодную для сохранения в базу)
    2 - преобразовывает данные в формате Х во внутреннюю структуру
    3 - сохраняет данные из внутренней структуры в базу
    Это стандартная практика для подобных задач.
    Если вам будет нужно сохранять данные не в базу, а куда то еще, например в облако - вы просто добавите еще один класс, который умеет сохранять данные в нужном формате/на облако.
    Ответ написан
    1 комментарий