| Задача | Разработать отказоустойчивый сервис для оповещения абонентов Beeline о прогнозе погоды |
|---|---|
| Аналитик | @Останин Владимир |
| Системы | db.BeeWeather, kazhydromet, BeeWeather systems |
| -- | -- |
-
Я как абонент компании Beeline Хочу иметь возможность подписаться на рассылку о прогнозе погоды Для того чтобы оперативно корректировать свои ежедневные планы сразу же после пробуждения
-
Я как абонент компании Beeline Хочу иметь возможность отключения рассылки Для того чтобы не засорять телефон не актуальной для меня в данный момент времени информацией
-
Я как клиент компании Beeline Хочу получать SMS-рассылки о прогнозе погоды вне зависимости от своего местоположения Для того чтобы наверняка знать как правильно одеться и на чем будет лучше добраться, находясь в путешествии или в командировке
(при смене страны мы как система понимаем в какой стране в данный момент находится Клиент, как правило в момент пересечения границы, когда появляется связь Клиент получает сообщение о предложении подключить роуминг)
-
Сервис для получения данных от Клиента Метод: POST (PATCH) REQUEST:
{"counterpartyId": "5ba50bae-3dda-11eb-aaaf-001dd8b71ef5","FIO": "Останин Владимир Олегович","city": "Astana","country": "Kazakhstan","smsWeather": "true"} -
Сервис для получения информации о погоде из Казгидромета Метод: GET REQUEST:
{"country": "Kazakhstan""city": "Astana",}RESPONSE: 200 OK:{"country": "Kazakhstan","city": "Astana","temp": "-5",- текущая температура в указанных ед. изм"feels_like": "-10",- температура по ощущениям"temp_min": "-7",- минимальная температура"temp_max": "-3",- максимальная температура"pressure": "743",- атмосферное давление (опционально)"humidity": "81%",- влажность воздуха (опционально)"wind": "18",- скорость ветра в указанных ед. изм."precipitation": "false",- вероятность выпадения осадков"weather_description": "sunny",- описание погоды} -
Сервис для отправки SMS-рассылок о погоде Если мы смогли получить информацию о погоде по городу, в котором на данный момент находится наш абонент, то отправляем один из шаблонов сообщений, пример: "Добрый день! Сегодня в вашем городе {city} ожидается {weather_description}. Текущая температура воздуха {temp}. Минимальная температура {temp_min}, максимальная температура {temp_max}, ветер {wind} м/с, осадков не ожидается. Сегодня отличный шанс начать день с пробежки! С заботой о вас, BeeWeather."
Если мы не смогли получить информации о погоде в нужном городе (не отвечает сервер, либо сервер не смог обработать наш запрос, но исходя из исторических данных мы знаем что абонент сменил местоположение в ближайшие дни, предположим что абонент улетел в Грузию) то отправляем один из шаблонов сообщений, пример: "Доброе утро! Доброе пожаловать в "страну вина и хачапури"! Приятной поездки. С прогнозом погоды вернемся завтра :)"
Если мы не смогли получить информации о погоде в нужном городе (не отвечает сервер, либо сервер не смог обработать наш запрос, местоположение абонента не изменялось) то отправляем один из шаблонов сообщений, пример:
"Уважаемый клиент! Мы не смогли определить Ваше текущее местоположение, мы постараемся разобраться и уже завтра продолжить уведомлять о погоде, а пока Вы можете установить наше приложение и узнать погоду в нем, приложение BeeWeather: https://beeweather/appdownload"
- Внутренние сервисы получают данные от клиента при смене одного из ключевых параметров, на вход получаем уникальный идентификатор абонента, страну, город, и признак типа boolean (хочет ли абонент получать от нас SMS рассылку о погоде или нет) -> записываем данные в бд
- Планировщик по заданному расписанию обращается к бд для того чтобы забрать списки абонентов (участвующих в рассылке), далее отправляет последовательно очередью сообщений запросы в Казгидромет, где на вход отдает такие параметры как "Страна", "Город", в ответ получает детальную информацию о погоде (ОК:200) - после чего данные отправляются на вход следующего планировщика который парсит данные и отправляет SMS-рассылку адресно каждому абоненту. В случае получения "плохого ответа" от сервисов Казгидромета - данные отправляются на вход следующему планировщику который обрабатывает данные и с помощью openAI (подпроцесс не описанный в данной документации) генерирует SMS-сообщения, после чего отправляет адресно каждому абоненту.