В Тридцать Мэдисон мы помогаем людям, живущим с хроническими заболеваниями. В рамках этого мы предлагаем нашим пациентам подписку, по которой мы периодически отправляем им продукты. Это зависит от продукта, но примером может быть 30-дневный запас, который они получают каждые 30 дней.

Некоторые продукты требуют рецептов от врачей, и эти рецепты действительны в течение года. Это означает, что каждый год наши пациенты проходят новую консультацию, чтобы обновить эти рецепты.

По старому

Когда пациенты впервые регистрируются, они завершают консультацию, и их ответы рассматриваются врачом, который может задать более конкретные вопросы. Когда начинается обновление рецептов, пациенты возвращаются на наш веб-сайт и отвечают на другую, более короткую консультацию. Это может раздражать, и есть процент людей, которые никогда не начинают консультации, и другой процент, которые начинают консультации… а затем уходят, чтобы их больше никогда не видели.

Поскольку лечение хронического заболевания требует постоянного ухода, это вредно для их здоровья, и их здоровье важно для нас. Они обратились к нам за помощью в решении проблемы, и прекращать лечение из-за онлайн-анкеты - это не здорово. Итак, мы хотели лучшее решение. Что-то с меньшим трением, более низким входным барьером. То, что было так легко, было бы труднее не сделать.

Что-то вроде текстового сообщения.

Новый путь

Наша недавняя попытка включает отправку подходящих пользователей текстового сообщения с тщательно составленным вопросом, и они могут ответить простым «Да» или «Нет». Если они ответят «Да», мы отправим их к врачу, который рассмотрит их случай и задаст любые вопросы. Если все в порядке, их рецепт возобновляется.

Копаясь в деталях

Только определенные люди, отвечающие многочисленным критериям приемлемости, получают текстовое сообщение. Каждый день автоматическое задание будет опрашивать этих подходящих пациентов и отправлять каждый номер телефона в Twilio Studio, где у нас есть определенный рабочий процесс. Twilio Studio начинает с отправки тщательно составленного сообщения. Затем он ждет. Если человек отвечает в течение двух дней, он отправляет ответ на контактный веб-перехватчик на нашем сервере. В противном случае, через два дня, мы отправим их номер телефона на веб-перехватчик без контакта на нашем сервере.

Контакт

На нашем сервере мы собираем ответ с копией отправленного им вопроса и отправляем его врачу пациента на рассмотрение. В зависимости от реакции пациента мы анализируем ответ и аннотируем сообщение врачу, чтобы облегчить его рабочий процесс.

Нет связи

Некоторым людям не нравятся текстовые сообщения, или они по другим причинам игнорируют их или забывают о них. Если мы не получим ответ в течение двух дней, мы отправим тщательно составленный вопрос по электронной почте. Это не так удобно, но любой ответ будет представлен на рассмотрение врачу пациента.

Просто, правда?

На самом деле это не очень сложная ситуация. Отправьте текст через Twilio, используйте их инструменты для управления рабочим процессом, а затем передайте все врачу, чтобы он продлил рецепт. Конечно, на этом пути было несколько камней преткновения.

Сложные запросы дороги

Существовал ряд критериев для поиска пациентов, которые имели право на получение текстового сообщения. Это привело к длинному SQL-запросу. Мы довольно тщательно протестировали его, чтобы убедиться, что в него включены все люди, которым мы хотели получить текст, и исключили всех, кто должен был пройти наш старый процесс обновления. Затем мы выпустили наш запрос, и задержка нашей базы данных увеличилась с менее 200 мс до более 4 секунд:

Мы прекратили выполнение заданий, которые вызывали этот запрос, и начали расследование. Хотя мы очень добросовестно тестировали пользователей, возвращаемых запросом, мы не так внимательно относились к тому времени, которое сервер потратил на получение этих пользователей. Мы покопались в этом и обнаружили проблему с общими табличными выражениями. У нас было несколько CTE, и мы фактически дублировали работу между выражениями.

Это не настоящий SQL, но он может служить примером. У нас был CTE с некоторыми пользователями, которых мы хотели исключить, с другим, у которого был базовый набор пользователей, а затем с некоторыми, которые еще больше ограничивали выбор.

Однако мы создавали их по частям и каждый раз выбирали из таблицы «пользователи». Самая большая экономия при рефакторинге SQL заключалась в исключении части пользователей из первого CTE, а затем в дальнейшем использовании результатов этого выражения вместо базовой таблицы «users». Как только мы это сделали и объединили несколько похожих частей дублированной работы, нам удалось сократить время запроса более чем на 90%.

Прервано разрывом строки

Twilio Studio - мощный инструмент, и в целом Twilio обладает выдающейся документацией. Однако у нас возникла проблема с вызовом веб-перехватчика, и мы просто не смогли найти ответ в документации. Оказалось, что это вызвано символом новой строки:

Twilio отлично справлялся с новой строкой при отправке и получении текстовых сообщений, но если в том, что мы пытались отправить на наш веб-перехватчик, была новая строка, что-то пошло не так во время передачи. Мы убрали символы новой строки, и теперь все идет гладко.

Следующие шаги

Мы все еще оцениваем реакцию на этот новый метод непрерывного ухода за нашими пациентами. Тем не менее, мы в целом положительно отреагировали на этот опыт: количество откликов увеличилось вдвое по сравнению с более сложным процессом обновления. И чем больше людей будут продолжать лечение, тем они будут здоровее.

Мы нанимаем! Если работа над подобными проектами звучит увлекательно, приходите и присоединяйтесь к нам!