Обработка задания Laravel/Redis с нескольких серверов

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

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

Итак, ограничение:

1. Мы можем отправить 1 запрос в секунду

2. 250 строк на запрос

Таким образом, для получения пользовательских данных требуется 400-4000 запросов / заданий. Таким образом, загрузка данных для нескольких пользователей занимает очень много времени, а сервер работает медленно.

Итак, теперь мы планируем загружать данные, используя несколько серверов, например, 4-10 серверов для выборки пользовательских данных, поэтому мы можем отправлять 10 запросов в секунду с 10 серверов.

Как мы можем проектировать систему и обрабатывать задания с нескольких серверов?

Можно ли использовать выделенный сервер для размещения Redis, подключаться к этому серверу Redis с нескольких серверов и выполнять задания? Может ли случиться конфликт или гонка?

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

1 ответ

Решение

Короткий ответ: да, это абсолютно возможно, и я уже много раз реализовывал это в производственных приложениях.

Redis, как и любая другая служба, может работать где угодно, с подключенными к ней клиентами из любой точки мира. Все зависит от вашей конфигурации сервера, чтобы определять, как именно это происходит (и добавлять пароли, настраивать spiped, ограничивать доступ через брандмауэр и т. Д.). Я бы рекомендовал ознакомиться с документацией, которую они имеют в разделе "Администрирование", здесь: https://redis.io/documentation

Кроме того, когда вы переходите на выделенный хост Redis с несколькими клиентами, обращающимися к нему, вы, вероятно, захотите использовать несколько серверов Redis для обеспечения надежности, высокой доступности и т. Д. Redis имеет эффективную и простую репликацию. доступно с несколькими простыми командами конфигурации, о которых вы можете прочитать подробнее здесь: https://redis.io/topics/replication

Последнее, что нужно сделать в Redis: если вы в конечном итоге реализуете настройку "ведущий-ведомый", вы можете захотеть изучить высокую доступность и автоматическое переключение при сбое, если ваш мастер-экземпляр выйдет из строя. Redis имеет действительно замечательную утилиту, встроенную в приложение, которая может контролировать ваш Master и Slave, определять, когда Master отключен, и автоматически перенастраивать ваши серверы, чтобы продвигать одного из slave-ов на новый master. Утилита называется Redis Sentinel, и вы можете прочитать об этом здесь: https://redis.io/topics/sentinel

На ваш вопрос об условиях гонки это зависит от того, как именно вы записываете свои задания, которые помещаются в очередь. Хотя для вашего случая использования это не звучит так, как будто это слишком большая проблема, но на самом деле это зависит от ограничений сторонней системы. В любом случае, если вы находитесь в состоянии гонки, вы все равно можете реализовать решение для него, но, вероятно, потребуется использовать что-то вроде блокировки Redis ( https://redis.io/topics/distlock). Тейлор недавно добавил новую функцию в будущую версию 5.6 Laravel, которая, как мне кажется, реализует версию блокировки Redis в планировщике ( https://medium.com/@taylorotwell/laravel-5-6-preview-single-server-scheduling-54df8e0e139b). Вы можете посмотреть, как это было реализовано, и приспособиться к своему варианту использования, если вам это понадобится.

Другие вопросы по тегам