Şu anda Moskova'da mı yaşıyorsun? Hangi şehri düşünüyorsun? Hibrit çalışma formatını mı düşünüyorsun? Arama aşamasında mısın?
Golang
Başka aktif mülakat süreçleriniz var mı?
Bu metrik verileri Grafana'da nasıl entegre edilir ve görüntülenir?
Ölçeklenebilir bir mesajlaşma uygulaması tasarlayın; 150 milyon kullanıcı, 75 milyon DAU, 225 milyon MAU, 1.2M okuma / 300k yazma QPS, 5 milyon eşzamanlı kullanıcı, yılda 60 PB yeni veri, yıllık %30 büyüme, P99 <200 ms okuma, <300 ms yazma, SLA %99.95. KONTEXT WhatsApp benzeri, mesaj iletimi, kullanıcıların çevrimiçi durumlarının gösterimi ve multimedya dosyalarının (foto, video, ses) iletimi sağlayan dağıtılmış bir mesajlaşma sistemi tasarlamak gerekiyor. Sistem yüksek erişilebilirlik ve düşük gecikme sağlamalı, yüksek paralellik desteklemeli ve küresel ölçekte ölçeklenebilir olmalı. FONKSİYONEL GEREKSİNİMLER - 1:1 ve grup sohbetleri desteği, katılımcı ekleme/çıkarma imkanıyla - Metin mesajları ve multimedya dosyalarının gönderimi ve alınması Fonksiyonel olmayan gereksinimler: - Servisler veya istemciler seviyesinde uçtan uca şifreleme mekanizması açıkça uygulanmamış, genel bir notasyon dışında. - chat_id veya user_id bazında veritabanlarının sharding ve replikasyonunun açıkça tanımlanmamış olması, ölçeklenebilirlik ve arıza toleransı için. - Çevrimdışı mesaj senkronizasyonu ve teslim raporları için açık bir bileşen veya mekanizma bulunmuyor. - Yük dengelemenin veritabanları ve servisler arasında özellikle yoğun zamanlarda nasıl yapıldığı net değil. **Dikkat edilmesi gereken noktalar:** (Diagramda Load Balancer, API Gateway, Message Queue, Service, Cache, Database, Object Storage ve CDN içeren mimari gösterilmektedir.)
Mevcut gelir seviyenizi söyleyebilir misiniz?
Son çalıştığınız ekip nasıl bir kadrodan oluşuyordu?
Veri okuma sırasında saniye başına işlem sayısı göstergesi olarak ne seviyeye ulaştınız veya analiz ettiniz?
Aktif bir GitHub veya LinkedIn'in var mı?
/* 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 }
Önceki iş yerlerinizde ne yaptığınızı ve hangi özellikleri geliştirdiğinizi kısaca anlatın.
Verilen bir karakter dizisi. İçeride, tekrar eden karakterler olmayan i ve j indeks çiftlerinin sayısını bulun. "aba" dizisi için cevap 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") "abcb" dizisi için cevap ?: aba 3 + 2 = 5 abcb 4 (a, b, c, d) + 1 (ab) + 1 (bc) + 1 (cb) + 1 (abc) = 8
/* Mikroservis mimarisiyle bir uygulama var. Bir mikroservis, Backend arayüzü kullanılarak soyutlanabilir. Bir mikroservis örneğine erişmek için, zaten uygulanmış olan BackendImpl türü kullanılabilir. Her mikroservisin birkaç düzine çalışan örneği vardır, her biri kendi adresi addr ile erişilebilir. Ancak, mikroservisin bağımsız örnekleri güvenilir değildir: çökebilir, erişilemez veya aşırı yüklü olabilirler. Bu nedenle, istemci tarafı yük dengelemesi yapan ve her seferinde **en az yüklü** örneği seçen Balancer türünü uygulamanız gerekir. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr, belirli bir örneğin ip:port adresini içerir func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs, yük dengeleme yapılan tüm örneklerin adreslerini içerir func NewBalancer(addrs []string) *Balancer { // TODO }
Mimariyette WebSocket bağlantısı nasıl çalışır — ne zaman kurulur ve kim kiminle iletişim kurar?
/* Bir karakter dizisi verilir. İçinde tekrar eden karakter olmayan i ve j indeks çiftlerinin sayısını bulun. "aba" dizisi için cevap 5: sadece ASCII olmayabilir [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
Bir ekip yönetimi deneyiminiz oldu mu?
150 milyon kullanıcı, 75 milyon DAU, 225 milyon MAU, 1.2M okuma / 300k yazma zirvesi QPS, 5 milyon eşzamanlı kullanıcı, yılda 60 PB yeni veri, yıllık %30 büyüme, %99.95 SLA, p99 <200 ms okuma için, <300 ms yazma için destekleyen ölçeklenebilir bir mesajlaşma sistemi tasarımı. KONTEXT WhatsApp benzeri, 1:1 ve grup sohbetleri destekleyen, mesaj teslimini sağlayan, kullanıcıların çevrimiçi durumlarını gösteren ve multimedya dosyalarının (fotoğraf, video, ses) iletimini sağlayan dağıtık bir mesajlaşma sistemi tasarlamak gerekiyor. Sistem yüksek kullanılabilirlik ve düşük gecikme sağlamalı, yüksek paralellik desteklemeli ve küresel ölçekte ölçeklenebilir olmalı. FONKSİYONEL GEREKSİNİMLER - Kişisel (1:1) ve grup sohbetleri desteği, katılımcı ekleme/çıkarma imkanı - Metin mesajları ve multimedya dosyalarının gönderimi ve alınması Servisler veya istemciler seviyesinde end-to-end şifreleme mekanizmasının açık bir uygulaması görünmüyor, genel bir not dışında. - chat_id veya user_id'ye göre veritabanlarının sharding ve replikasyonunun açık bir tanımı yok, ölçeklenebilirlik ve arıza toleransı için. - Çevrimdışı mesaj senkronizasyonu ve teslim raporlarını işlemek için açık bir bileşen veya mekanizma yok. - Özellikle zirve yüklerde, veritabanları ve servisler arasında yük dengelemenin nasıl yapıldığı net değil. **Dikkate alınması gereken kritik noktalar:**
Takımda testler nasıl düzenlenmiş — kim ne yazıyor, hangi kapsamda, E2E var mı?
/* İki PostgreSQL sunucusu var: * PROD - OLTP sunucu, * STATS - uzun analitik sorgular için sunucu. Mevcut sunucudaki prod veritabanında büyük (10Tb) bir tablo var: CREATE TABLE profiles( id SERIAL, data JSONB ) Tabloda "delikler" olabilir, yani bazı `id`'ler atlanmış olabilir. PROD'den STATS'e profiles tablosunu kopyalamak için bir program yazmak gerekiyor. Veritabanlarıyla çalışmak için aşağıdaki arayüzlerin kullanılacağını varsayıyoruz: type Row []interface{} type Database interface { // Database arayüzünün uygulaması bağlantıları yeniden kurabilir // SaveRows çağrısı idempotenttir io.Closer GetMaxID(ctx context.Context) (uint64, error) LoadRows(ctx context.Context, minID, maxID uint64) ([]Row, error) // [minID, maxID] SaveRows(ctx context.Context, rows []Row) error } func Connect(ctx context.Context, dbname string) (Database, error) // CopyTable // Eğer full=false ise, önceki hatadan kalan yerden veri aktarımına devam et // Eğer full=true ise, tüm veriyi aktar func CopyTable(fromName string, toName string, full bool) error { // ... kodunuz } Eğer `full=false` seçeneği verilmişse, program önceki hatadan kalan yerden veri aktarımına devam etmelidir. Eğer `full=true` ise, tüm veriyi aktarmalıdır. **Temel seviye**: - verilerin tek bir akışta sıralı aktarımı - hatadan sonra kurtarma (seçenek `full=false`) Ek bilgiler: - gerekirse, arayüzü kendi metodlarınızı ekleyerek genişletebilirsiniz - gerekirse, doğrudan **database/sql** paketini kullanabilirsiniz
Map veri yapısında öğe arama verimliliği nasıl artırılabilir?
Son projen hakkında bana anlat — ne hakkında ve tam olarak ne yapıyorsun?