Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (18)

Лучшие ответы пользователя

Все ответы (22)
  • Как лучше хранить денежные суммы в Postgres?

    @foterio
    Несколько лет назад, я потратил неделю чтобы гарантировано разобраться и принять правильное решение как хранить деньги в Postrgres.
    3 вариант оказался единственно верным. Хранить деньги нужно в копейках, центах в виде int. Операции сложения вычитания так же необходимо проводить в копейках, центах. И только при выводе денег для конечного пользователя вы приводите его в читабельный вид $10.99
    Ответ написан
    2 комментария
  • Что выбрать для бэкенда с нуля?

    @foterio
    Преимущество NodeJS - это ее асинхронность, и тут это нам сыграет на пользу. Плюс математические вычисления мы вынесем в отдельные worker'ы. Подробнее, как организовать worker pool тут https://github.com/josdejong/workerpool
    При правильно спроектированной архитектуре и настроенном NGINX, NodeJS способна переварить тысячи запросов и чувствовать себя отлично.
    У меня, к примеру в одном из проектов я уперся быстрее в производительность MongoDB на запись 165-220 RPS (на той конфигурации монги, которая была у заказчика), чем в невозможность обработать запрос клиента у NodeJS.
    Я бы начал с тестового backend'а на Fastify, так как мы все равно пишем с нуля и нам важна производительность. Будем честны для Go тут еще маловато нагрузки))))
    Затем пострелял бы в него из пушки, скажем 1000 RPS 10 секунд подряд и посмотрел результаты.
    Далее будет понятно, справляется ли один инстанс с этой задачей или нет, и тогда можно в случае чего масштабировать его и лить трафик на несколько NodeJS приложений через load balancer.
    Ответ написан
    Комментировать
  • Фильтры товаров интернет-магазина, как грамотно реализовать обмен данными с сервером?

    @foterio
    Если это не GraphQL api, у которого любой запрос это POST, то общепринято для получения информации использовать GET запрос. Так же это сделано для того, чтобы вы могли поделиться этой ссылкой с другим человеком и еще чтобы правильно работало SEO.

    Выглядеть это должно примерно вот так.
    1. Для начала разберемся с pagination, тут есть два пути:
    А. Передавать два параметра, limit - кол-во записей, offset - отступ
    Первая страница /producst?limit=20&offset=0
    Вторая страница /producst?limit=20&offset=20

    B. Передавать только page, и уже на backend'е высчитывать limit и offset для обращения в БД
    Первая страница /producst
    Вторая страница /producst?page=2
    // Тут мы для первой страницы можем забить и не передавать никакие значения,
    // так как на backend'е предусматриваем page = 1 по дефолту.

    2. Значения фильтров так же передаем параметрами
    /producst?page=2&categoryIds=15,7,23
    3. И затем на backend'е уже парсим наши фильтры, незабывая предусмотреть дефолтные значения для фильтров. Есть разные подходы, первое что пришло в голову, это следующее решение
    let filter = {
      // тут можно предусмотреть некоторые значения фильтра по дефолту
      isAvailableOnStock: true,
    }
    // И затем парсим каждое значение
    if (query.categoryIds) {
      // В зависимости от базы данных, а так же драйвера и ORM,
      // которые мы используем, будет отличаться
      // делайте это в соответсвии с документацией
      filter.category_id = In(query.categoryIds.split(','))
    }
    // Делаем запрос в нашу базу
    // Для примера используется TypeORM
    const products = await getRepository(Products).find({
      // Используем наш объект filter
      where: {
        ...filter,
      },
      // Сортируем результат по названию
      order: {
        title: 'ASC',
      }
    })

    P. S. Еще помните, что существует сортировка, по цене, по имени, и прочее, которую так же необходимо передавать через параметр и затем сортировать результат из базы данных через "ORDER BY"
    Ответ написан
    Комментировать
  • Как лучше делать пагинацию на React?

    @foterio
    Привыкайте запрашивать данные на клиент только, те, которые необходимы. Смысл от 200 товаров, если клиент увидит только 10. Ну или 30. У приложения будет лишний трафик + плата за использование Firebase.
    Запрашивайте первые 20 товаров, остальные подгружайте через useEffect. Все полученные товары кэшируйте на клиенте. Таким образом вы сократите нагрузку на backend и на сеть, так как пользователь может туда сюда по страницам ходить.
    Ответ написан
    Комментировать
  • Как вставить .webp изображения через background?

    @foterio
    В своих проектах я использую такие css

    Это для google chrome
    background-image: url("some-image.webp");

    Это для Safari
    background-image: image-set(url(some-image.jpg) 1x);

    Не проверял работает ли в firefox
    Ответ написан
    3 комментария