Примечание редактора: Элита стажировалась в Goibibo несколько месяцев назад. Недавно она рассказала о своих переживаниях в своем блоге. Мы воспроизводим его здесь как есть. Некоторые из ее работ являются частью более крупного цикла релизов и недоступны на Goibibo на момент публикации.

Всем привет! Прошло почти 3 недели с тех пор, как закончилась моя стажировка в GoIbibo, и я подумал, что может быть лучше, чем вести блог, чтобы сохранить хорошие воспоминания?

Итак, вот оно, полное описание того, как я провел лето, взламывая несколько крутых проектов на GoIbibo!

День 1:

Я был рад работать в компании, которая быстро развивалась за несколько лет! Это была моя первая стажировка в хорошо зарекомендовавшей себя стартапе, и я надеялся, что смогу извлечь из нее максимум пользы. HR познакомил меня с моим наставником Бала Фани Чанд (главный инженер-программист в GoIbibo). Фани сказал мне, что я буду частью команды управления, которая отвечает за разработку бэкенда и состоит из некоторых блестящих умов GoIbibo! Я не мог дождаться, чтобы начать свой проект! :D

Мой первый проект:

Прежде чем углубиться в технические детали моего проекта, позвольте спросить вас, сколько раз вы были разочарованы внезапным изменением цен на авиабилеты при переходе со страницы результатов поиска на страницу бронирования авиабилетов? Бьюсь об заклад, вы, должно быть, думали, что это метод привлечения клиентов, но это не так! GoIbibo кэшировал результаты в течение фиксированного короткого промежутка времени, чтобы избежать ненужных обращений к API. Поэтому GoIbibo решил, что пора решить эту проблему так, чтобы Клиенты были довольны, и они тоже были счастливы! :) Моя работа заключалась в том, чтобы разработать интеллектуальный алгоритм, который уменьшит количество таких случаев недействительности, особенно во время распродаж и в некоторых особых случаях, когда спрос высок. Звучит интересно, не так ли?

Рождение CacheBot:

Я начал исследовать различные факторы, которые приводят к увеличению числа инвалидаций и отношения между этими факторами. Я изучил алгоритмы машинного обучения, а также применил их для прогнозирования времени, в течение которого данные должны кэшироваться. Полученная точность составила около 80%, что было не совсем удовлетворительным. Затем я реализовал многослойные нейронные сети, которые не смогли повысить точность и также обработать случаи, когда есть какие-либо продажи. Раньше я постоянно обсуждал результаты своего исследования с Фани и г-ном Нираджем Коулом (директором GoIbibo), и они всегда помогали мне найти лучший подход к решению проблемы. После целого месяца исследований с различными алгоритмами мне удалось разработать Cachebot, который определяет время, в течение которого новые данные должны кэшироваться, на основе прошлых результатов данных (полученных с помощью алгоритмов машинного обучения) и текущего анализа сценариев. Полученная точность составила около 95%, и самое приятное то, что он мог справиться с продажами, а также с любым внезапным изменением спроса! :D

24-часовой хакатон GoIbibo:

GoIbibo провела крутой хакатон, в котором могли участвовать только ее сотрудники и стажеры! У нас был доступ к неограниченному количеству еды и напитков! :D Все команды кодировали всю ночь и пытались конкурировать с другими командами. Я был поражен потрясающими продуктами, разработанными каждой командой за одну ночь! Кстати, в мою команду входили Неха Джагадиш, Паван Шарма (два лучших бэкенд-разработчика из команды Flights) и Рупеш Сингх (талантливый JS-разработчик). Мы разработали прайс-трекер, который моментально уведомляет Клиента об изменении цен на отслеживаемый им рейс! Нам удалось найти решение с постоянным временем для того же самого, используя несколько простых хаков с сигналами базы данных! :)

Вот групповое фото всех разработчиков GoIbibo, принявших участие в хакатоне! :) Эти ребята все еще были полны энтузиазма, даже проведя всю ночь за кодированием! :D Престижность потрясающим разработчикам GoIbibo! (Я)

Проект 2:

Мой второй проект был еще одной интересной и сложной задачей! :) Цель этого проекта состояла в том, чтобы написать распределенную библиотеку кеша на Go, которая хранила бы данные в виде пары ключ-значение в памяти каждого узла и тем самым уменьшала задержку, которая обычно встречается в Memcached или Redis. Но вам должно быть интересно, зачем писать это на Go, а не на Python? Основная причина, по которой мы использовали Go, заключается в его потрясающей функции параллелизма и его каналах, которые очень полезны для уменьшения задержки в сетях. Меня наставляли одни из самых умных умов GoIbibo — г-н Джотисваруп Райтуркар, главный архитектор GoIbibo, Нирадж Коул и Харшад Патил (старший инженер-программист).

GoCache:

Этот проект потребовал нескольких обсуждений дизайна и постоянной доработки дизайна! При реализации этой библиотеки я столкнулся со многими сложными проблемами, которые я обсуждал с г-ном Джотисварупом, г-ном Нираджем и Харшадом, и они помогли мне найти эффективные решения этих проблем. Хотя я был стажером, я мог свободно выдвигать свои идеи или оспаривать их идеи, не задумываясь дважды! :)

К концу стажировки я, наконец, реализовал распределенную одноранговую сеть, в которой каждый узел имеет свой собственный BusSocket, который может прослушивать одноранговые узлы, дозваниваться до одноранговых узлов, получать сообщения от одноранговых узлов и оценивать их по одному, а также отправлять сообщения одноранговым узлам одновременно. Аканша Гупта написал API для кеша Ledisdb-Goleveldb, который я использовал для обслуживания хранилища для каждого узла. GoLeveldb очень быстр, имеет функцию истечения срока действия и позволяет одновременное чтение и запись в одном процессе, и именно поэтому мы выбрали его для нашей библиотеки. Я также реализовал автоматический повторный набор до тех пор, пока соединение не будет установлено, когда соединение потеряно и при соединении получен EOF. Каждый узел может отправить подтверждение своим партнерам после оценки полученного сообщения. Если узлу не удается получить подтверждение отправленного им сообщения в течение периода ожидания, он разорвет соединение и повторно наберет одноранговый узел. Harshad реализовал подтверждение ошибки устаревших данных, которое уведомляет узел-отправитель о том, что отправленные им данные устарели, и обновляет базу данных узла-отправителя самыми последними данными. Мы также реализовали оптимальное решение для обработки случаев, когда одноранговый узел на какое-то время отключается, а к моменту его появления его база данных устаревает.

При тестировании кода мы обнаружили, что сеть может отправлять и одновременно получать 1 миллион сообщений к своим одноранговым узлам и от них за 3–4 минуты. Ура! :)

Мой наставник Харшад отлично поработал, перерисовав код, оптимизировав его и инкапсулировав. Код теперь стал открытым исходным кодом и размещен на github GoIbibo. Любой и каждый может внести свой вклад в это. :)

Ссылка на библиотеку Harshad GoCache: https://github.com/goibibo/stash

Ссылка на мою библиотеку, которая все еще находится в разработке: https://github.com/elitalobo/DistributedCache

Обзор моего опыта стажировки:

Я наслаждался каждой частичкой этого, так сильно, что хотел бы, чтобы мне никогда не пришлось возвращаться в колледж! :D У меня появились отличные друзья, и мы отлично повеселились вместе! :) Сроки были гибкими. У меня была полная свобода высказывать свои идеи, и они всегда учитывались! И лучшая часть стажировки в том, что я многому научился благодаря своим проектам и своим замечательным наставникам, чему я сомневаюсь, что мог бы научиться где-то еще! :) Лето было хорошо проведено! :)

Первоначально опубликовано на goibibo.github.io 14 августа 2015 г.