• Как организовать надежную инфраструктуру для веб-проекта?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Клиент - всегда за одну сессию посещения работает ТОЛЬКО с одним сервером обслуживания. Это может быть как отдельная структура, так и внутри структуры CDN. Я предпочитаю использовать второй вариант.

    Сервера - постоянно синхронизируют данные асинхронно между собой (канал обмена данными - поднят всегда!).
    После закрытия/смены сессии клиентом - происходит централизованное оповещение сразу всем серверам и они ставят себе в очередь синхронизацию данных именно по этому пользователю.
    При этом, стандартная синхронизация серверов БД работает параллельно в штатном режиме.

    все SQL запросы сильно лагают
    Только пакетный конвейер запросов с контролем загрузки сервера исполнения запрос-пакета и необходимого приоритета исполнения всех нужных запрос-пакетов! Система должна знать (сама принимать решение!): когда ей выполнить запрос, а когда допускается повременить (приоритезация).

    Также, можно использовать HAProxy для отказоустойчивости/балансировки, в качестве "головы".
    Или, как альтернативу ему, Envoy.

    PS:
    1. Кэширование статики и данных из БД - Вы там не забыли поделить на: EVERYONE, GUEST, USER?
    2. Соединение к БД - не переоткрываете по несколько раз, когда делаете обращения к БД за время исполнения скрипта?
    3. Объединяете ли запросы с стэки для получения всех нужных данных ОДНИМ запросом из БД?
    Ответ написан
  • Как организовать надежную инфраструктуру для веб-проекта?

    @vitaly_il1
    DevOps Consulting
    Например, самое главное (БД) перенесу в Amazon AWS RDS
    Основной мощный веб-сервер с SPA и Backend останется в текущем ДЦ в Нидерландах
    Хочу сделать резервный веб-сервер в другом ДЦ
    Оба веб-сервера будут работать с одной базой в AWS RDS (MultiAZ для надежности)

    Нет, все компоненты должны быть у одного провайдера, иначе будут огромные задержки.

    Варианты от простого к сложному (кроме нанять опытного архитектора):
    - выбрать надежного провайдера - самый дешевый и простой вариант
    - AWS (или GCP/Azure) - разбросать компоненты по разным AZ
    - несколько систем в разных регионах AWS, с GeoIP loadbalancing
    - несколько систем у разных провайдеров (разные датацентры), loadbalancing Cloudflare or Incapsula, ...

    В случаях 3 и 4 вы сами должны обеспечивать репликацию данных.
    Ответ написан
  • Насколько сейчас востребованы программисты микроконтроллеров?

    @Oligophren
    Сертифицированный разработчик Terrasoft BPM'online
    Можно открыть хх и убедиться, что это не очень востребовано. По сравнению с вебом вакансий в разы меньше, зарплаты намного ниже.
    Ответ написан
  • Как транслировать вебсокет в свое по?

    NeiroNx
    @NeiroNx
    Программист
    Если только из своей программы подключиться к тому же вебсокету.
    Ответ написан
  • Как распечатать объект Promise с использованием директивы v-for?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Никак.

    <div v-for="n in list">{{ n }}</div>

    data: () => ({
      list: [],
    }),
    created() {
      axios.get(...).then(r => this.list = r.data);
    },
    Ответ написан
  • MVC реализованый через Controller, Entity, Repository, Service это как?

    gzhegow
    @gzhegow
    Думал, стану умнее, когда адаптируюсь, но нет
    Controller
    -- ProductController
    -- UserController
    spoiler
    ну тут ты все знаешь, это класс где в виде функций хранятся частные случаи твоей программы, или по-русски - страницы сайта. здесь формируется массив исходных данных и разбирается GET/POST/RAW. Здесь прогоняется валидация. И полученный обьект или массив идет дальше в сервис

    Model
    -- Entity
    ---- ProductEntity
    ---- CategoryEntity
    spoiler
    это твоя модель к которой ты привык. Но в ней нету никаких ->save(), ->insert() и так далее. Просто пустой обьект со свойствами и функциями, которые эти свойства позволяют установить и получить. в случае с фреймворками - энтити является прослойкой для ActiveRecord. То есть везде в коде ходят Entity. А у каждой энтити есть внутри AR-обьект (обернуто)

    -- Repository
    ---- ProductRepository
    ---- UserRepository
    spoiler
    это класс, который умеет брать пачку Entity и сохранять их в базу. Или наоборот - запрашивать из базы, отдавая тебе пачку Entity. В простом случае запросы в базу лежат прямо в нем. В чуть более сложном случае он является прослойкой, которая говорит Адаптеру - делай. Говорят что все возможные фильтры и сортировки в виде кусочков, которые можно добавить к построителю запросов тоже хранятся здесь. Соответственно для файлов это придется делать как-то по-другому, у нас ведь нету "запроса к файлу", есть только открыть, перейти на строку или считать целиком

    ---- Adapter
    ------ MysqlAdapter - сохраняет и получает только в базу
    ------ FileAdapter - сохраняет и получает только в файл
    ------ ElasticSearchAdapter - сохраняет и получает только в индекс эластика
    ------ ... и тд
    spoiler
    это кусок репозитория, еще один обьект, который знает КАК ИМЕННО нужно сохранить то, что сохраняет репозиторий. Или как именно получить.

    -- Service
    ---- ProductService
    ---- UserService
    spoiler
    это класс, который умеет делать из входящих, уже проверенных валидатором данных = Entity. На вход кидаешь объект запроса или массив сложный большой, а в нем, под капотом в функциях разбираешь его до тех пор пока не получится массив Entity или одна Entity. В случае с запросом данных, а не их созданием - отсюда вызывается репозиторий, чтобы получить Entity. Когда Entity создан - тут же репозиторий вызывается, чтобы его записать. Сюда же лягут всякие registration() для юзера например, или методы запросов пачки или одной записи с учетом того, что пользователь может захотеть не все поля, или задать сортировку

    View
    spoiler
    тут все ясно. в простом случае - это просто файлик шаблона. в более сложном - класс, который на вход принимает данные от сервиса, на выход отдает их в виде JSON или Хтмл, или Xml (может оборачивать в постраничную навигацию по дороге - но это в каком-то смысле и репозитория задача, когда у тебя постраничная от хранилища зависит), потом программа сделает (new ProductsView($data))->send(); и отдаст их пользователю, проставив заголовки что это там JSON или XML

    Component
    spoiler
    а тут всякие штуки работающие как мини-программы в программе. Авторизация. Языки и переводы. Если совсем ударится в правильность - то этой папки нет, так как каждая мини-программа это по сути сайт с собственной базой данных. И языки тоже могут иметь модель, репозиторий и способы быстро их получать из ElasticSearch


    ps.
    Но сколько бы ты не читал моё понимание, архитекторы все равно тебе скажут, что ты не так понял, и иди ещё почитай. Это бесконечный цикл о том как ты пытаешься доказать архитектору, что ты тоже архитектор, а он тебе говорит, что ты ещё молокосос (ведь рынок - это сафари - или ты гоняешь, или тебя)

    Хочется верить что наступят времена когда вместо "невозможно" начнут применять "интересно, как это возможно" и вместо "да ты гонишь" начнут применять "а не мог бы ты рассказать почему это работает", но за 2000 лет ещё не навоевались.
    Ответ написан
  • Как сделать что бы функция не выполнялась быстрее чем 2s?

    dantothefuture
    @dantothefuture
    You sleep, she sleeps, they sleep, I... don't.
    Попробуйте Navigation Timing API:

    function startAfter (delay, callback) {
      const elapsed = Date.now() - performance.timing.navigationStart
    
      if (elapsed >= delay) {
        callback()
      } else {
        setTimeout(callback, delay - elapsed)
      }
    }
    
    document.addEventListener("DOMContentLoaded", () => {
      startAfter(2000, () => console.log("DOM fully loaded and parsed"))
    })
    Ответ написан
  • Php - вложеные вызовы в echo?

    Ninazu
    @Ninazu
    Сложность в том, что phpinfo, не возвращает значение, а выводит его. Поэтому нужно перехватить вывод, направить его в переменную, ну а потом можно делать что угодно уже с ним))

    $getPHPInfo = function () {
    	ob_start();
    	phpinfo();
    	$result = ob_get_contents();
    	ob_clean();
    
    	return $result;
    };
    
    
    echo "123 {$getPHPInfo()}";
    Ответ написан
  • Как рассудить такие шансы?

    @tutuborg
    вопрос: как рассудить противников, если выпавшие в mt_rand() числа - равны?

    Повторить просто rand
    Ответ написан
  • Какой рынок программирования НЕ «перегрет»?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера
    build engineer
    Вообще замерзает рынок специалистов уровня сеньор.
    Вакансии висят месяцами и годами.

    Не перегрет рынок уровня мид. Вакансий полно.

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

    Поэтому выбирайте любую область, которая вам нравится, чтобы лично у вас была заинтересованность и желание дойти до приемлимой квалификации.
    Ответ написан
  • Как контролировать работу скриптов-воркеров? Что лучше Crontab?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    build engineer
    Если вам нужно запускать их последовательно, зачем вы каждый сервис запускаете в крон отдельно от других?

    Сделайте скрипт, впишите в него все сервисы по очереди и запускайте скрипт раз в 10 минут?
    Ответ написан
  • Кто как защищает от пиратства свое видео?

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

    Zoominger
    @Zoominger
    System Engineer
    public function stepTwoAction()
    ...
    public function stepThreeAction()
    ...
    public function stepFourAction()
    ...
    public function stepFiveAction()
    ...
    ...
    ...
    ...
    public function stepTwelveAction()


    После stepTwelveAction() у меня задёргался глаз и я не смог досчитать.
    Вы ведь просто глумитесь?
    Ответ написан
  • Что из себя представляет SEO в 2019 году?

    Zoominger
    @Zoominger
    System Engineer
    Это упорядоченный, повсеместно распространённый культ Карго, при котором «специалист» выполняет определенного рода действия, рекомендованные абсолютно маргинальными источниками, не основанными на каком-либо авторитетном исследовании, совершенно не понимая сути выполняемых действий и не осознавая полную бессмысленность проводимых операций.

    Я не шучу.
    Ответ написан
  • Чат на WebSocket с MYSQL бд?

    DevMan
    @DevMan Куратор тега PHP
    Дописать в пример функционал сохранения в бд.
    Всегда ваш, Кэп.
    Ответ написан
  • Как переиндексировать массив в php?

    @vanillathunder
    $array['datetime'] = array_values($array['datetime']);
    $array['quantity'] = array_values($array['quantity']);
    Ответ написан
  • Tor как прокси?

    kshnkvn
    @kshnkvn
    t.me/kshnkvn
    Есть 2 варианта использования сети Tor, оба заключаются в использовании авторизации.
    1. Использование связки случайный_пользователь:пароль. В таком случае при авторизации для каждого пользователя выдаётся новый IP-адрес. Т.е. при каждом requests запросе ты будешь получать новый IP.
    proxy_auth = str(random.randint(10000, 2147483647)) + ':' + 'passwrd'
    proxies = {'http': 'socks5h://{}@localhost:9050'.format(proxy_auth), 'https': 'socks5h://{}@localhost:9050'.format(proxy_auth)}
    response = requests.get(url, proxies=proxies)

    2. Использование пользователь:случайный_пароль. В таком случае ты сможешь создавать для "пользователя" IP и использовать этот IP-адрес повторно.
    proxy_auth = 'user' + ':' + str(random.randint(10000, 2147483647))
    Ответ написан
  • Как обработать ошибку v-img?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавьте элементам currentPageItems булево свойство, которое будет информировать о наличии ошибки. Назначайте src в зависимости от значения этого свойства. Устанавливайте его в true при обработке события error.

    https://codepen.io/anon/pen/OKVJjE?editors=1010
    Ответ написан