Pull to refresh
47
0
Kirill Yegorov @coh

Пользователь

Send message
Дело, мы сделали так же. Дошли до дизайнера интерфейсов.
Easy easy, real talk :)
Спасибо за статью, интересная тема оказалось.
Для себя понял, что видимо индексированные массивы всетаки не до конца оптимизировали в 7ке по сравнению с fixed.
Что-нибудь типа:
$visits[$row['id']] = implode(';', array_values($row));

не тестировали?
Внутри тоже можно использовать fixed.
Теперь понял, вы убрали оверхэд на создание мелкого массива свойств вовсе.
Решил использовать разбиение трёхмерного массива совместно с SplFixedArray и потребление памяти упало ещё в 3 раза составив 704 МБ


Не понял почему вы не стали хранить данные в формате типа:
$visits[$row['id']] = [
            $row['user'],
            $row['location'],
            $row['visited_at'],
            $row['mark'],
        ];

заняло бы еще меньше на PHP 7 точно
Ну наконец-то появился конструктив.

JOIN на шарде — вполне годная тема, особенно если архитектура изначально предрасположена к шардированию. Это не отменяет того, что возможно придется сделать довыборку данных из другого источника и в этом нет ничего страшного. Транзакции нужно использовать для финансовых операций с этим никто не будет спорить.

Есть другая крайность с которой мне приходится часто сталкиваться — 1 сервер БД который не в состоянии переварить все данные и запросы, блокировки и прочее. Когда приложение написано с огромным кол-вом объединений. Чтобы растащить такую базу нужно очень сильно поднапрячься. Именно поэтому в вебе join больше зло. Потому как даже просто вынос конкретной таблицы на отдельный сервер представляет сложную задачу.
Видимо мы разговариваем на разных языках…

Статья «Чек-лист по выживанию сайта».

Я про join и шардинг (не всегда данные влазят в одну базу и обилие join серьезно усложняет шардирование), а вы мне про справочники и транзакции.

Почему вы решили что я не использую транзакции, опять фантазия?
Не вижу смысла продолжать обсуждение.
Про справочники — это ваши фантазии, как и про полный объем данных по связям без фильтрации.

На эту и смежные темы написаны сотни статей, подготовлены презентации для десятков конференций Highload и прочих

Если лень гуглить:

http://www.myshared.ru/slide/9793/ (слайд 38)
http://highload.guide/blog/sharding-patterns-and-antipatterns.html (к тезису про справочники, и вашему предположению, что все нужные данные на одном шарде)

Интересно, шардинг тоже антипаттерн?
Интересных и крупных проектов достаточно, только управляются они обычно из Москвы или заграницы.
Нижегородским компаниям, работающим на внутренний рынок очень тяжело бороться за кандидатов по условиям.
Скорее решение не «пока нет большой нагрузки», а пока нет сотен тысяч заданий.
В том варианте, что я предложил: второй воркер, если возьмет ту же задачу, что и первый — не сможет повесить на нее лок, соответственно возьмет следующую по списку
Очереди в бд — не лучшее решение, но может пригодиться упрощенный псевдокод (применим к MySQL):
// лучше иметь отдельный коннект для очереди
$db->query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$db->beginTransaction();

// время, когда считаем lock устаревшим
$locktimeout = '2001-01-01 00:00:00';

try{
 $row = $db->getRow('SELECT * from `queue` WHERE `lock` IS NULL OR `lock` < "'.$locktimeout.'" LIMIT 1');
 $db->update('queue' , ['lock' => date('Y-m-d H:i:s')], 'where `id`='.$row['id']);
 $db->commit();
}catch (Exception $e){
    $db->rollBack();
    // deadlock, try restart transaction, как ожидаемое поведение MySQL
    if($e->getCode() = 1213){
        // принимаем меры
    }
}

В случае очереди на БД, если 2 инстанса одной...

Зависит от уровня изоляции, если поставить serialized и в транзакции ставить метку в строку, то один запрос отвалится с retry transaction
Промахнулся со статическим связыванием, проблема со статическими свойствами.
Все бы хорошо, если не большое количчество нюансов, ограничей и отличия работы PHP c pthreads от PHP как такового.
Нельзя быть уверенным, что стандартная языковая конструкция будет работать корректно.
Пример: https://github.com/krakjoe/pthreads/issues/52
И многое другое, типа позднего статического связываня и наследования… Достаточно взглянуть https://github.com/krakjoe/pthreads/issues

Как эксперимент, очень интересная библиотека. В продакшен?… врядли.
На вкус и цвет, дело не в этом. Стандартная языковая конструкция не работает. По манулалу ожидается одинаковое поведение по факту нет.
Например, если ожидается не 0. По вашему есть разница?
 if(!empty($interval->d)){
  ...
 }
 // и
 if($interval->d >0){
  ...
 }

Information

Rating
Does not participate
Location
Россия
Registered
Activity