Как архитектурно решить проблему нескольких источников стран-городов-индексов?
Имеется источник городов и доступных почтовых индексов в них
Но прямого доступа вида "скачать все" у источника нету - есть только возможность отправить запрос из "более чем двух символов", чтобы по индексу или части названия города + коду страны в системе вытащить результаты, скажем тысячу штук
Список городов также зависит от страны, а стран вообще около 400 штук (и в каждой по сотне другой городов, и для каждого города пара тысяч индексов)
Список может меняться, поскольку геополитическая обстановка нынче нестабильная, один город пропал, появился новый, страны меняются, в конце концов сервис просто может перестать обслуживать определенные города или индексы в них.
Частота, с которой данные меняются неизвестна, по сообщениям техподдержки - это непредсказуемо - когда раз в неделю, когда раз в три месяца, когда каждый день.
Имеет ли смысл какое-нибудь решение по кешированию или лучше все оставить вида:
- вводишь две буквы города
- аякс запрос на скрипт по keyup
- скрипт обычным запросом выдрал данные с удаленного сервака
- данные отобразились
Минус только в том, что запрос на аякс занимает ну четверть секунды, потом запрос на удаленный сервак, плюс его обработка еще полсекунды - в общем и целом секунду на постоянный дроч запросами удаленного сервака, даже учитывая, что можно сбить спесь пользователя установкой таймаутов и отображением анимации типа "подождите, идет запрос".
То есть я думаю над тем, чтобы ежедневно делать накопительный кэш из запрошенных городов, чтобы экономить запрос, или я таким образом кроме геморроя ничего себе не наэкономлю?
Вот еще сюрприз - что завтра подключается другой такой же сервис, у которого своя собственная база городов и индексов, и коды (или даже названия) городов могут отличаться наличием затупов, верхних апострофов, дефисов, пробелов и тд - допустим даже общий код, тем не менее связка из кучи источников да на кэш помножить - голова уже вскипает.
Какой лучший способ разрулить? Кешировать результаты запросов в общую таблицу, и вешать кэш например на сутки? А как наполнять такую базу? Или самое лучшее решение это оставить все как есть - пусть себе аякситься?
Кэшируйте.
Возможно лучше даже не кэшировать, а сделать свою БД, куда информация будет попадать от запросов (если в базе отсутствует). В этом случае нужно будет сделать автономный сервис, который раз в день, например, будет обновлять информацию в базе.
В случае своей БД при падении источника вы все равно останетесь в работоспособном состояни.
Я про это и думаю, но как сделать этот запрос архитектурно-верным?
Две буквы, 1000 результатов и это для одной конкретной страны...
Получается нужен циклический запрос вида
1 берешь аа
2 смотришь 1000 результатов и сохраняешь
3 определяешь две буквы последнего результата
4 если буквы те же что в запросе - берешь результаты от 1000 и так до тех пор пока
5 если буквы другие - следующий запрос уже по другим буквам
6 повторить для каждой страны?
Двухбуквенные коды стран, видимо, не просто так назначаются. Думаю используется какой-то классификатор/справочник. Так что коды стран перебирать не придется.
Но я предлагал наполнять базу по запросу пользователей.
Хотя и ваш вариант не плох.