Merhaba Burak, C++ ile geliştirimi olmadı sanırım, ama tasarım olarak rest.li'ye bir bakmanızda fayda var. 100+ mikroservis ve 400M+ kullanıcıya hizmet verilen bir ortamda haberleşen tarafların aynı dilden konuşması için başarıyla kullanılıyor.
https://github.com/linkedin/rest.li Eğer C++ geliştirimi olmadıysa, güzel bir FOSS projesi bile çıkabilir :] Kolay gelsin, --eg -- Erek Göktürk > On Jan 23, 2017, at 10:12, Baskın Burak Şenbaşlar <[email protected]> wrote: > > Merhaba arkadaşlar. > > Bir proje üzerinde çalışıyoruz şu an. Projeyi C++ ile geliştiriyoruz. > > Projede birden fazla server ve birden fazla da client bulunuyor. Clientlar > arası, serverlar arası ve client ile serverlar arası koordinasyon için bir > dolu kontrol mesajının akması gerekiyor. > > Şu anda hızlı ilerleyebilmek amacıyla mesajları JSON ile göndermekte karar > kıldık. Sistemin geri kalanının JSON oluşturma içinde boğulmaması için > layering yapmaya karar verdik. Hem ilerde JSON yerine başka yapılara geçecek > olursak(protobuf xml vs.) var olanı değiştirmemiz daha kolay olacak. > > Şöyle ki, mesajlarımızı temsil eden classlar var. Her mesaj header ve > payloaddan oluşuyor. Her mesaj classı bir header classını extend ediyor. Her > mesaj ya request ya response oluyor. Payloadla ilgili veriyi class'ın private > değişkenlerinde tutuyoruz. Bu class yapısı, mesajların JSON hali ile > uygulamanın geri kalanını birbirinden ayırıyor. Bir mesaj göndermek > istediğimizde classın private variablelarını JSON'a dönüştürüyoruz. Daha > sonra socket seviyesinde implement ettiğimiz başka bir protokol ile karşı > tarafa yolluyoruz bu JSON'ı. > > Sorunumuz JSON'a dönüştürme aşamasında. Bir JSON verisi gönderirken her mesaj > için özel fonksiyon yazmaya başladık başta. 40-50 farklı mesaj tipi olduğu > için yönetilemez bir hal alacağı için başka yollar aramaya koyulduk. Bu gibi > durumlarda kullandığınız yöntemlerle ilgili bilgi verebilir misiniz? > > Şöyle birşey yapmayı düşündük: Değişkenleri private olarak tutmak yerine bir > map'te key-value ikilileri olarak tutabiliriz. Değişkenlerin tiplerini > bilemeyeceğimiz için bu değişkenleri heap'ten alıp void*'a cast edip yanına > tipini string olarak iliştirebiliriz. Mesela "username" diye string bir > değişken olsun değeri de "baskin" olsun. > > std::map<std::string, std::pair<void*, std::string> > variables; > std::string* uname = new std::string("baskin"); > variables[std::string("uname")] = make_pair((void*)uname, > std::string("string")); > > JSON'a çevirirken de bu değerin olduğu yer şu şekilde bir hal alsın dedik: > > { > ... > "uname": { > "type": "string", > "value": "baskin" > } > ... > } > > Böylece receiver değerler ile ne yapması gerektiğini bilecek. (Ne tür > değişkene atması gerektiğini) > > Bu metod sizce efektif bir metod mu? Bize hem JSON'ı gereksiz büyüttüğü hem > de C++ stilinden uzak olduğu için güzel gelmedi. > > Daha güzel dizayn edilmiş bir metod biliyor musunuz acaba? > > Şimdiden teşekkürler, iyi çalışmalar. > > Dipnot: private değişkenlerimizin tipleri int, std::string, double, float, > std::vector<struct X> (struct X yerine bizim tanımladığımız 3 farklı struct > gelebilir) > > -- > Baskın Burak Şenbaşlar > Orta Doğu Teknik Üniversitesi > Bilgisayar Mühendisliği #3 > _______________________________________________ > Linux-programlama mailing list > [email protected] > https://liste.linux.org.tr/mailman/listinfo/linux-programlama > Liste kurallari: http://liste.linux.org.tr/kurallar.php
_______________________________________________ Linux-programlama mailing list [email protected] https://liste.linux.org.tr/mailman/listinfo/linux-programlama Liste kurallari: http://liste.linux.org.tr/kurallar.php
