Metglobal‘in kalbi Compass projesini baştan yazma serüveni

Faruk Temur
Aug 9, 2017 · 4 min read

Metglobal, turizm sektöründe B2B ve B2C markalarıyla hizmet veren bir teknoloji şirketi. Şirket içerisinde 8 farklı proje ekibi var. Compass’ta bunlardan bir tanesi.

Compass, Metglobal’in direkt kontratlarının yönetildiği, oteller için geliştirilen bir extranet servisidir. SaaS tabanlı bir altyapıya sahiptir. Oteller, envanterlerini yani odalarını ekleme, sezonlara göre müsaitlik & fiyat planlarını yönetebilme, indirimler tanımlayabilme, rezervasyonlarını yönetebilme ve daha bir çok işlemi Compass üzerinden kolayca yönetebiliyorlar.

Bundan tam 2 sene önce, 2015 Temmuz ayında otel envanter yönetim sistemini, mevcut altyapının yetersizliğinden dolayı yeniden yazılması kararı alındı. Sarper Horata ve Seyfi Aslan ile birlikte penceresiz odalara kapanıp analizlere başladık.

Bu odaya girmemiz, proje bitiminde adam başı 10 kilo almamızla sonuçlanacaktı :’(

En çok kullanılan extranet araçlarını inceledik, kontrat ekibimizin ihtiyaçlarını dinledik. İlk etapta süreci hızlı bir şekilde ilerletmek için hazır bir ürün alınmak isteniyordu ve araştırmalara başlandı. Yurt içi ve yurt dışından firmalar ile uzun süren görüşmeler ve demo seansları yapıldı. Fakat gelinen noktada ihtiyaçlarımıza cevap veremedikleri ve hayalimizdeki ürünü ortaya koyamadıkları için bizler 12 Ağustos 2015’te tulumlarımızı giydik ve kolları sıvayıp yazmaya başladık. Takımımızın adı ise Compass olarak belirlenmişti.

Compass’ın ilk kazmasını vururken ben!

Compass takımının bir üyesi olarak size bu süreç içerisinde ve sonrasında yaşadığımız zorlukları ve bu zorlukları nasıl çözdüğümüzü hem yararlanmak isteyenlere yardımcı olması açısından hem de tarihe düşülmüş bir not olması için paylaşmak istiyorum.


Hangi dille yazacağız?

Metglobal’de radikal bir karar alınarak projeler python ile yeniden geliştirilmişti. Önceki platform PHP ile geliştirildiğinden PHP’ye hiç de iyi gözle bakılmıyordu. Biz bu tabuyu yıkma kararı aldık ve PHP dilini kullanarak Symfony2 framework’ü ile API ve Extranet projemizi geliştirmeye başladık.

Hangi Çözümleri Kullandık

Önbelleklemede (cache) tercihimiz REDIS oldu. Bütün verilerimizi ve veritabanı sorgularını REDIS üzerinde tuttuk. Önbelleği (cache) geçersiz kılmak (invalidate) için “Doctrine Event Listener” ları kullandık. Arada bize küçük sürprizler yapsada önbellekleme mekanizmamızdan gayet memnunuz.

Arama Çözümleri

Search&Book Engine geliştirmemiz için öncesinde Elasticsearch kullanmayı planladık. Fakat burada tutacağımız data daha çok sayısal değerler olacağı için burada da REDIS’i tercih ettik. Symfony tarafında da bu kısım bir adaptör olarak çalışıyor. İlerleyen zamanlarda datalar REDIS yerine farklı bir teknoloji üzerinde tutulmak istenirse kolayca değişim sağlanabiliyor.

Kuyruklama Çözümleri

Bir rezervasyon geldiğinde alınan aksiyonlardan bazıları şöyle:

  • Müsaitliklerin güncellenmesi
  • Rezervasyon e-postalarının gönderilmesi
  • Finans işlemleri için sanal kart oluşturulması
  • Otelcinin kullandığı bir kanal yöneticisi (channel manager) varsa rezervasyonun kanal yöneticisine gönderilmesi

Tüm bu aksiyonlarımızda kuyruklama çözümü olarak Google Cloud PUB/SUB kullandık.

Loglama ve Monitöring Çözümleri

Tüm loglarımızı “Graylog” üzerinde tuttuk. Extranet üzerinde göstereceğimiz işlem kayıtlarında DynamoDB’yi kullandık. DynamoDB performans olarak bize çok sıkıntı oluşturdu. Okuma hızında pek bir problem olmadı fakat yazma hızında performanslı olduğu söylenemez. Daha sonra burayı PUB/SUB kullanarak Google Data Store servisine taşıdık.

Versiyonlama ve Yayına Alma Süreçleri

Versiyon kontrol sistemi olarak “git” kullanıyoruz. Metglobal’de Atlassian ürünleri uçtan uca kullanıyoruz. Yayına alma sürecine gelene kadarki süreçlerden de kısaca bahsedeyim.

Git’te “branching model” kullandık. JIRA’da oluşturulan işlere develop branch’inden branch’ler açılarak bu işlerin geliştirmeleri yapılıyor.

Geliştirmesi tamamlanan işlerin “code review” sürecinde en az 2 kişinin review yapmasını ve onay vermesini bekliyoruz. Eğer iş çok kapsamlıysa tüm takımın katıldığı bir session düzenleyip bütün takım review yapıyoruz.

Projeyi test driven olarak geliştirdik. Çok az da olsa testini sonradan yazdığımız yerler de oldu. Review’den geçen iş, test otomasyonuna giriyor burada unit, integration ve functional testlerimiz çalışıyor.

Kod kalitesinden emin olunan iş daha sonra develop branch’ine merge ediliyor ve böylelikle continuous integration tarafını tamamlamış oluyoruz.

Continuous delivery süreçlerine geçtiğimizde de develop branch’inden release branch’i alıyoruz. Release branch’i alır almaz Jenkins üzerinde testler çalışıyor ve staging ortamına sürüm çıkarıyoruz. Burada kullanıcı kabul testleri yapıldıktan sonra production ortamı için release notları yazılıyor ve change management süreçleri başlıyor. Production ortamına çıktıktan sonra da release branch’ini master’a merge ediyoruz ve master’dan tag alıyoruz.

Eski Data’nın Senkronizasyonu

İlk etapta şanslıydık. Eski dataları compass’a aktarmayacaktık. Yeni imzalanan kontratların girişleri compass üzerinden gidecekti. Fakat sonrasında eski sistemin oluşturduğu IT maliyetleri açısından durdurma kararı aldık ve dataları compass’a taşıdık.

Taşıma işlemi için bir arayüz geliştirdik ve burada aktarılmak istenilen dataların seçilmesini sağlayarak compass’a aktarılmasını sağladık. Başarılı bir senkronizasyon süreci geçirdik.

Geçiş Süreci

Eski dataların aktarılması sürecinden dolayı compass’ı bir anda canlıya alamadık. Aktardığımız dataları her ne kadar kontrollü yapmış olsak da öngöremediğimiz sorunlar olabileceğine kanaat getirdik.

Geçişi kademeli olarak yapmaya karar verdik ve pilot olarak seçilen kontratları öncelikle satışa açtık. Kademeli geçiş sürecini iyi planlamamız projede büyük bir sorun yaşamadan, hatalarımızı tespit edip çözüm bulmamızı sağladı.

Ortalama iki ay boyunca her iki sistem business ekibi tarafından kullanıldı ve cross check yapıldıktan sonra eski sistemi tamamen devreden çıkarıp compass’a geçtik.

30 Eylül 2016 ‘da projeyi kullanıma açtık ve rezervasyon almaya başladık.

Projede emeği geçen bütün takım arkadaşlarıma çok teşekkür ediyorum.

İstatistikler

Yayın hayatında 1.yılını dolduran Compass’ta neler olmuş bir göz atalım:

8.000'den fazla otel kontratıyla 40.000'den fazla aktif oda bulunuyor. Otel envanterleri ve rezervasyonlar, entegrasyonu yapılmış 30'dan fazla channel manager’lar ile eş zamanlı olarak güncelleniyor. Channel manager sayıları her gün artmaya devam ediyor.

Günlük ~25M search isteği, ~15M channel manager envanter güncelleme isteği karşılanıyor. Search response time 0.1/0.2 saniye seviyelerinde seyrediyor.

Bugüne kadar 50.000'den fazla rezervasyon yapılmış. Sene sonuna kadar bu rakamın 100.000'in üzerinde olmasını hedefliyoruz.

Sonuç

Yaklaşık bir yıldır kullanılan Compass projesini geliştirme serüvenimizi anlatmaya çalıştım. Değinmeyi unuttuğum, merak ettiğiniz konular varsa yorum bölümünden iletebilirsiniz.

2 yıldır emek vererek geliştirdiğimiz Compass projesini takım arkadaşlarıma emanet ederek, şirketimizin yeni projesini hayata geçirmek için yeni bir yola çıkıyoruz. Projenin adını “Zeppelin” olarak belirledik.

Metglobal’de projeler eğlenceli ve öğretici. Yeni teknolojileri denemekten çekinmiyoruz, öğrenmek için kendimize zaman tanıyabiliyoruz. Zeppelin’e de ilk kazmayı vurduk. Ellerimizi kirleteceğimiz için çok heyecanlıyız.


İletişimde kalalım Linkedin, Twitter, Github

Faruk Temur

Written by

Software Engineer Metglobal. Loves #java #spring #symfony #python