День добрый, уважаемые! Есть несколько приложений, каждое из которых обращается к веб-сервису, забирает из него данные и обрабатывает. Обращаться надо периодически (данные меняются с течением дня, представьте, что это курс валюты с сайта ЦБ). Вопрос: как синхронизовать приложения так, чтобы они не сохранили нужные данные дважды? Разрешить обращаться к сервису только одному приложению нельзя. Если бы был только один клиент, я бы сделал так: забирал бы данные, сохранял бы их в базу и кэш базы, при очередном обращении проверял нет ли уже таких данных. Но ситуация сложнее. Сохранять данные в общей БД можно, но т.к. синхронизации нет, то нет гарантии, что клиенты не запустятся одновременно и одновременно занесут в БД одно и то же значение курса (за 15:00, например). Какие я вижу варианты: Как-то залочить БД пока выполняется один из клиентов. Наподобие lock или synchronized в Джаве. Это можно сделать? Грузить все в одну таблицу запросом вида insert if unique, а потом считывать оттуда. В принципе нормальный вариант, хотя, мне кажется, более ресурсозатратный, чем первый. Сохранять в таблице индекс следующего клиента, чтобы остальные не запускались одновременно (то есть разнести их по времени). Что скажете?
Ответ
А кто мешает сделать так. Делаем одно приложение, которое знает, когда и как можно обращаться к внешнему сервису, как читать и писать. А все Ваши сервисы подключаются к этому приложению. А оно либо отдает с кеша, либо делает запрос и отдает. Эта схема решит много вопросов - синхронизацию, актуальность данных, отладку. А также, представьте, что внешний сервис поменял АПИ/адрес. При правильном подходе, все приложения даже не заметят, что внешний сервис изменился/упал/прислал заведомо неверные данные.
Комментариев нет:
Отправить комментарий