Задать вопрос
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, с такой скоростью для счётчика даже бита не нужно выделять. Раз уж в пределах секунды может быть только один идентификатор, то сама эта секунда и станет идентификатором. Поэтому 2 ^ (34 - 2) ≈ 136 лет
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, это расчет на автоинкремент. Для snowflake будет немного иначе:
    Счётчик на 100 - 7 бит
    Machine id - 2 бита (на 4 машины)
    Для метки времени остаётся 34 - 7 - 2 = 25 бит, что даёт всего 33554431 секунд (388 дней).
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, с такими вводными snowflake исчерпает идентификаторы за год. Слишком мало бит на метку времени.

    С другой стороны, 100 в сек - это ерунда, для которой хватит и централизованного автоинкремента. Если уж хотите распределённости, делите диапазон между машинами. Например:

    Машина 1: 1 - 2 499 999 999
    Машина 2: 2 500 000 000 - 4 999 999 999
    Машина 3: 5 000 000 000 - 7 499 999 999
    Машина 4: 7 500 000 000 - 9 999 999 999

    И пусть каждая машина последовательно генерит в своём диапазоне.
    Написано
  • Какие есть пакеты для генерации уникальных, числовых идентификаторов длиной 10 цифр?

    Vamp
    @Vamp
    historydev, напишите требования. Алгоритм можно достаточно гибко тюнить под них.

    Сколько идентификаторов в секунду вас устроит? Сколько генерящих машин будет максимум?
    Написано
  • Что подразумевается под полем http_x_real_ip в log_format Nginx?

    Vamp
    @Vamp
    Salamandrine, в таком случае отметьте ответ решением.
    Написано
  • Как вести историю работы с записями во всех таблицах для всех пользователей?

    Vamp
    @Vamp
    historydev, переименовывать таблицы - вот ужасное решение. Это допустимо на этапе разработки, но в продакшене это лишь ненужный гемор с неясным выхлопом. И чем больше проект и команда, которая над ним работает, - тем хуже последствия.
    Написано
  • Как вести историю работы с записями во всех таблицах для всех пользователей?

    Vamp
    @Vamp
    historydev, такого ещё не было, но если пофантазировать, то я бы историю не трогал, новые записи вставлял с новым именем таблицы (забыл, кстати, указать в ответе, что есть ещё колонка с именем таблицы, в которой производилось изменение) и переименование обыграл в коде, отвечающем за web ui. Например, массивом с инфой о переименованиях.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Михаил Ливач, нет, не будет закрыта. Второй скрипт откроет своё отдельное соединение и там будет своя транзакция. Функция mysqli_change_user не применяется в обычных php скриптах. Если у вас не roadrunner, swoole, reactphp и прочие ивент лупы, то вам mysqli_change_user не нужен.
    Написано
  • Какая может быть причина отключения ПК?

    Vamp
    @Vamp
    Оперативную память протестируйте мемтестом с загрузочной флешки. А то проверили всё, а самое очевидное пропустили.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Я только не понял, откуда возьмётся перерасход TCP портов при обычном коннекте. Создавая новое соединение мы закрываем старое. Ку да у вас при этом пропадает исходящий порт?

    Ипатьев, коннект при закрытии не освобождает занятые ресурсы, а просто переводится в состояние TIME_WAIT, в котором он находится какое-то время. В линуксе это 60 секунд. И только по истечению этого времени ОС подчищает коннект и освобождает занятый порт. Это поведение описано в RFC на TCP, поэтому оно одинаковое везде. Итак, первое: после закрытия коннекта порт остаётся занятым ещё минуту.

    При открытии TCP коннекта к удалённому серверу клиент может указать номер локального порта, но в подавляющем большинстве случаев никто этого не делает и ОС выбирает доступный порт из так называемого диапазона эфемерных портов. В моём случае это порты с 32768 по 60999:
    $ sysctl net.ipv4.ip_local_port_range
    net.ipv4.ip_local_port_range = 32768	60999

    Второе: всего доступен 28231 порт для исходящих TCP соединений

    Делим 28231 на 60 и получаем теоретическую производительность в 470 rps в течение минуты и более, при превышении которой начнут появляться ошибки вида "Cannot assign requested address" при коннекте к базе. Разумеется при условии, что каждый запрос триггерит соединение к базе.

    Решений у этой проблемы много разных. Например, можно выставить опцию net.ipv4.tcp_tw_reuse=1 и тогда система начнёт прибивать TIME_WAIT коннекты до истечения таймаута, если свободных портов больше нет. Ещё можно расширить диапазон эфемерных портов. Или перевести коннекты к базе на юникс сокет (хотя здесь уже начинает работать лимит на количесто открытых файловых дескрипторов). Но это всё лечение симптомов. Более правильным вариантом был бы переход на персистентные соединения. Но у меня проект сидел на PDO и я не рискнул, так как PDO не чистит коннект между http запросами как это делает mysqli. В итоге я просто включил tcp_tw_reuse для быстрого решения проблемы на месте, затем задеплоил проект на второй сервер, настроил балансировку запросов между ними, а в конце-концов просто переписал эту часть проекта на java, где есть нормальные пулы коннектов.

    Был у меня и другой случай. Хоть и не про базу, но тоже про экономию TCP коннектов. Есть сервер, находящийся за маршрутизатором cisco. На сервере прописан только серый ip и выход в интернет делается при помощи NAT на циске. На сервере работает приложение, которое рассылает клиентам уведомления на их http колбэки. В какой-то момент уведомлений стало так много, что циска упёрлась в лимит NAT трансляций и новые коннекты в интернет вообще не устанавливались. Решением было включение опции keep-alive в используемой http библиотеке (это было на java). В итоге вместо отдельного TCP соединения на каждый http запрос создалось немножко постоянных TCP соединений на каждого отдельного клиента (домен клиента), в которых гонялись http запросы.

    А используется там практически безальтернативно PDO, которое в mysql_change_user() не умеет. Так что советуйте свои советы пользователям Ларавля и Симфони, а когда они с вами согласятся - то тогда так и быть, попинайте и меня, грешного.

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

    К счастью у ТС mysqli, с которым можно красиво порешать.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    "Экономию исходящих TCP портов" вы себе выдумали на пустом месте, при использовании обычного коннекта будет такая же "экономия".

    Ипатьев, TCP коннекты - тяжёлый и ограниченный ресурс. Осознание этого факта обычно приходит с опытом работы в хайлоаде. Нет ничего зазорного в том, что вы не верите. Я бы тоже не поверил, если б не столкнулся лично.

    В документации на эту функцию нигде не написано, что она служит для проверки соединения или замены mysqli_ping.

    А она и не предназначена для замены mysqli_ping. Не понимаю с чего вы так решили. Я лишь посоветовал ТСу заменить mysqli_ping на mysqli_change_user в данном конкретном скрипте, потому что это лучший вариант конкретно в этом случае.
    И вот именно для того, чтобы сэкономить все эти операции, mysqli_change_user не следует дёргать при каждом обороте event loop-a. Это просто глупость.

    Получается, разработчики расширения mysqli тоже совершают глупость, так как они вызывают ровно эту же функцию в реализации персистентных соединений.
    А если коннект действительно упал, то mysqli_change_user не сработает.

    Всё верно. И на такой случай ТС уже ввёл переменную $connOk и она прекрасно сработает в тандеме с mysqli_change_user.
    поэтому надо написать свою замену mysqli_ping
    ...
    и не выдумывать.

    А потом ловить непонятные проблемы, когда скрипт вызывает mysql функцию get_lock, а release_lock не вызывает, потому что где-то между этими вызовами скрипт ловит эксепшен и выдает клиенту ошибку и приступает к обработке нового http запроса, который сразу же впадает в дедлок, пытаясь захватить этот не освобожденный лок. Или транзакция не успевает закоммититься из-за того же эксепшена, а глупый программист не натыкал где надо ролбэков, в итоге следующий http запрос продолжит чужую транзакцию. Я понимаю, что get_lock, транзакции из более чем одного запроса - это уже продвинутые фичи и не каждый с ними знаком. Но всё же они существуют и по мере развития проекта могут больно ударить пользователей roadrunner и других ивент лупов.

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

    Vamp
    @Vamp
    Ипатьев, не напутал. Так написано в документации на эту функцию. К тому же нативные персистентные коннекты в mysqli очищаются ровно таким же способом перед запуском нового php скрипта (об этом тоже написано в доке).

    С таким же успехом можно и вовсе новое соединение открывать.

    Можно, но тогда каждый раз будет создаваться новое TCP соединение. Вероятно, помимо экономии на установке TCP, экономится ещё и время на создание внутренних структур и проведение какой-то подготовительной работы на стороне сервера для каждого нового коннекта. Ещё бонусом идёт экономия исходящих TCP портов, но ТС вряд ли когда-то столкнётся с проблемой исчерпания портов.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Михаил, ну так в 8.4 её не удалили и всё ещё можно пользоваться. Однако "можно" != "нужно".
    Написано
  • Что подразумевается под полем http_x_real_ip в log_format Nginx?

    Vamp
    @Vamp
    Salamandrine, формат этих заголовков отличается. В X-Forwarded-For может указываться несколько ip адресов через запятую. Первым будет ip клиента, а следующие - ip промежуточных прокси, через которые проходил запрос:
    X-Forwarded-For: <client>, <proxy1>, <proxy2>
    Более подробно по ссылке.

    В X-Real-IP указывается только ip клиента.
    Написано
  • Пробросил порты. TCP работает, UDP нет. В чём может быть причина?

    Vamp
    @Vamp
    pfg21, это gpon роутер. Сомневаюсь, что у ТС найдётся комп с оптическим интерфейсом для проверки.
    Написано
  • Какие есть варианты grpc service discovery с минимальным откликом?

    Vamp
    @Vamp
    tync, понятно. А в чём вопрос? Конкретизируйте.
    Написано
  • Какие есть варианты grpc service discovery с минимальным откликом?

    Vamp
    @Vamp
    Не очень понятно в чём проблема с Eureca, ZooKeeper, Consul. Вы делаете дисковери запрос 300+ раз в сек? Зачем так часто?
    Написано
  • Как подключить все 4 вентиляторы в пк на один разьём 4 pin?

    Vamp
    @Vamp
    Fessoxx, мда, мануалов на неё в сети не найти.

    Вобщем, в разъём CPU_FAN вставляете только кулер от процессора, без вариантов. Если все остальные SYS_FAN у вас трёхпиновые, то есть три варианта.

    1. Воткнуть провод от контроллера в 3-pin коннектор. 3-pin и 4-pin совместимы друг с другом. Можно 4-пиновый коннектор вставлять в 3-пиновый слот и наоборот, 3-пиновый коннектор в 4-пиновый слот.

    Распиновка у 4-pin такая: первые два - питание, третий - тахометр (кулер по нему подаёт в материнку информацию о своей скорости вращения), последний - PWM (по нему материнка управляет скоростью кулера).

    Скорость материнка может регулировать путём изменения напряжения на пинах питания (это единственный вариант для 3-пиновых соединений), либо отправляя сигнал на пин PWM (позволяет регулировать скорость в более широких пределах, чем регулировкой одного только питания).

    Обратите внимание на кабель от вашего контроллера:
    68c99b2a1f9c1004735209.png
    Проводки к пинам питания отсутствуют, так как у контроллера своё питание через SATA коннектор напрямую от БП. PWM висит в воздухе. Реально подключен только тахометр. Такая схема будет работать, но есть нюанс - материнка лишена любых возможностей регулировать скорость. Зато можно будет посмотреть в биосе или системных тулзах в ОС скорость, так как тахометр всё же подключен. Только смысла в этом мало, ведь скорость всегда будет статичная.

    2. Не вставлять в материнку ничего. Кулеры будут и так работать. Единственное отличие от варианта 1 - в системе не будет видна скорость вращения кулеров.

    3. Переткнуть кабели от кулеров из контроллера в материнку. Если SYS_FAN разъёмов на материнке не хватает, можно воспользоваться разветвителем типа такого:
    68c99d7f4283e811599145.png
    Надо только следить, чтобы на каждый SYS_FAN разъём было подключено кулеров с суммарной силой тока не более 1А (как определить ток кулера я писал в комментарии выше). RGB кабели можно оставить подключенными в контроллер и управлять подсветкой через кнопку reset (если сама кнопка подключена к контроллеру).
    Написано
  • Как учиться и практиковаться?

    Vamp
    @Vamp
    Adamos, негативная мотивация работает крайне редко.
    Написано