• Почему Redis PUB/SUB передаем сообщения хуже чем http tcp?

    Eugene-Usachev
    @Eugene-Usachev
    Roman K, Буду рад, если вы скажете, что в нём вредного. Я переписал огромную часть своего приложения на адаптер, который все запросы по умолчанию пихает в pipe и не встретил никаких проблем.
  • Почему Redis PUB/SUB передаем сообщения хуже чем http tcp?

    Eugene-Usachev
    @Eugene-Usachev
    Roman K, Ну так вопрос был про скорость Redis. Так уж получилось, что я около недели сидел и бенчмаркил все key-value и каждый оптимизировал до предела (даже свои адаптеры писал). Так что я считаю, что могу отвечать на вопросы связанные с производительностью Redis.
    Также любому человеку, который писал свой PUB/SUB будет понятно, почему это работает медленнее, чем TCP между двумя серверами.
  • Как сделать много вставок в HashMap за минимальное время?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    mayton2019, ваш вопрос выглядит очень грубым. Я вообще не понял суть претензии: "в мае месяце ты хотел вкатиться в айти а в июле уже критикуешь структуры данных Rust." В вашем представлении в айти вкатываются только те, кто умеют только кнопочки красить? Я не дружу с Rust, так как опыт работы с ним у меня ограничивается примерно 5 потраченными часами и в вопросе (можете перечитать) не критиковал структуры Rust. Я столкнулся с тем, что map не смог удовлетворить мои потребности в скорости (у меня была цель обогнать решение на Go, которое обрабатывает чуть больше миллиона вставок в секунду, так ещё и с накладными расходами). Я не смог смириться с возникшей мыслью, что Rust сам по себе медленный и решил попробовать другие подходы работы с map.

    Я пишу на Go большую часть времени. В Go можно параллелить любой процесс почти бесплатно с точки зрения скорости (в памяти это будет от 2 до 80 кбайт). В Go я бы попробовал (я пробовал и там результат становился хуже) распараллелить этот процесс, чтобы писать не в один map, а в 4, к примеру. Как ниже объяснил (вежливо, кстати) Дмитрий Беляев, это не имело бы смысла, так как нагрузка "чистый CPU-bound". Я только учу Rust и приложенный код, естественно, не попал бы даже в commit. Он был нужен попробовать Rust. Если бы тест запустился (пост, напоминаю, об ошибке), я бы и сам пришёл к точно такому же выводу.

    Резюмируя, я "прощупывал" возможности Rust, так как привык учить языки именно практикой (и выходит получше, чем в школе или даже в университете).
  • Как сделать много вставок в HashMap за минимальное время?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, огромное спасибо за такое количество потраченного времени! Даже стыдно заставлять опытного разработчика писать мне тесты. Я всё ещё не силён в Rust. В вопросе я поднял только скорость вставок (хотя вопрос был вообще про ошибку), однако важно ещё и скорость чтения. Например, я сильно сомневаюсь, что для такой задачи подойдёт vec. Скорость чтения там, я полагаю, основываясь на C++ и Go, O(1), но это только, если знать индекс. Hash таблица под капотом высчитывает индекс из ключа, есть подозрения (ещё не успел проверить), что vec будет сильно медленнее на чтение из неизвестного индекса. Я знаю, что в СУБД используются деревья для быстрой вставки и быстрого чтения.
    Не могли бы вы по опыту сказать названия структур, которые стоит протестировать (задачи: быстрая запись и чтение)?
  • Как сделать много вставок в HashMap за минимальное время?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    mayton2019, полностью с вами согласен. В тестах на Go я использовал pipelining и достигал скорости всего запроса (запрос, вставка, ответ) за 2,5 секунды. Я ещё не настолько хорошо знаю Rust, чтобы писать такую сложную систему, поэтому начал с чего попроще - с цикла. В любом случае я буду вставлять циклом (или в Rust не так?), дальше добавится счётчик пришедших запросов и работать всё это будет через pipelining.
  • Как сделать много вставок в HashMap за минимальное время?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Дмитрий Беляев, я соглашусь с вами, но у меня есть вопрос. Я с Rust ещё не дружу и, возможно, неправильно провёл тесты. Но я написал небольшой тест асинхронности, как бы писал его для Go. По сути я запускал параллельно несколько функций, которые ждали по n времени и смотрел, какой способ реализации async справится быстрее всего. Tokio для этой задачи подошёл хорошо и справился быстрее всего остального, что я тестировал. Однако в стандартной реализации (без указания числа работяг) Tokio отработал на пару процентов быстрее ближайшего конкурента, с количеством работяг = 1024 он отработал почти в 20 раз быстрее стандартной реализации. Я тестировал на 6 ядерном процессоре. Почему тогда указание работяг увеличило скорость?
  • Как сделать много вставок в HashMap за минимальное время?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    mayton2019, 4 секунды. Это дорого, на самом деле.
  • Как переустановить Rust?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, спасибо за помощь. Очень признателен за 6 сообщений в одиннадцать вечера. Команда
    .\rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain stable --profile default

    сработала.
  • Как переустановить Rust?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, Ошибка сохраняется.
  • Как переустановить Rust?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, я проверил ещё 2 раза, существует только CARGO_HOME.
  • Как переустановить Rust?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    RUST_HOME и C:\Users\Eugene\.cargo\bin в PATH не существуют. Я не знаю, почему установщик считает, что Rust установлен.
  • Как на node js быстрее выполнить задачу множественных запросов и записи в базу асинхронно?

    Eugene-Usachev
    @Eugene-Usachev
    4000 запросов раз в 3-5 секунд это мало. Тот же MySQL спокойно разгоняется до 50к записей в секунду (некоторые небезопасные способы могут разогнать и до 100к записей в секунду, об этом почитайте сами).
    Далее я не понимаю, для чего вам axios в этой схеме. Если вы хотите перебрасываться данными между серверами, вам стоит выбрать другие сетевые протоколы (http имеет слишком большой оверхед). Посмотрите в сторону gRPC или напишите собственный низкоуровневый протокол поверх обычных сокетов. Также вам стоит рассмотреть pipelining запросов, например, скидывать на сторонний сервер (да и на базу) запросы пачками по 100. Также я не понимаю Promise.all в вашем коде. Насколько я понял, нагрузка фиксированная 4000 запросов раз в 3-5 секунд. Тогда есть смысл сразу обрабатывать запросы (только получил, сразу отдал в какой-нибудь scheduler с pipelining).
  • Как попасть в IT школьнику?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Dmitry Roo, этой фразой
    Я не уверен, что на стажировку вы попадете летом, и вообще не уверен, что возьмут в вашем возрасте.
    вы были правы. Там или со 2 курса или с 1. В Яндексе с 18 лет.
  • Как попасть в IT школьнику?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Dmitry Roo, Я не знаю, как подаваться на стажировки. Я даже не знаю, что указать в резюме или заявке. Если вы уверены, что я могу попасть на стажировку не имея 18 лет, подскажите, как подаваться туда.
  • Как попасть в IT школьнику?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    res2001, а лето я должен просто просидеть?
  • Чем отличаются dto, entity...?

    Eugene-Usachev
    @Eugene-Usachev
    Не очень понимаю от чего обрезать и какие данные. Но данные отправляемы на клиент тоже называются dto
  • Как правильно структурировать проект в Go?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Andrey Tsvetkov, в целом это выглядит неплохо, но мне кажется, что лучше добавить отдельную структуру вроде studentRepository для того, чтобы было проще поддерживать код, если в проекте больше одной субд.
  • Как правильно структурировать проект в Go?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Andrey Tsvetkov, сложно так воспринимать. То есть вы предлагаете структуру вроде
    app/
    -cmd/
    --main/
    ---studentGroup.go
    ---lessonGroup.go
    ---router.go
    ---main.go
    -spects/
    --lesson.go
    --student.go
    -internal/
    --student/
    ---dto/
    ----student.go
    ---student.go (не интерфейс)
    --lesson/
    ---dto/
    ----lesson.go
    ---lesson.go (не интерфейс)

    Поправьте меня, если я неправильно понял. Но даже так. У нас spects содержит структуры пользователей, так же как и dto, так же studentGroup и lessonGroup находятся вне пакета. Я привык к модульной архитектуре и для меня это странно. Не удобнее ли было поместить всё, что используется для student в единый пакет, в том числе и функцию для создания модели ( studentGroup )?
  • Как тестировать сетевые запросы в Go?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    falconandy, Спасибо! Если вас не затруднит, вынесите ваше решение из комментариев в решения, чтобы я мог пометить вопрос решённым.
  • Как тестировать сетевые запросы в Go?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    falconandy, Я исользую Docker для запуска сервера. Я запускаю сервер на порте 8081, но Docker перенаправляет запросы на 8081 с порта 8000, куда я могу "дотянуться" из браузера или Postman. Тесты я тоже запускаю в Docker. И сервер и тесты запущены в едином Docker-compose.