Доктрина ВСТАВИТЬ / ОБНОВИТЬ / УДАЛИТЬ ожидание репликации рабов - PullRequest
0 голосов
/ 28 сентября 2018

У меня странная проблема с подключением Symfony Doctrine Master / Slave.Мы используем Amazon RDS Aurora, MySQL с мастер-репликой.Он отлично работает, за исключением того, что наше приложение работает слишком быстро.

Каждый запрос INSERT / UPDATE / DELETE всегда отправляется мастеру, затем AWS RDS автоматически реплицирует данные на ведомые устройства с задержкой, в среднем равной 20 мс.

Когда наше приложение выполняет какой-либо из этих запросов, а затем перенаправляет пользователя назад на то, что он делал, приложение выполняет ВЫБОР, чтобы увидеть изменения, и очень часто это происходит настолько быстро, что оно еще не реплицируется, поэтомупользователь видит устаревшую информацию.

Я хотел бы реализовать быстрое исправление, добавив, предпочтительно, прослушиватель событий при каждом запросе, поэтому, если Doctrine выполнила INSERT / UPDATE / DELETE, я могу добавить сонмеханизм для дополнительных 50-100 мс, так что эти запросы занимают немного больше времени, прежде чем вернуть 200 клиенту, чтобы он мог обновить.

У кого-нибудь была подобная проблема?

Полагаю, это хорошая проблема, но она очень раздражает, и UX значительно сокращается из-за быстроты.

Пожалуйста, дайте мне знать, если есть лучший quick Решение этой проблемы.Наше приложение выполняет во много раз больше операций чтения, чем записи, поэтому добавление 100 мс для запросов на запись не будет замечено клиентом.Я хотел бы решить это на уровне запроса.Просматривать каждый контроллер, который выполняет запись, не вариант, так как это массовое приложение.

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете использовать встроенные хуки жизненного цикла (https://symfony.com/doc/current/doctrine/lifecycle_callbacks.html)

Например, использование postUpdate и PHP usleep () может помочь решить вашу проблему.

/**
 * @ORM\PostUpdate
 *
 * @return void
 */
public function awaitReplication() : void
{
    usleep(200);
}
...