• Как правильно настроить подключение к RabbitMQ с использование Docker и Laravel?

    black1277
    @black1277
    Вольный стрелок
    Для fpm откройте порт и привяжите сеть:
    fpm:
        build:
          context: .
          dockerfile: docker/Fpm.Dockerfile
        volumes:
          - ./:/var/www/laravel-docker
        ports:
          - 5672:5672
        links:
          - mysql
        networks:
          - mm-network
    
    networks:
      mm-network:
        external: true

    и в самом PHP нужно соединяться не на 15672 порт (это порт для вебинтерфейса), а на 5672. Строка подключения на rabbit должна выглядеть так:
    amqp://guest:guest@localhost:5672
    Ответ написан
    1 комментарий
  • Как с помощью SQL запроса выбрать из строки значения и посчитать их уникальное количество?

    @DKSoft
    Можно попробовать так
    with a as  #преобоазуем в json массив
    (select id,concat('[',replace(descr,'}{','},{'),']') as d1
     from x1
    )
    ,b as ( # массив в таблицу
    select id,JSON_EXTRACT(d1, '$[1]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[2]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[3]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[4]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[5]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[6]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[7]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[8]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[9]') as d2
     from a
    union all
    select id,JSON_EXTRACT(d1, '$[10]') as d2
     from a
    )
    -- подсчет
    select id,count(distinct JSON_VALUE(d2,'$.DeviceID')) as count
    from b
    where b.d2 is not null
    group by id

    если в поле descr больше 10 элементиов то надо добавить в b допролнительные union all
    Ответ написан
    Комментировать
  • Как из input в blade передать внесенный email в route Laravel?

    @Romatio
    Вместо < a > сделай < form >, где method="get".
    Ответ написан
    Комментировать
  • Как загрузить большое количество данных в базу SQLite на React Native?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я не встречал бесплатных механизмов репликации. Обычно для толстых коммерческих БД типа Oracle продавались коробочные продукты (Streams/GoldenGate) которые требовали знаний на уровне сертификации.

    Какие могут быть пути репликации в простом случае. Для таких детских бд как SQLits:

    1) Убить всё что локально и скачать все что есть в удаленной БД. На вид выглядит просто. Но неясно
    как часто это делать. Что будет триггером для такого события? Очевидно что должна быть золотая середина
    между потерпеть еще на старых данных или плюнуть и стартовать обновление которое на мобиле
    может затянуться на несколько минут. Вобщем пользователь страдает.

    2) Придумать механику инкрементального обновления. Для этого вам будет нужно добавить во все
    таблицы поле типа last_update_timestamp (вот примерно как Сергей выше писал) и обновлять только те
    записи которые старше максимальной даты которая уже есть. Кроме того надо во второй транзакции
    убить те записи которые были удалены в remote. Здесь - посложнее т.к. для убийства мы должны
    гарантировать существование PK для всех отслеживаемых таблиц. Мой опыт работы с БД показывает
    что там не то что PK там даже и нормализация не всегда делается. Все это как-то выглядит хрупко
    как хрустальная ваза и возможно потребует дополнительных индексов которые раньше не требовались
    для работы системы. Но при хорошем индексировании триггер можно дергать хоть каждые 15 минут.

    В более сложном варианте я-бы предложил реплицировать не SQL протокол а тело самой таблицы.
    И вести учет контрольных сумм блоков наподобие дерева Меркла. Но это решение настолько далеко
    уходит от React-Native приложух что я-бы сам себе не советовал. Тут еще могут быть трудности с native
    представлением SQLite. Неизвестно будет ли такая реплика бинарно-совместима.
    Но это будет хотя-бы быстрая реплика.
    Ответ написан
    Комментировать
  • Как загрузить большое количество данных в базу SQLite на React Native?

    @rPman
    Все очень зависит от особенностей задачи, объема данных, требований к непрерывности и т.п.

    Основные идеи по ускорению, после исправления ошибок в приложении (и исследовании вариантов заплатить за лучшее железо) само собой:
    * пакетная обработка (в пределах одной транзакции или объединение тысяч операций в одной)
    * партицирование, часто бывает так что все данные на время обработки не нужны, т.е. идеологически или даже средствами базы данных, можно отделить архивную базу (большую но практически не используемую) и оперативную... меньше база, быстрее обработка

    Дальнейшие варианты нарушают непрерывность работы сервиса (не всегда это возможно), пусть и кратковременно

    * временное отключение индексов, когда новых данных очень много и нагрузка из-за их количество значимей чем нагрузка на процессор и оперативную память, очень часто это дает наилучший прирост в скорости (однократно создать индекс на большой объем данных на порядок быстрее чем обновление индекса на каждую новую запись)

    * перенос работы на более быструю машину, благодаря почасовым/поминутным облачным тарифам и продвинутым функционалом, можно автоматически поднимать заранее подготовленную машину, даже в том же датацентре (это ускорит передачу данных и скорее не добавит стоимость за трафик) переносить обработку на нее, а по окончанию возвращать назад.
    Технически это можно реализовать как через скрипты резервного копирования так и репликацию файловой системы (та же btrfs предлагает быстрые и 'бесплатные' по ресурсам инкрементальные бакапы на основе снапшотов) или кластерные файловые системы. Осторожно, базы данных, особенно сложные, могут хуже работать (в разы) на cow файловых системах типа btrfs, но это вопрос исследований под данные и задачу.

    * частный случай с предыдущим - перенести базу данных в оперативную память. sqlite работает в ней невероятно быстро (пример реализации, машина останавливается, у провайдера создается новая с тем же диском но большей оперативной памяти, выполняется нужная работа, временная машина удаляется, диск остается).
    Как вариант - у меня был эксперимент, на ram диске соседней машины создавался образ файловой системы, этот файл публиковался с помощью nbd (это как iscsi только проще и быстрее), монтировался уже на целевой машине и туда переносилась база данных, это было во времена hdd и давало очень значимый прирост (вместо часов работы - минуты), теперь с ssd такой разницы можно не получить или для этого потребуется быстрее сети, не гигабитные), сразу скажу что сетевые файловые системы типа nfs/samba не рекомендуются, так как привносят кучу накладных расходов из-за возможности немонопольного доступа и просто из-за особенностей реализации (например fflush на nfs сильно замедляет работу по сравнению с локальной, так как работает по разному)

    Еще один момент, когда база значительно превышает доступную ram, временная база может быть размещена в файловой системе с отключенным принудительным fflush (т.е. по просит дождаться синхронизации данных а ОС рапортует в тот же момент что все записалось, хотя это не так), реализуется это по разному, начиная с опций файловой системы ext data=writeback, отключения журнала и кончая интересных вариантов у виртуальных машин, такой конфиг может работать сравнимо с оперативной памятью, так как все оперативные данные будут закешированы, но само собой очень уязвим ко сбоям, любая аппаратная проблема или глюк ОС убьют данные максимально неприятным способом, но так как такая машина временная, это не проблема, ведь данные в нее копируются на время обработки.

    ---
    все это к тому, что задачу можно решать таким образом, чтобы исключить или перенести узкое место по ресурсам в другое место, вплодь до кластерных решений (буквально поднимается целый кластер, он запускает обработку, работает считанные минуты и уничтожается)
    Ответ написан
    Комментировать
  • Как загрузить большое количество данных в базу SQLite на React Native?

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

    В локальной БД сохраняйте дату последней репликации в отдельной таблице.
    Имейте в виду, что обратная репликация из оффлайн БД в основную уже не будет такой простой. Во-первых нужно что-то придумывать с генерацией идентификаторов для новых записей. Возможно придётся переходить на 16-битные идентификаторы (GUID), чтобы они не пересекались с основной базой.
    Ещё нужно понимать, что в оффлайн режиме у вас может оказаться недостоверным время на локальной машине.
    Если на локальной машине есть доступ к GPS, то можно снизить число негативных последствий, но не предотвратить их вовсе.
    Если вам критично не перепутать время правки записей и первоисточник изменений из-за неточности локального времени, то тут надо будет предпринимать меры для решения этой проблемы, и, есть вероятность, что придётся идти на серьёзные компромиссы.
    Если у вас будет много локальных клиентов, которые будут работать в оффлайн-режиме, то ситуация усугубится многократно. Минимизируйте возможность правки общих данных клиентами из оффлайн-режима.

    Помните, что GPS сейчас не гарантирует достоверного времени на локальной машине, поскольку в некоторых регионах военное положение, а подразделения РЭБ в куче мест ставят помехи и искажают сигналы со спутников. Часы могут сильно врать.
    Ответ написан
    Комментировать
  • Как сделать чтобы PHP скрипт по завершении работы отправлял на фронт уведомление?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Самый простой, элементарный, дуболомный вариант:
    раз уж ваш скрипт запускается HTTP-запросом через HTTP-коннект - не давать этому HTTP-коннекту умирать по timeout-у. А значит надо каждые 25 секунд (а лучше каждые 20, да даже каждые 10 секунд) передавать в коннект любые валидные HTML-данные. Самое удобное - строку HTML комментария:
    echo("<!-- empty line -->");flush();
    Если поверх вывода накручены буфферы - проходить по всем буфферам и принудительно их ob_flush(), что бы строка улетела HTTP-клиенту.

    Тогда и PHP, и Nginx, и браузер этот коннект по timeout-у - не закроют. Вуаля, профит!
    Ответ написан
    3 комментария
  • Как сделать чтобы PHP скрипт по завершении работы отправлял на фронт уведомление?

    vabka
    @vabka
    Токсичный шарпист

    Или например при выполнении скрипта на бэке записывать в базу результат а фронт будет через 5 минут спрашивать бэк все ли готово?

    Этот вариант в любом случае придётся реализовать, тк ты не можешь гарантировать, что всё время от запроса до итогового результата у пользователя будет работать сеть.

    Я рекомендую всётаки озадачиться вебсокетами, тк это сейчас наиболее стандартный спобом общения клиента с сервером в реальном времени.

    Без вебсокетов можно попробовать server sent events, но лично я никогда ихне пробовал и не знаю подводных.
    Ответ написан
    Комментировать
  • Можно ли перезапустить сервер если он не отвечает?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Зависший сервер - это как правило вообще неработающий комп, до которого уже никак не достучаться. И через Zabbix Agent в том числе.

    Поможет только IPMI, который в полноценном сервере обязан быть (имеется ввиду НЕ персоналка, из скряжничества обозванная сервером). Либо watchdog, в сервере он тоже должен быть.
    Ответ написан
    Комментировать
  • Можно ли перезапустить сервер если он не отвечает?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Можно. Но если агент не отвечает на пинги, то есть ненулевая вероятность, что и команда на перезапуск до него не дойдёт. Обычно в подобных случаях используют ресет по IPMI и тому подобные вещи.
    Ответ написан
    Комментировать
  • Как исправить ошибку [Z3001] connection to database 'zabbix' failed: [2002] Can't connect to MySQL server on '139.162.155.83' (13)?

    dyuriev
    @dyuriev
    A posteriori
    в файле /etc/zabbix/zabbix_server.conf поменяйте адрес mysql сервера с 139.162.155.83 на localhost
    Ответ написан
    3 комментария
  • Как сделать ребут и мониторинг серверов с помощью PHP команд?

    @urhero
    Используйте решения для мониторинга, советую Zabbix, Там есть готовые шаблоны для всех популярных сервисов. Если уж прям надо ребутать, там есть Zabbix Actions. Но все таки советую развести мониторинг и разобраться почему сервисы падают.
    Ответ написан
    Комментировать