История из внутрикорпоративной технологической жизни.
Как это было
В пятницу 13го мы зарелизили внутренний сервис "Переговорки" версии 1.4 — по сути переписанный на 70% по сравнению с предыдущей версией. Основное изменение — совершенно другой движок.
Раньше "Переговорки" общались с Exchange сразу по двум протоколам: SMTP для бронирования и MAPI для получения новых событий. При такой схеме с отсылкой писем и проверкой их статуса через какое-то время система обладала большими задержками и была менее юзабельна и удобна.
Теперь всё приведено к общему знаменателю, и сервис общается с Exchange через один протокол — SOAP. Благодаря этому бронирование и синхронизация происходят практически мгновенно (в пределах пяти секунд) и сервис стал более отзывчивым и шустрым в интерфейсе для пользователя. Это заметно на глаз.
Ещё одним достижением стала более высокая точность отображения актуальной картины занятости переговорок. Если раньше были случаи пропадания каких-то встреч, встречи-зомби или неправильное отображение времени, то теперь удалось добиться практически 100%-но верного отражения реальной ситуации в Exchange.
Помимо движка и связанных с ним улучшений, "Переговорки" обзавелись ещё приятными фичами. Например, определение текущего офиса пользователя не только по его приписке на Стаффе*, но и по его текущему месту пребывания: сервис умеет определять по IP, в каком офисе находится человек в данный момент.
Теперь немного технических деталей по поводу разработки.
Под капотом
После того, как стало ясно, что требуется переход на SOAP, встал вопрос: как общаться с EWS (Exchange Web Services) из Python. Оказалось (спасибо Саше Покатилову за изначальные исследования), с SOAP-библиотеками не всё так хорошо. Одни слишком запутанные, другие уже не поддерживаются, третьи просто не в состоянии подружиться со строптивым Exchange.
Лучшим претендентом на использование была библиотека Suds. Это довольно молодой SOAP-клиент с динамическим созданием схемы (другие пытаются генерировать статические стабы на базе WSDL) и "питонячим" интерфейсом. Хотя, изучая чуть более глубоко реализацию, у меня родилась фраза — «Java головного мозга». Выводы делайте сами
Пришлось прилично дорабатывать саму библиотеку для того, чтобы она смогла обрабатывать все особенности Exchange. Отсюда родился форк официальной версии. Там я патчил все нужные места, чтобы заставить её работать корректно.
Exchange вообще очень своеобразен. То он умудряется на SOAP-запросы отдать html (скорее даже в этом виноват IIS), то в случае ошибок выдает ответ с кодом 200, то неоднообразно ведет себя в похожих ситуациях: например, удаление события с участниками и без требует разных вызовов. Что из документации на MSDN совсем не очевидно. Сам MSDN — отдельная песня...
Также пришлось на базе Suds сделать интерфейс SOAP-сервера. Сервер нужен для того чтобы Exchange мог пушить (push) оповещения о новых событиях (или об изменении и удалении старых событий). Это упростило процесс синхронизации и сделало его практически мгновенным.
Ещё были лично мои пазлы: и долгое подбирание уникальных ключей для таблиц, и подстава с дефолтным collation для строк в MySQL, и ещё куча глупых программистских промахов
После месяца активной возни мне удалось заставить общаться сервис и Exchange на одном языке.
Новый движок упростил процесс выкладки пакета и лишился очень многих скверных зависимостей от разных маргинальных библиотек (libmapi, samba и т.п.).
Теперь у нас есть знание, опыт и реализация общения с Exchange по SOAP!
***
Отдельное спасибо Сереже Андрюхину за активную помощь, в том числе, и за моральную поддержку в трудные минуты борьбы с продуктами компании Microsoft.
Надеюсь этот релиз поможет Переговоркам отвоевать долю внутреннего рынка у Outlook. Впереди ещё несколько новых фич, которые должны окончательно поставить конкурента на колени
Ни для кого не секрет, что в каждой крупной компании есть свой собственный, внутренний интернет, со своими собственными, внутренними ресурсами. И Яндекс не исключение. Долгое время для планирования встреч мы пользовались Microsoft Exchange, что было удобно, но только пользователям Windows. Остальным же приходилось как-то выкручиваться, пытаясь придумать способ забронировать переговорку или назначить встречу. В какой-то момент стало понятно, что жить так больше нельзя и был разработан внутренний сервис "Переговорки", частично решавший эту проблему. И, как всякий интернет-сервис Яндекса, "Переговорки" тоже развиваются и улучшаются.
Весь этот текст — так называемые release notes, внутреннее сообщение о том, что изменилось в сервисе и как происходила разработка. Мне показалось, что вам будет интересно увидеть, как выглядит Яндекс изнутри.
P.S.
* "Стафф" - корпоративная адресная книга.
Александр Кошелев, борец за удобство переговоров