• Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Дмитрий, нам нужно хранить всех участников чата, чтобы не состоящие в нём люди не могли отправлять в него сообщения. По сути мы имеем базу данных чатов, каждый из которых хранит своих участников. И вот тут как раз и рождается мой вопрос. Мы должны реализовать взаимодействие с ней через сервис чатов и обязать программиста знать о транзакциях в этом сервисе и решать проблему утечки транзакций, или мы должны обязать программиста знать о базе данных чатов.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, без блокировок эта задача не вызывает проблем с производительностью, вы правы. Но она не отвечает бизнес требованиям (я не верю, что даже в гипотетическом мире разрешат отправку сообщений заблокированными пользователям). По сути у нас нет выбора: мы вынуждены ввести блокировки, чтобы приложение считалось рабочим. А вот дальше действительно надо решать проблему блокировки N пользователей, каждый из которых именно в этот момент отправил сообщение в этот чат, если такая проблема возникнет, конечно.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Дмитрий, в той ситуации, которую я моделировал, мы сначала получили список пользователей (например, от другого микросервиса), а затем его изменили. В таком случае сервис сообщений примет сообщение (он видит устаревший список), хотя список был уже обновлён. Нам нужно гарантировать, что список не будет изменён после чтения и до окончания записи.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, я брал не реальную проблему, а просто представлял все пограничные состояния функции добавления сообщения. Почему запрос, пришедший позже, может вернуться раньше? Я нахожу этот вопрос странным. Есть много причин. Самая очевидная из них - запросы могут отправиться на две разные машины, у которых разные мощности и разная удалённость от машины с СУБД.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Дмитрий, Как минимум странно, что сервис содержит отдельную папку с названием service. Тогда это нужно называть по-другому, про это и вопрос.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Дмитрий, проблема в том, что без блокировок сообщение о том, что пользователь заблокирован, приходит раньше сообщения. Именно блокировка не позволит удалить пользователя до отправки им сообщения.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, дело в том, что я уже написал свою социальную сеть (в 10 классе). Там большой проект с несколькими СУБД, современными подходами и прочим. Сейчас я только поступаю в ВУЗ. Впервые податься на стажировку я смогу не раньше августа (мне исполнится 18), хочется чем то себя занять на 2 месяца. Писать ещё один монолит будто бы бессмысленно, так как ничего нового я не потрогаю.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, мне кажется, что блокировать меньше, чем список пользователей в одном чате, неэффективно (не отдельно же каждого пользователя выносить? Всю память на Futex и Mutex потеряешь). А сделать без блокировок, конечно, можно, если самому написать СУБД и гарантировать последовательное выполнение. Тот же Tarantool с его кооперативной многозадачностью может отнести конкретно этот чат и это сообщение в разные процессы или даже машины, и тогда мы встретим проблему. Транзакции нужны, тем более на одну строку чат они не критичны. Я, конечно, готов выслушать ваши предложения ниже.
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Александр Павлюк, я натыкался на вакансии, где требуют "понимание микросервисной архитектуры". Если не делать пет-проект с ними, как можно честно откликнуться на такую вакансию и как они на этапе проверки резюме это узнают?
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Вторая вакансия на hh.ru среди "нет опыта" (осторожно, две картинки)
    две картинки

    666dd122240ad431039035.png
    666dd139b3532999817886.png
    Написано
  • Как писать микросервисную архитектуру?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Давайте представим ситуацию. Пользователь видит, что находиться в чате. Он отправляет сообщение. Параллельно администратор удаляет пользователя из чата. Мы не блокируем список участников, просто получая его. Пользователь в нём состоит, начинаем писать сообщение в базу. Параллельно пользователь удаляется из чата и администратор это видит. Сообщение записывается. Как итог, в чат приходит сообщение, что пользователь удалён, а следующее сообщение в чате от пользователя.
    Написано
  • Как написать такой макрос?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, концепция верная. Но мне не хватило документации. Я прошерстил интернет, но не нашёл примеров подобных макросов, а библиотека syn не содержит примеров на такое, хотя и поддерживают Expr::Return. Не могли бы вы привести пример для такого?
    Написано
  • Почему в этом коде значение под указателем перезаписывается?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Произошла какая-то магия, когда я решил вывести на экран в функции создания.
    println!("data fd: {}, must be {fd}", data.fd);
    После этого код внезапно заработал. Я попробовал вместо вывода использовать black_box, я снова поймал ошибку. У меня нет идей, с чем связана эта магия, и такой костыль меня не устраивает. Есть идеи?
    Написано
  • Почему в Rust использую Tokio?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, выше D3lphi написал, что процессор будет занят переключением тредов. Не подтвердилось.
    Написано
  • Почему в Rust использую Tokio?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    D3lphi,
    Спойлер: во втором случае если и удасться их заспавнить, то cpu будет занят лишь одним - переключением контекста с треда на тред.

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

    Если делать вывод, то Tokio является лучшим решением для обработки миллионов соединений, так как потребляет меньше памяти. Однако производительность Tokio значительно уступает std.
    Написано
  • Почему в Rust использую Tokio?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    D3lphi,
    экономить процессорное время.
    На моих тестах (как и на тех, что я находил в сети) единственное что Tokio делает лучше с точки зрения производительности - это сон. Спит Tokio действительно гораздо дешевле. Если рассмотреть стандартную библиотеку, то она работает далеко не всегда синхронно. Иногда она "паркует" потоки и "будит" их только в момент готовности. Мои тесты подтверждают это теорию.

    Однако я мог не рассмотреть нужный случай. Если есть ещё какой-нибудь тест, где Tokio показывает себя лучше, опишите его. Я проведу его в свободное время.
    Написано
  • Может ли приложение слушать несколько портов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, я с Вами полностью согласен, что и одно ядро может слушать множество портов. Вы были правы. Я вступил с Вами с дискуссию, потому что хотел объяснить для чего мне более одного порта в приложении. Если Вы до сих пор не понимаете, для чего я собираюсь использовать более одного порта, я боюсь, что не смогу Вам это объяснить, так как Вы не понимаете самой проблемы, которую я пытаюсь решить. Если Вам всё ещё интересно, можете поискать информацию в интернете о shared-nothing архитектуре и поискать её реализации (например, SeaStar).
    Написано
  • Может ли приложение слушать несколько портов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, я не использовал Python дальше школьного курса, поэтому не могу с Вами поспорить. Но не существует других способов решить эту задачу (или через полное деление состояния, даже портов, или нужны примитивы синхронизации). Скорее всего, Python скрывает от Вас эту работу.
    Написано
  • Может ли приложение слушать несколько портов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Everything_is_bad, если Вам правда интересно, попробуйте в голове быстро представить себе такую ситуацию:
    1 - приложение слушает один порт;
    2 - приложение обрабатывает запросы параллельно;
    3 - вам надо вернуть значение из словаря в ответе.
    Как будете такое реализовать? Если вы знаете способ реализовать это без блокировок и каналов, опишите в двух словах такое решение. Мне будет интересно его почитать.
    Написано
  • Может ли приложение слушать несколько портов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Saboteur, я именно поэтому и начал вопрос с слов: "Вопрос стоит не в том, способен ли я." Приложение то может, но нет ли потом подводных камней по типу, что его трудно развернуть или что-то подобное. Поскольку никто не предупреждает меня о подобном, я полагаю, что подводных камней всё же нет. Поправьте меня, если они есть.
    Написано