Использование повторного поиска в параллельных запросах

#laravel #postgresql #redis #geospatial #redisearch

Вопрос:

Я развернул API с использованием Laravel 8 на большом сервере M6G 8X. Моя системная архитектура выглядит следующим образом.

Client -> NGINX -> PHP-FPM -> Laravel API -> PGBouncer -> PostgreSQL/PostGIS

API возвращает результат клиентскому запросу из функции Postgres, которая использует информацию из таблицы из 12 миллиардов записей в среднем за 300 мс. Я провел нагрузочное тестирование с помощью jmeter для 50 тыс. запросов с 500 параллельными запросами, для которых у меня пропускная способность всего 390 запросов в секунду.

Чтобы устранить эту проблему, я загрузил 12 миллиардов записей в память Redis и выполнил ту же операцию с функцией postgres в Redis, используя RediSearch FT.Агрегатная функция с геопространственным фильтром, для которой я получил результат в среднем 250-300 мс. Я провел такое же нагрузочное тестирование для 50 тыс. запросов с 400 параллельными запросами, в которых я получил пропускную способность всего 45 запросов в секунду, что намного хуже, чем подход с функцией Postgres.

Client -> NGINX -> PHP-FPM -> Laravel API -> Redisearch -> Redis

Пожалуйста, дайте мне знать о том, как повысить пропускную способность для одновременных запросов с использованием подхода Redis, поскольку я предполагаю, что в Redis нет проблем с блокировкой или подключением к базе данных Postgres. Спасибо.

Пример Запроса

 FT.AGGREGATE test_idx "@location:[-84.31455662683010 33.92779720276280 20 mi]" 
APPLY "geodistance(-84.31455662683010,33.92779720276280, @location)" as distance 
APPLY "(@a*(( 20-(@distance/1609.344))/20))" as a1 
APPLY (@a1*@b) as a1b 
APPLY 1 as test 
GROUPBY 1 @test 
    REDUCE SUM 1 @a1 as a_total 
    REDUCE SUM 1 @a1b as a1b_total 
    APPLY (@a_total/(3.14*(20^2))*100) as val_1 
    APPLY (@a1b_total/@a_total) as val_2

 

Комментарии:

1. Как вы развернули Redis/RediSearch? Вы используете кластер? Не могли бы вы, пожалуйста, добавить образец запроса?

2. Это система с одним экземпляром или несколькими экземплярами? Если у этого есть несколько экземпляров, мы хотим добавить все экземпляры в одну группу кластеров

3. Я загрузил модуль Redisearch, установленный и созданный из исходного кода в библиотеке Redis. Я не использую никакой кластер. Я отредактировал вопрос с помощью примера запроса.

4. Это система с одним экземпляром.

5. Тогда, я думаю, у вас есть ответ, если вы хотите масштабировать его, вам нужно запустить несколько сегментов, масштабирование Redis по нескольким процессам.