Hangi en büyük veri tabanı projesini uygulamak veya desteklemek zorunda kaldınız?
Golang
Farklı organizasyonlardaki mülakat sürecinin hangi aşamalarında bu soru sıkça sorulur?
PostgreSQL veritabanına sorgular nasıl gerçekleştirilir?
gRPC'nin çalışma prensibini ve temel özelliklerini açıklayabilir misiniz?
Verilere saniyede kaç yazma isteği geliyordu?
Hizmet kaç adet örnek/kapsayıcı üzerinde çalışıyordu?
Dış hizmetler ve sistemler için müşteriler hangi katmana yerleştirilir?
Çok iş parçacıklı ve paralel hesaplamalar kullanan uygulamaların geliştirilmesinde deneyiminiz nedir?
Have sayacını azaltmak veya artırmak için hangi ilke kullanılır?
Hostlar hakkında bilgi verebilir misin? Kaç host ve kaç konteyner çalışıyor?
Grafana'da veri bağlantısı ve görüntüleme nasıl yapılır?
Bir öğenin Map veri yapısında benzersiz olduğunu görsel veya algoritmik olarak nasıl belirlenir?
Çalıştığınız en uzun süreli proje hangisiydi?
""" Sinema koltukları tek bir sırada dizilmiştir. Yeni gelen bir izleyici, sıradaki diğer izleyicilerden en uzak olacak şekilde bir koltuk seçer. Yani, seçilen koltuktan en yakın izleyiciye olan mesafe maksimum olmalıdır. Her zaman boş koltuklar olduğu ve en az bir izleyicinin oturduğu garanti edilir. Verilen bir koltuk dizisi (sıfırlar ve birler dizisi) verildiğinde, seçilen koltuktan en yakın izleyiciye olan mesafeyi (koltuklar arasındaki boşluk sayısı) döndüren bir fonksiyon yazın. [1, 0, 0, 0, 1] -> 2 [1, 0, 1, 0, 0, 1, 0, 0, 1] -> 2 [1, 0, 1, 0] -> 1 """
İş mantığını gerçekleştiren, dış hizmete (Google) çağrı yapan ve sonucu veritabanına kaydeden bir isteği nasıl mimarize edersiniz? Yukarıdan aşağıya katmanlar halinde açıklayın.
/* Bir kaynaktan bir tüketiciye veri aktarmamız gerekiyor. Kaynak, verileri küçük paketler halinde (~on kayıt) verirken, tüketici daha büyük paketlerle daha verimli çalışır. Gerçek bir örnek, Kafka türü kuyruklardan Clickhouse veritabanına veri aktarımıdır. Kaynak: - Neredeyse sonsuz. - Kaynak, bir Next çağrısında hiçbir zaman MaxItems'ten fazla kayıt döndürmez. - Bir "oturum" (bir Pipe fonksiyon çağrısı) içinde, kaynak her Next çağrısında yeni veriler döndürür. - Ancak, yeniden başlatıldıktan sonra, kaynak önceki "onaylanmış" konumdan, cookie ile belirlenen noktadan başlar. Bu nedenle, Next'in döndürdüğü her cookie değeri, veriler alıcıya kaydedildikten sonra, aynı sırayla Commit çağrısı ile onaylanmalıdır. Alıcı: - Aynı anda MaxItems'ten fazla işleyemez. Temel seviye: Gerekli olan, func Pipe(p Producer, c Consumer) error fonksiyonunu uygulamaktır, bu fonksiyon kaynaktan veri okur, bunları MaxItems boyutunda bir tamponda gruplar ve alıcıya kaydeder, ve ardından kaynaktaki ilerlemeyi onaylar. */ const MaxItems = 9999 type Producer interface { // Next,: // - işlenmek üzere öğe paketleri döner // - işleme tamamlandığında onaylanacak cookie // - hata Next() (items []any, cookie int, err error) // Commit, işlenmiş veri paketini işaretlemek için kullanılır Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { var buf []any var cookies []int for { items, cookie, err := p.Next() if err != nil { return err } buf = append(buf, items...) cookies = append(cookies, cookie) if len(buf) >= MaxItems { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } buf = buf[:0] cookies = nil } } if len(buf) > 0 { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } } return nil }
Son projedeki çalışmanızı değerlendirirken hangi performans göstergelerini kullandınız?
Şu anda çalışıyor musunuz yoksa değil misiniz, ve hangi formatta: ofis, hibrit, uzaktan mı?
func countSubs(s string) int { result := 0 left := 0 hm := make(map[rune]int) n := len(s) for right := 0; right < n; right++ { hm[s[right]]++ for hm[s[right]] > 1 { hm[s[left]]-- if hm[s[left]] == 0 { delete(hm, s[left]) } left++ } result += (right - left + 1) } return result }
/* Bir kaynaktan bir tüketiciye veri aktarmamız gerekiyor. Kaynak, verileri küçük paketler (~on kayıt) halinde sağlar, oysa tüketici büyük paketlerle (~bin kayıt) daha verimli çalışır. Gerçek bir örnek, Kafka türü kuyruklardan alınan verilerin Clickhouse veritabanına aktarılmasıdır. Kaynak: - Neredeyse sonsuz. - Kaynak, bir Next çağrısında hiçbir zaman MaxItems'ten fazla kayıt döndürmez. - Bir "oturum" (bir Pipe fonksiyon çağrısı) içinde, kaynak her Next çağrısında yeni veriler döndürür. - Ancak, yeniden başlatıldıktan sonra, kaynak önceki "onaylanmış" konumdan, cookie ile belirlenen noktadan başlar. Bu nedenle, Next tarafından döndürülen her cookie değeri, veriler alıcıya kaydedildikten sonra, aynı sırayla Commit çağrısı ile onaylanmalıdır. Alıcı: - Aynı anda MaxItems'ten fazla işleyemez. Temel seviye: İşte, p Producer ve c Consumer fonksiyonlarını kullanarak, kaynaktan veri okuyan, bunları MaxItems boyutunu aşmayan bir tamponda toplayan ve alıcıya kaydeden, ve ardından kayıtlardaki ilerlemeyi onaylayan bir fonksiyon uygulaması gerekmektedir. Zorluk: Next, Process ve Commit metodları ağ çağrılarıyla ilgilidir ve oldukça uzun sürebilir. İşlemi hızlandırmak için, okuma, yazma ve ilerleme onay süreçlerini paralelleştirmek gerekir. Böylece, Process veya Commit çağrısı sırasında, kaynak okuma ve yeni tamponun oluşturulması devam eder. */ const MaxItems = 9999 type Producer interface { // Next şu değerleri döner: // - işlenmek üzere bir öğe grubu // - işleme tamamlandığında onaylanacak cookie // - hata Next() (items []any, cookie int, err error) // Commit, işlenmiş veri paketini işaretlemek için kullanılır Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }