WhatsApp Rabbitmq kullanıyor mu
WhatsApp Rabbitmq kullanıyor mu
Rabbitmq üzerine inşa edildi Erlang Genel amaçlı programlama dili ve WhatsApp tarafından mesajlaşma için de kullanılır.
Özet
WhatsApp, mesaj teslimatı için mesajlaşma kuyruğu olarak Erlang üzerine inşa edilen Rabbitmq’i kullanıyor.
Gerçek zamanlı bir sohbet sistemi tasarlarken, WhatsApp ve Facebook Messenger gibi popüler mesajlaşma platformları tarafından kullanılan kuyruğu dikkate almak önemlidir. Bu platformlardaki milyarlarca kullanıcı göz önüne alındığında, her bir kullanıcı için kişi başına bir kuyruk veya Kafka-Topic’e sahip olmak mantıklı görünse de, bu yaklaşım pratik olmayan sayıda kuyruk veya konu gerektirecektir. Bununla birlikte, WhatsApp ve Facebook Messenger’ın mesaj teslimatı için “iris” (Kafka’ya benzer) adlı bir kuyruk kullandığı gözlenmiştir.
Mesaj kuyruğundan veritabanlarını (HBase ve Myrocks gibi) dolduran dahili sistemler vardır, ancak bu veritabanları birincil dağıtım sistemi değildir.
Sorular ve cevaplar
1. Rabbitmq ne inşa ediliyor?
Rabbitmq, Erlang genel amaçlı programlama dili üzerine inşa edilmiştir.
2. WhatsApp Rabbitmq’yi nasıl kullanıyor?
Whatsapp, mesaj teslimatı için mesajlaşma kuyruğu olarak Rabbitmq’i kullanır.
3. Bir mesajlaşma kuyruğunun amacı nedir?
Bir sistemin bileşenlerini ayırmak için bir mesajlaşma kuyruğu kullanılır ve aralarında eşzamansız olarak mesajların gönderilmesine izin verir.
4. WhatsApp veya Facebook Messenger’da Mesaj Teslimi için Kişilik başına kuyruk kullanılabilir mi??
Bir kişi başına kuyruk mantıklı görünse de, bu platformlardaki milyarlarca kullanıcı göz önüne alındığında, pratik olmayan sayıda kuyruk gerektirecektir.
5. Mesaj Teslimi için Whatsapp ve Facebook Messenger tarafından hangi kuyruk kullanılır??
WhatsApp ve Facebook Messenger Mesaj Teslimi için “Iris” adlı bir kuyruk kullanın. “Iris” Kafka’ya benzer.
6. WhatsApp tarafından mesajları depolamak için kullanılan bazı veritabanlarından bazıları nelerdir??
WhatsApp, mesajları saklamak için HBase ve Myrocks gibi veritabanlarını kullanır. Bu veritabanları mesaj kuyruğundan doldurulmuştur.
7. Rabbitmq whatsapp için birincil dağıtım sistemi mi?
Hayır, Rabbitmq whatsapp için birincil dağıtım sistemi değil. Mesaj teslimi için mesajlaşma kuyruğu olarak kullanılır.
8. WhatsApp ve Facebook Messenger’da Mesaj Teslimi Senkron mi yoksa Asenkron?
Whatsapp ve Facebook Messenger’da mesaj teslimatı eşzamansızdır, yani mesajlar birbirinden bağımsız olarak gönderilir ve alınır.
9. Rabbitmq gibi bir mesajlaşma kuyruğu kullanmanın faydaları nelerdir??
Rabbitmq gibi bir mesajlaşma kuyruğu kullanmak, bileşenlerin ayrıştırılmasına, gelişmiş ölçeklenebilirlik ve sistem öğeleri arasındaki eşzamansız iletişimin.
10. Rabbitmq yüksek miktarda mesajla başa çıkabilir mi?
Evet, Rabbitmq yüksek miktarda mesajı ele almak için tasarlanmıştır ve bunları verimli ve güvenilir bir şekilde sunabilir.
11. Bir mesajlaşma kuyruğunu uygulamak için Rabbitmq’e alternatifler nelerdir??
Rabbitmq’e bazı alternatifler arasında Apache Kafka, Activemq ve Redis Streams.
12. Rabbitmq gibi bir mesajlaşma kuyruğu kullanmanın herhangi bir sınırlaması var mı??
Rabbitmq gibi bir mesajlaşma kuyruğunun kullanılmasının bazı sınırlamaları, optimal performans için düzgün bir şekilde yapılandırma ve ayarlama ihtiyacını, uygun şekilde yapılandırılmadığı takdirde potansiyel mesaj kaybını ve mesajlaşma kuyruğunu desteklemek için ek altyapı ihtiyacı içerir.
13. Rabbitmq mesajlaşma dışında başka amaçlar için kullanılabilir mi??
Evet, Rabbitmq, görev planlaması, olay odaklı mimariler ve veri akışı gibi mesajlaşma dışında başka amaçlar için kullanılabilir.
14. Rabbitmq mesajı kalıcılığını destekliyor mu?
Evet, Rabbitmq mesaj kalıcılığını destekler ve sistem arızaları durumunda bile mesajların depolanmasına ve alınmasına izin verir.
15. Rabbitmq mesaj teslimat güvenilirliğini nasıl sağlar?
Rabbitmq, mesaj onaylaması, yayıncı onayları ve kuyruk dayanıklılığı gibi özellikler aracılığıyla mesaj teslimat güvenilirliğini sağlar.
WhatsApp Rabbitmq kullanıyor mu
Rabbitmq üzerine inşa edildi Erlang Genel amaçlı programlama dili ve WhatsApp tarafından mesajlaşma için de kullanılır.
WhatsApp veya FB Messenger’da kullanılan kuyruk
Gerçek zamanlı sohbet için bir sistem tasarımını düşünürken, mesajı alıcıya teslim etmek için Whatsapp veya FB Messenger’ın sunucu tarafında ne tür bir kuyruk kullandığını merak ediyorum. Düşündüğüm şey, kişi başına bir kuyruk/Kafka-konu vardı, bu yüzden A kullanıcısına yeni bir mesajın teslim edilmesi gerektiğinde, mesaj A’nın kuyruğuna katılıyor. Ancak, milyarlarca kullanıcı olabilir (FB 2 milyar kullanıcısı var), bu 2 milyar kuyruğa/konuya ihtiyacımız olduğu anlamına mı geliyor (Kafka teriminde)? Eğer öyleyse, hangi kuyruk bunu gerçekleştirebilir. Herhangi bir yorum hoş geldiniz! Teşekkür ederim!
25 Haziran 2019’da 16:44
1.669 8 8 Altın Rozet 23 23 Gümüş Rozetler 37 37 Bronz Rozetler
Mesajın HBase ve şimdi Myrocks üzerine inşa edildiğine dair belgeleri bulabilirsiniz. Bu veritabanlarını bir kuyruktan dolduracak dahili sistemler var, evet, ancak bu birincil dağıtım sistemi değil. kodlamak.FB.com/çekirdek veri/…
26 Haz 2019, 3:08
@cricket_007 Yorumlar için teşekkürler. Yeap, FB teslimat için kuyruk olarak iris (Kafka benzeri) kullanıyor gibi görünüyor.
alifzl/yomkippur
Bu taahhüt, bu depodaki herhangi bir şubeye ait değildir ve deponun dışındaki bir çatala ait olabilir.
Şubeleri/etiketleri değiştirin
Şubeler Etiketleri
Şubeleri yükleyemedi
Gösterilecek bir şey yok
Etiketleri yükleyemedi
Gösterilecek bir şey yok
Zaten kullanımda olan isim
Sağlanan dal adı ile zaten bir etiket var. Birçok git komutu hem etiket hem de şube adlarını kabul eder, bu nedenle bu dalın oluşturulması beklenmedik davranışlara neden olabilir. Bu şubeyi oluşturmak istediğinden emin misin?
Create’i iptal et
- Yerel
- Kodlama
Https github cli
Web URL’sini kullanarak GIT veya SVN ile ödeme kullanın.
Resmi CLI’mizle hızlı çalışın. CLI hakkında daha fazla bilgi edinin.
Gereksiz giriş
Kod bölgelerini kullanmak için lütfen oturum açın.
Github masaüstünü başlatma
Hiçbir şey olmazsa, Github masaüstünü indirin ve tekrar deneyin.
Github masaüstünü başlatma
Hiçbir şey olmazsa, Github masaüstünü indirin ve tekrar deneyin.
Xcode’u başlatma
Hiçbir şey olmazsa, xcode’u indirin ve tekrar deneyin.
Visual Studio Kodunu Başlatma
Kod alanınız hazır bir kez açılacak.
Kod alanınızı hazırlarken bir sorun vardı, lütfen tekrar deneyin.
Son taahhüt
Git İstatistikleri
Dosyalar
En son taahhüt bilgilerini yükleyemedi.
En son taahhüt mesajı
Zaman
Okuma.MD
Yom Kippur, WhatsApp’ın otomatik bir bot olarak ticari olmayan kullanımı için tutarlı ve kalıcı bir çözüm olmayı amaçlayan bir WhatsApp otomasyon aracıdır.
Bu ne işe yarıyor?
- AVD’de önceden yapılandırılmış bir WhatsApp uygulamasına tek mesaj gönderin/alın (Android sanal cihaz)
- AVD’de iletişim listesi oluşturun ve gönderme/alma için kullanın
- Kelimenin tam anlamıyla AVD ile her şeyi yapabilir (ikna etmek için çok sayıda olasılık yaratır)
İlk olarak, tek seçeneğimi yowsup gördüm, ancak aşağıda listelenen sorunlar nedeniyle fikrimi başka bir şekilde uygulamak için değiştirdim:
- Topluluk sorunlarının çeşitliliği (burada bağlantılı)
- Yosup, WhatsApp Retapapi ile etkileşime giren eşzamansız bir API türüdür, WhatsApp’ın yüksek güvenlikli düşünceleri ile ilgili olarak, her kullanıcının mevcut aktif oturumları hakkında çok hassas geldi ve senkron çözümlerle çok dostu olmayacak. (Muhtemelen bildiğiniz gibi WhatsApp’ın web görüntüsünü kullanmanın kısıtlamalarını, aynı anda telefonda tutarlı bir aktif internet bağlantısına sahip olmamız gerektiğini söyleyen)
- tembelliğim ve aynı zamanda kendimi zor bir şekilde yapmam için meydan okuyor
Peki, bu projedeki bağımlılıklar, çok fazla! Birinciniz bu zorunluluğun tatmin olmasını sağlamalısınız:
Windows yükleyicileri yenilir, ancak Linux veya MacOS makinesine uygulanabilir (her ikisi de test edilmemiş)
Bağımlılık | Açıklama / İndir bağlantılar |
---|---|
Android Studio | Android API 28 ile Android Studio |
Java | Java JDK 11 |
MySQL | MySQL Yükleyici Topluluğu 8.X veya üstü |
Python 2.7 | Python 2.7 |
Appium | V1.10 veya üstü |
Rabbitmq | Rabbitmq’in son sürümü |
Postacı | Postman’ın son sürümü |
Hususlar: Python 2 için Conda Virenv’i kullanabilirsiniz.7, ama bana ciddi bir baş ağrısı kurdu (önerilmiyor)
Bu proje için Python 2’yi kullandığım ana neden, Appium, MySQL Connector Client ve Rabbitmq’in sürüm 3’te birlikte uyumsuz olmasıdır.
Her şeyden önce, bu bölümde sabırlı olun. Bu kadar basit bir görev yapmak için bağımlılık boklarını silmek kan ve gözyaşları aldı.
1.Android sanal cihaz
Android Studio’nun Luanch AVD yöneticisi, Android 9 ile bir cihaz kurun.0 API 28 ile (AVD için seçim ve uygun ad, çünkü daha ileri adımlarda ihtiyacımız var).
WhatsApp’ı AVD’nin kendisine yüklemeniz gerektiğine dikkat edin, bu nedenle PlayStore destekli sürümü seçin.
Hesabınızdaki bu ortam değişkenlerine sahip olduğunuzu kontrol edin:
Değişken ismi | Değişken Değer |
---|---|
Android_home | C: \ users \ fzl \ appdata \ local \ android \ sdk |
Java_home | C: \ Program Dosyaları \ Java \ JDK-11.0.2 |
Pythonpath | C: \ python27; c: \ python27 \ lib \ site paketleri; c: \ python27 \ lib; c: \ python27 \ dlls; c: \ python27 \ senaryolar |
Yama | C: \ python27; c: \ python27 \ scripts; c: \ python27 \ lib \ site-packages; c: \ program dosyaları \ java \ jdk-11.0.2; C: \ Program Dosyaları \ Java \ JDK-11.0.2 \ bin; |
O zaman AVD’nizi başlatmalı, WhatsApp’ı kurmalı ve ADB’ye cihazınızla yetkilendirmelisiniz (zorunlu)
Bunu yapmak için AVD’nin otomatikleştirilmesini kontrol etmek için ADB cihazlarını veya ADB USB’yi yürütmelisiniz.
C:\ Users\FZl\Appdata\ Local\ANdroid\Sdk\PLatform Tools: ADB Cihazları Ekli Emulator-5554 Cihaz Cihazlarının Listesi
Yetkisiz sonucu görüyorsanız, bu bağlantıyı takip etmelisiniz.
2.Rabbitmq yapılandırması
RaabitMQ’nun kurulumundan sonra, Rabbitmq SBIN dizininde Rabbitmq-Plugins’i RabbitMQ SBIN dizinini etkinleştirmelisiniz. Rabbitmq hizmetinin kısıtlanması gerekebilir.
Bundan sonra Rabbitmq web-gui’ye http: // localhost: 15672/#/adresi ile yerel makinenizde erişebilmelisiniz. Evet ise, aşağıdaki komutlar tarafından yeni bir kullanıcı oluşturun ve yönetici yapıcı yapın:
Rabbitmqctl add_user kullanıcı adı şifresi # Bu kullanıcıyı yönetici yapar Rabbitmqctl set_user_tags kullanıcı adı yöneticisi # Bu, kullanıcı için izinler ayarlar Rabbitmqctl set_permissions -p / kullanıcı adı ".*" ".*" ".*"
Yeni oluşturulan kimlik bilgileriyle giriş yapın ve Rabbitmq_Conf adlı bu repoya zaten eklenmiş olan kuyruk özelliklerini içe aktarın.Genel Bakış Menue Altında İçe Aktarma Tanımları Bölümlerinde JSON.
Rabbitmq için gerekli yapılandırmaları oluşturur ve gerekli ayrıcalıkları sağlar.
3.Appium
Appium sunucusunu varsayılan ayarlarla çalıştırın. Appium-Default-Capablees ” zaten koda yerleştirilmiştir. TL; DR: Bu adımda yapılacak bir şey yok.
4.MySQL
MySQL’in Topluluk Sürümü’nü yükleyin, uygun bir DB hesabı oluşturun ve işletim sistemi başladığında hizmeti otomatik olarak ayarlayın.
5.Python bağımlılıklarını yükleyin
PIP yüklemesini çalıştırın –r bağımlılıkları.Kullanılmış kütüphanelerin bağımlılığını çözmek için txt.
MySQLDB Kütüphanesi’nin bunu yükleyerek çözülebilen kullanımdan kaldırılmış sürümüyle karşılaşabilirsiniz. Python 2’yi kurmaya dikkat edin.Bahsedilen kütüphanelerin x sürümü.
6.Günlük dosyaları için dizinler oluşturun
Dizinleri ve dosyaları olduğu gibi oluşturun’Aşağıda belirtildi:
# dizinler C:\ VAR\ lOG [dizin] C:\ VAR\ log\ wHatsapp_api [dizin] # log dosyaları C:\ VAR\ log\Api.Log C:\ VAR\ log\ wHatsapp_single_consumer.Log C:\ VAR\ log\ wHatsapp_single_worker.Log C:\ VAR\ log \
7.Yom Kippur’u ayarla’S yapılandırma dosyası
Yomkippur-Master \ configs \ config’e gidin.CFG ve aşağıdakileri girin.
(Ne yaptığını bilmiyorsan esle’yi değiştirmeyin)
[MySQL] ana bilgisayar = 127.0.0.1 kullanıcı adı ='MySQL kullanıcı adınız' şifre ='MySQL şifreniz' veritabanı = whatsapp [rabbitmq] ip = 127.0.0.1 ipqueuename = iPaddr.Kuyruk kullanıcı adı ='Rabbitmq kullanıcı adınız' şifre ='Rabbitmq şifreniz' [queue_name] single_message = whatsapp_singlemessage_queue broadcast_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue dinle_message = whatsapp_messagelististener_queue
Ana’yı çalıştırın.py ve add_new_contact_producer.İki ayrı terminal/cmd ortamında PY.
Herhangi bir hata görmediyseniz, gitmekte fayda var.
- MySQL Server’ın çalıştığından emin olun
- Rabbitmq Sever’in Runnig olduğundan emin olun
- Defualt ayarlarıyla appium’u çalıştırın
- Bu senaryoları çalıştırın
Python Main.py python add_new_contact_producer.py python single_message_producer.py
- Postacı çalıştırın ve aşağıdaki listeden istenen yazı komutları oluşturun:
Google Kişiler Uygulamasına İletişim Ekleme
WhatsApp üzerinden tek mesaj gönderme
Geliştirme ve katkı?
Katkıda bulunmak istiyorum? Harika! Beni bir araya getirmekten çekinmeyin.fazeli95 [at] gmail [dot] com veya sadece bir çekme isteği oluşturun.
Bu projede kullanılan tüm bileşenler açık kaynaklıdır ve MIT lisansına sahiptir ve herhangi bir iletişim dışı üründe kullanılabilir
Hakkında
Rabbitmq, AVD ve Appium ile WhatsApp Mesaj Aracısı
Rabbitmq’e Giriş
Burada Rabbitmq, Rabbitmq kullanımları ve neden Rabbitmq uygulamalarımızda örneklerle kullanmamız gerektiğini öğreneceğiz.
Rabbitmq nedir?
Rabbitmq bir AMQP Mesajlaşma komisyoncusu ve en popüler açık kaynak ve platformlar arası mesaj komisyoncusu.
Rabbitmq aynı zamanda verileri, gönderilen bir mesaj gibi farklı platform uygulamaları arasında değiştirmenin bir yoludur .Açık Uygulama bir Düğüm.JS uygulama veya Java başvuru.
Rabbitmq üzerine inşa edildi Erlang Genel amaçlı programlama dili ve WhatsApp tarafından mesajlaşma için de kullanılır.
AMQP nedir?
Gelişmiş mesaj kuyruğu protokolü (AMQP) mesaj odaklı bir açık standart uygulama katmanı protokolüdür ve AMQP’nin özellikleri mesaj yönelimi, kuyruk, yönlendirme (noktadan noktadan noktaya ve yayın ve abone dahil), güvenilirlik ve güvenliktir,.
JPMorgan ve Imatix Corporation tarafından geliştirildi. AMQP, hedef olarak aşağıdaki ana özelliklerle tasarlanmıştır:
- Güvenlik
- Güvenilirlik
- Birlikte çalışabilirlik
- Standart
- Açık
Rabbitmq hafiftir ve kullanılabilir tesislerde konuşlandırılması kolaydır ve birden fazla mesajlaşma protokolünü destekler. Rabbitmq, yüksek ölçekli, yüksek kullanılabilirlik gereksinimlerini karşılamak için dağıtılmış ve federasyonlu yapılandırmalarda dağıtılabilir.
Aşağıda, RabbitMQ’nun uygulamalarımızda gönderen ve tüketici arasında bir arabulucu olarak nasıl davranacağının resimli temsili.
Rabbitmq neden ve ne zaman kullanılır?
Şimdi bir gün, çoğu insan tek uygulamada e -posta veya SMS göndermek gibi birden fazla görev gerçekleştirecek, raporlar ve uygulamada ağır bir yük oluşturacaktır, bu nedenle bu görevleri ayırırsanız, daha fazla istek sunmak için daha fazla alan (bellek) alacağız.
Rabbitmq kullanarak, Excel veya PDF formatında rapor göndermek gibi web uygulamalarımızdan bazı ağır işleri kaldırabiliriz’S veya bir e -posta, SMS veya işlemeye başlamak için diğer bazı uygulamaları tetiklemek gibi başka bir görev göndermek.
Rabbitmq açık kaynak ve platformlar arası bir mesaj broker’gibi birçok dilde kullanımı kolay .Net, java, python, yakut, düğüm.JS.
Rabbitmq destekli müşteri kütüphaneleri
Rabbitmq birden fazla işletim sistemini ve programlama dilini destekleyecek. Rabbitmq, programlama dillerini takip etmek için çeşitli müşteri kütüphaneleri sağlamıştır.
- .Açık
- Java
- Bahar Çerçevesi
- Yakut
- Python
- PHP
- Objektif-C ve Swift
- Javascript
- GİTMEK
- Palavra
Sistem tasarımı: whatsapp
WhatsApp, Facebook Messenger ve WeChat gibi hizmetlere benzer şekilde anında mesajlaşma hizmeti gibi bir whatsapp tasarlayalım.
Whatsapp nedir?
WhatsApp, kullanıcılarına anlık mesajlaşma hizmetleri sunan bir sohbet uygulamasıdır. 180’den fazla ülkede 2 milyardan fazla kullanıcıyı birbirine bağlayan gezegende en çok kullanılan mobil uygulamalardan biridir. WhatsApp web’de de mevcuttur.
Gereksinimler
Sistemimiz aşağıdaki gereksinimleri karşılamalıdır:
İşlevsel gereksinimler
- Bire bir sohbeti desteklemeli.
- Grup sohbetleri (maksimum 100 kişi).
- Dosya paylaşımını (resim, video vb. Desteklemelidir.).
İşlevsel olmayan gereksinimler
- Minimal gecikme ile yüksek kullanılabilirlik.
- Sistem ölçeklenebilir ve verimli olmalıdır.
Genişletilmiş Gereksinimler
- Mesajların gönderildiği, teslim edilmesi ve okunması.
- Kullanıcıların son görülen zamanını göster.
- Push bildirimleri.
Tahmin ve kısıtlamalar
Tahmin ve kısıtlamalarla başlayalım.
Not: Görüşmecinizle birlikte ölçek veya trafikle ilgili varsayımları kontrol ettiğinizden emin olun.
Trafik
Diyelim ki günlük 50 milyon aktif kullanıcımız (DAU) ve ortalama olarak her kullanıcı her gün 4 farklı kişiye en az 10 mesaj gönderiyor. Bu bize günde 2 milyar mesaj veriyor.
50 m i l l i o n × 20 m e s a g e s = 2 b i l l i o n / d a y 50 \ uzay milyon \ time 20 \ uzay mesajları = 2 \ uzay milyar / gün 50 mi ll i o n × 20 m ess a g es = 2 bi ll i n / d a y a y
Mesajlar ayrıca resimler, videolar veya diğer dosyalar gibi medya içerebilir. Mesajların yüzde 5’inin kullanıcılar tarafından paylaşılan medya dosyaları olduğunu varsayabiliriz, bu da bize ek 200 milyon dosya sunmak için saklamamız gerekecek.
5 p e r c e n t × 2 b i l l i o n = 200 m i l l i o n / d a y 5 \ uzay yüzde \ zamanlar 2 \ uzay milyar = 200 \ uzay milyon / gün 5 p er n t × 2 bi ll i o n = 200 mi ll i o n / d a y
Sistemimiz için saniyede talepler (RPS)? Günde 2 milyar talep saniyede 24 bin talepte bulunuyor.
2 B I L L I O N (24 H R S × 3600 S E C O N D S) = ∼ 24 K R E Q U E S T S / S E C O N D \ Frac<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ SIM 24K \ Uzay İstekleri / İkinci (24 H RS × 3600 Seco N D S) 2 BI LL I O N = ∼ 24 K RE Q ES T S / SECO N D2>
### Depolama Ortalama olarak her bir mesajın 100 bayt olduğunu varsayarsak, her gün yaklaşık 200 GB veritabanı depolamasına ihtiyacımız olacak.
2 B I L L I O N × 100 B Y T E S = ∼ 200 G B / D A Y 2 \ Uzay Milyar \ Times 100 \ Uzay Bayt = \ Sim 200 \ Uzay GB / Gün 2 BI LL I O N × 100 B Y T E = ∼ 200 GB / D A y
Gereksinimlerimize göre, günlük mesajlarımızın yaklaşık yüzde 5’inin (100 milyon) medya dosyaları olduğunu da biliyoruz. Her bir dosyanın ortalama 50 kb olduğunu varsayarsak, her gün 10 TB depolama almaya ihtiyacımız olacak.
100 m i l l i o n × 100 k b = 10 t b / d a y 100 \ uzay milyon \ times 100 \ uzay kb = 10 \ uzay tb / gün 100 mi ll i o n × 100 k b = 10 tb / d a y
Ve 10 yıl boyunca, yaklaşık 38 PB depolama almaya ihtiyacımız olacağız.
(10 T B + 0.2 t b) × 10 y e a r s × 365 d a y s = ∼ 38 p b (10 \ uzay tb + 0.2 \ Space TB) \ Times 10 \ Uzay Yılları \ Times 365 \ Uzay Günleri = \ Sim 38 \ Space Pb (10 TB + 0.2 tb) × 10 y a rs × 365 d a ys = ∼ 38 pb
### Bant genişliği Sistemimiz 10’u kullanırken.Her gün 2 TB giriş, saniyede yaklaşık 120 MB minimum bant genişliği gerektireceğiz.
10.2 T B (24 H R S × 3600 S E C O N D S) = ∼ 120 M B / S E C O N D \ Frac<10.2 \space TB> <(24 \space hrs \times 3600 \space seconds)>= \ Sim 120 \ Uzay MB/Second (24 saat Rs × 3600 Seco N D s) 10.2 TB = ∼ 120 MB / Seco N D10.2>
### Üst düzey tahmin burada üst düzey tahminimizdir:
Tip | Tahmin etmek |
---|---|
Günlük Aktif Kullanıcılar (DAU) | 50 milyon |
Saniyede istekler (RPS) | 24k/s |
Depolama (günlük) | ~ 10.2 TB |
Depolama (10 yıl) | ~ 38 PB |
Bant genişliği | ~ 120 MB/S |
Veri Modeli Tasarımı
Bu, gereksinimlerimizi yansıtan genel veri modelidir. Aşağıdaki tablolara sahibiz: kullanıcılar Bu tablo, bir kullanıcının isim, telefonber ve diğer ayrıntılar gibi bilgilerini içerecektir. mesaj Adından da anlaşılacağı gibi, bu tablo Tür (Metin, Resim, Video, vb.), içerik ve mesaj teslimatı için zaman damgaları. Mesajda ayrıca ilgili bir ChatID veya GroupID olacak . sohbetler Bu tablo temel olarak iki kullanıcı arasında özel bir sohbeti temsil eder ve birden fazla mesaj içerebilir. users_chats Bu tablo, birden fazla kullanıcının birden fazla sohbete (n: m ilişkisi) sahip olabileceği için kullanıcıları ve sohbetleri haritalar ve tam tersi. grup Bu tablo, birden fazla kullanıcı arasındaki bir grubu temsil eder. users_groups Bu tablo, birden fazla kullanıcı birden fazla grubun (n: m ilişkisi) bir parçası olabilir ve tam tersi olarak kullanıcıları ve grupları haritalar.
Ne tür bir veritabanını kullanmalıyız?
Veri modelimiz oldukça ilişkisel görünse de, her şeyi tek bir veritabanında saklamamız gerekmez, çünkü bu ölçeklenebilirliğimizi sınırlayabilir ve hızla bir darboğaz haline gelebilir. Verileri her biri belirli bir tablo üzerinde mülkiyete sahip farklı hizmetler arasında böleceğiz. Daha sonra, PostgreSQL gibi ilişkisel bir veritabanı veya kullanım durumumuz için Apache Cassandra gibi dağıtılmış NoSQL veritabanı kullanabiliriz.
API Tasarımı
Hizmetlerimiz için temel bir API tasarımı yapalım:
Tüm sohbetleri veya grupları alın
Bu API, belirli bir kullanıcı kimliği için tüm sohbetleri veya grupları alacaktır .
Getall(Kullanıcı kimliği: Uuid): Sohbet[] | Grup[]
Tam ekran moduna girin
Tam ekran modundan çıkın
Parametreler Kullanıcı Kimliği (UUID): Geçerli kullanıcının kimliği. İadeler Sonuç (chat [] | group []): tüm sohbetler ve gruplar kullanıcı bir parçası.
Mesaj alın
ChannelID (Sohbet veya Grup Kimliği) verilen bir kullanıcı için tüm mesajları alın.
GetMessages(Kullanıcı kimliği: Uuid, kanal: Uuid): İleti[]
Tam ekran moduna girin
Tam ekran modundan çıkın
Parametreler Kullanıcı Kimliği (UUID): Geçerli kullanıcının kimliği. Kanal Kimliği (UUID): Mesajların alınması gereken kanalın (sohbet veya grup) kimliği. İadeler Mesajlar (Mesaj []): Belirli bir sohbet veya gruptaki tüm mesajlar.
Mesaj gönder
Bir kullanıcıdan bir kanala mesaj gönderin (sohbet veya grup).
mesaj gönder(Kullanıcı kimliği: Uuid, kanal: Uuid, İleti: İleti): boole
Tam ekran moduna girin
Tam ekran modundan çıkın
Parametreler Kullanıcı Kimliği (UUID): Geçerli kullanıcının kimliği. Kanal Kimliği (UUID): Kanalın Kimliği (Sohbet veya Grup) Kullanıcısı. Mesaj (mesaj): Mesaj (metin, resim, video vb.) kullanıcının göndermek istediği. İadeler Sonuç (boolean): operasyonun başarılı olup olmadığını temsil eder.
Katılın veya bir gruba bırakın
Bir kullanıcıdan bir kanala mesaj gönderin (sohbet veya grup).
Gruba katılmak(Kullanıcı kimliği: Uuid, kanal: Uuid): boole gruptan ayrıl(Kullanıcı kimliği: Uuid, kanal: Uuid): boole
Tam ekran moduna girin
Tam ekran modundan çıkın
Parametreler Kullanıcı Kimliği (UUID): Geçerli kullanıcının kimliği. Kanal Kimliği (UUID): Kanalın Kimliği (Sohbet veya Grup) Kullanıcı katılmak veya bırakmak istiyor. İadeler Sonuç (boolean): operasyonun başarılı olup olmadığını temsil eder.
Üst düzey tasarım
Şimdi sistemimizin üst düzey bir tasarımını yapalım.
Mimari
Mikro hizmet mimarisini kullanacağız, çünkü hizmetlerimizi yatay olarak ölçeklendirmeyi ve ayırmayı kolaylaştıracaktır. Her hizmetin kendi veri modelinin sahipliğine sahip olacak. Sistemimizi bazı temel hizmetlere bölmeye çalışalım. Kullanıcı hizmeti Bu, kimlik doğrulama ve kullanıcı bilgileri gibi kullanıcı ile ilgili endişeleri işleyen HTTP tabanlı bir hizmettir. Sohbet hizmeti Sohbet hizmeti, WebSockets’i kullanacak ve sohbet ve grup mesajıyla ilgili işlevselliği işlemek için istemci ile bağlantılar kuracaktır. Ayrıca, kullanıcının çevrimiçi olup olmadığını belirlememize yardımcı olacak tüm etkin bağlantıları takip etmek için önbellek kullanabiliriz. Bildirim Hizmeti Bu hizmet, kullanıcılara push bildirimleri gönderecektir. Ayrıntılı olarak ayrıntılı olarak tartışılacak. Varlık hizmeti Varlık hizmeti, tüm kullanıcıların son görülen durumunu takip edecektir. Ayrıntılı olarak ayrıntılı olarak tartışılacak. Medya hizmeti Bu hizmet medyayı (resimler, videolar, dosyalar vb.) yüklemeler. Ayrıntılı olarak ayrıntılı olarak tartışılacak. Hizmetler arası iletişim ve hizmet keşfi? Mimarimiz mikro hizmet tabanlı olduğundan, hizmetler birbirleriyle de iletişim kuracak. Genel olarak, dinlenme veya HTTP iyi performans gösterir, ancak daha hafif ve verimli olan GRPC kullanarak performansı daha da artırabiliriz. Hizmet keşfi, dikkate almamız gereken başka bir şeydir. Ayrıca, bireysel hizmetler arasında yönetilen, gözlemlenebilir ve güvenli iletişimi sağlayan bir hizmet ağını da kullanabiliriz. Not: REST, GraphQL, GRPC ve birbirleriyle nasıl karşılaştırıldıkları hakkında daha fazla bilgi edinin.
Gerçek Zamanlı Mesajlaşma
Nasıl verimli bir şekilde mesaj gönderir ve alırız? İki farklı seçeneğimiz var: Çekme Modeli Müşteri, yeni mesajlar olup olmadığını kontrol etmek için periyodik olarak sunuculara bir HTTP isteği gönderebilir. Bu uzun anket gibi bir şeyle elde edilebilir. Push modeli İstemci sunucu ile uzun ömürlü bir bağlantı açar ve yeni veriler mevcut olduğunda istemciye itilir. Bunun için WebSockets veya Sunucu Sıfırlı Etkinlikler (SSE) kullanabiliriz. Çekme modeli yaklaşımı, sunucularımızda gereksiz istek yükü oluşturacağı için ölçeklenemez değildir ve çoğu zaman yanıt boş olacak, böylece kaynaklarımızı boşa harcayacak. Gecikmeyi en aza indirmek için, Push modelini WebSoksets ile kullanmak daha iyi bir seçimdir, çünkü bağlantının açık olduğu göz önüne alındığında, herhangi bir gecikme olmadan verileri istemciye kullanabildikten sonra istemciye aktarabiliriz. Ayrıca, WebSockets, yalnızca tek yönlü olan sunucu katmanlı olayların (SSE) aksine tam çift yönlü iletişim sağlar. Not: Uzun yoklama, WebSoksets, Sunucu Seçkin Etkinlikler (SSE) hakkında daha fazla bilgi edinin.
Son görülen
Son görülen işlevselliği uygulamak için, müşterinin canlılığını gösteren sunuculara periyodik olarak ping yapabileceği bir kalp atışı mekanizması kullanabiliriz. Bunun olabildiğince düşük yük başı olması gerektiğinden, son aktif zaman damgasını önbellekte aşağıdaki gibi saklayabiliriz:
Anahtar | Değer |
---|---|
Kullanıcı a | 2022-07-01T14: 32: 50 |
Kullanıcı B | 2022-07-05T05: 10: 35 |
Kullanıcı c | 2022-07-10T04: 33: 25 |
Bu bize en son aktif olduğunu bize verecektir. Bu işlev, önbelleğimiz olarak Redis veya memcached ile birlikte varlık hizmeti tarafından ele alınacaktır. Bunu uygulamanın başka bir yolu, son etkinlik belirli bir eşiği geçtikten sonra kullanıcının en son eylemini izlemektir, örneğin “Kullanıcı son 30 saniyede herhangi bir işlem yapmadı”, Kullanıcıyı çevrimdışı olarak gösterebilir ve son kaydedilen zaman damgasıyla en son görülebiliriz. Bu daha tembel bir güncelleme yaklaşımı olacak ve bazı durumlarda kalp atışı üzerinden bize fayda sağlayabilir.
Bildirimler
Bir sohbete veya bir gruba mesaj gönderildikten sonra, önce alıcının etkin olup olmadığını kontrol edeceğiz, bu bilgileri kullanıcının etkin bağlantısını alarak alabilir ve en son dikkate alınabiliriz. Alıcı etkin değilse, sohbet hizmeti, bildirimi daha sonra doğru platforma yönlendirmek için kullanılacak olan müşterinin cihaz platformu gibi ek meta verilere sahip bir mesaj kuyruğuna bir olay ekleyecektir. Bildirim hizmeti daha sonra etkinliği mesaj kuyruğundan tüketecek ve isteği müşterinin cihaz platformuna (Android, iOS, Web, vb.). E -posta ve SMS için de destek ekleyebiliriz. Neden bir mesaj kuyruğu kullanıyoruz? Çoğu mesaj kuyruğu, mesajların genellikle gönderildiği sırayla iletilmesini ve bir mesajın en az bir kez teslim edilmesini sağlayan en iyi çaba siparişi sağladığından, hizmet işlevselliğimizin önemli bir parçasıdır. Bu, klasik bir yayın-abonelik kullanım durumu gibi görünse de, aslında mobil cihazlar ve tarayıcıların her birinin itme bildirimlerini ele almanın kendi yolu olmadığı gibi değil. Genellikle, bildirimler, arka uç hizmetlerinde yaygın olarak gördüğümüz mesaj fanının aksine Firebase Bulut Mesajlaşma (FCM) veya Apple Push Bildirim Hizmeti (APNS) aracılığıyla harici olarak ele alınır. Bu işlevselliği desteklemek için Amazon SQS veya Rabbitmq gibi bir şey kullanabiliriz.
Okuma makbuzları
Okuma makbuzlarının işlenmesi zor olabilir, bu kullanım durumu için, mesajın teslim edilip edilmediğini belirlemek ve ilgili teslimat alanını güncellemek için istemciden bir çeşit onay (ACK) bekleyebiliriz. Benzer şekilde, kullanıcı sohbeti açtığında ve ilgili Seenat Zaman Damgası alanını güncelledikten sonra görülen mesajı işaretleyeceğiz.
Tasarım
Artık bazı temel bileşenleri tanımladığımıza göre, sistem tasarımımızın ilk taslağını yapalım.
Detaylı tasarım
Tasarım kararlarımızı ayrıntılı olarak tartışmanın zamanı geldi.
Veri bölümleme
- Karma tabanlı bölümleme
- Liste Tabanlı Bölümleme
- Menzil tabanlı bölümleme
- Kompozit bölümleme
Yukarıdaki yaklaşımlar hala düzensiz verilere ve yük dağılımına neden olabilir, bunu tutarlı karma kullanarak çözebiliriz.
Önbelleğe almak
Bir mesajlaşma uygulamasında, kullanıcılarımız en son verileri beklediği için önbellek kullanmaya dikkat etmeliyiz, ancak birçok kullanıcı aynı mesajları isteyecek, özellikle bir grup sohbetinde. Yani, kaynaklarımızdan kullanım artışlarını önlemek için eski mesajları önbelleğe alabiliriz.
Bazı grup sohbetlerinde binlerce mesajı olabilir ve ağ üzerinden gerçekten verimsiz olacağını gönderebilir, verimliliği artırmak için sistem API’lerimize sayfalandırma ekleyebiliriz. Bu karar, istenmedikçe eski mesajları almak zorunda kalmayacakları için sınırlı ağ bant genişliğine sahip kullanıcılar için yararlı olacaktır.
Hangi önbellek tahliye politikası kullanılacak?
Redis veya Memcached gibi çözümleri kullanabiliriz ve günlük trafiğin% 20’sini önbelleğe alabiliriz, ancak ne tür önbellek tahliye politikası ihtiyaçlarımıza en uygun olacaktır??
En az son zamanlarda kullanılan (LRU) sistemimiz için iyi bir politika olabilir. Bu politikada, en az kullanılan anahtarı ilk olarak atıyoruz.
Önbellek Bayan Nasıl İşlenir?
Bir önbellek özledim olduğunda, sunucularımız veritabanına doğrudan vurabilir ve yeni girişlerle önbelleği güncelleyebilir.
Daha fazla ayrıntı için önbelleklemeye bakın.
Medya Erişimi ve Depolama
Bildiğimiz gibi, depolama alanımızın çoğu resimler, videolar veya diğer dosyalar gibi medya dosyalarını depolamak için kullanılacaktır. Medya hizmetimiz, kullanıcı medya dosyalarının hem erişimini ve depolanmasını işleyecek.
Ama dosyaları nerede ölçeklendirebiliriz? Ne aradığımız nesne depolama. Nesne depoları veri dosyalarını nesneler denilen parçalara ayırın. Daha sonra, bu nesneleri birden fazla ağa bağlı sisteme yayılabilen tek bir depoda saklar. HDF’ler veya Glusterfs gibi dağıtılmış dosya depolamasını da kullanabiliriz.
Eğlenceli Gerçek: WhatsApp, kullanıcı tarafından indirildikten sonra sunucularında medyayı siler.
Bu kullanım durumu için Amazon S3, Azure Blob Storage veya Google Cloud depolama gibi nesne mağazalarını kullanabiliriz.
İçerik Dağıtım Ağı (CDN)
İçerik Dağıtım Ağı (CDN), bant genişliği maliyetlerini azaltırken içerik kullanılabilirliğini ve fazlalığı artırır. Genellikle, görüntüler ve videolar gibi statik dosyalar CDN’den sunulur. Bu kullanım durumu için Amazon Cloudfront veya Cloudflare CDN gibi hizmetleri kullanabiliriz.
API Ağ Geçidi
HTTP, WebSocket, TCP/IP gibi birden fazla protokol kullanacağımız, birden fazla L4 (taşıma katmanı) veya L7 (uygulama katmanı) türü yük dengeleyicilerini ayrı ayrı dağıtacağımız için pahalı olacaktır. Bunun yerine, herhangi bir sorun olmadan birden fazla protokolü destekleyen bir API ağ geçidi kullanabiliriz.
API Gateway, hizmetlerimizin kalitesini artıracak kimlik doğrulama, yetkilendirme, hız sınırlama, kısma ve API sürümleme gibi diğer özellikleri de sunabilir.
Bu kullanım durumu için Amazon API Gateway veya Azure API Gateway gibi hizmetleri kullanabiliriz.
Darboğazları tanımlayın ve çözün
Tasarımımızdaki tek başarısızlık noktaları gibi darboğazları belirleyelim ve çözelim:
- “Ya hizmetlerimizden biri çökerse?”
- “Trafiğimizi bileşenlerimiz arasında nasıl dağıtacağız??”
- “Veritabanımızdaki yükü nasıl azaltabiliriz??”
- “Önbelleğimizin mevcudiyeti nasıl iyileştirilir?”
- “API ağ geçidi tek bir başarısızlık noktası olmaz?”
- “Bildirim sistemimizi nasıl daha sağlam hale getirebiliriz??”
- “Medya depolama maliyetlerini nasıl azaltabiliriz”?
- “Sohbet hizmetinin çok fazla sorumluluğu var mı?”
Sistemimizi daha esnek hale getirmek için aşağıdakileri yapabiliriz:
- Hizmetlerimizin her birinin birden fazla örneğini çalıştırmak.
- İstemciler, sunucular, veritabanları ve önbellek sunucuları arasında yük dengeleyicilerini tanıtmak.
- Veritabanlarımız için birden fazla okuma kopyası kullanma.
- Dağıtılmış önbelleğimiz için birden fazla örnek ve kopya.
- API Gateway’imizin bekleme kopyasını alabiliriz.
- Dağıtılmış bir sistemde tam olarak teslimat ve mesaj siparişi zor olduğunda, bildirim sistemimizi daha sağlam hale getirmek için Apache Kafka veya Nats gibi özel bir mesaj brokeri kullanabiliriz.
- WhatsApp’a benzer büyük dosyaları sıkıştırmak ve çok fazla depolama alanından tasarruf edecek ve maliyeti azaltacak olan büyük dosyaları sıkıştırmak için medya işleme ve sıkıştırma özellikleri ekleyebiliriz.
- Hizmetlerimizi daha da uzaklaştırmak için sohbet hizmetinden ayrı bir grup hizmeti oluşturabiliriz.
Bu makale GitHub’da bulunan açık kaynak sistem tasarım kursumun bir parçası.
KaranPratapsingh / Sistem-Design
Sistemleri ölçekte nasıl tasarlayacağınızı öğrenin ve sistem tasarımı görüşmelerine hazırlanın
Sistem Tasarım Kursu
Hey, kursa hoş geldiniz. Umarım bu kurs harika bir öğrenme deneyimi sağlar.
Bu kurs web sitemde ve Leanpub’da bir e -kitap olarak da mevcuttur. Bu yardımcı olursa lütfen bir motivasyon olarak bırakın!
İçindekiler
- Başlarken
- Sistem tasarımı nedir?
- Ivır zıvır
- OSI modeli
- TCP ve UDP
- Alan Adı Sistemi (DNS)
- Yük dengeleme
- Kümeleme
- Önbelleğe almak
- İçerik Dağıtım Ağı (CDN)
- Vekil
- Kullanılabilirlik
- Ölçeklenebilirlik
- Depolamak
- Veritabanları ve DBMS
- SQL Veritabanları
- NoSQL veritabanları
- SQL vs NoSQL veritabanları
- Veritabanı çoğaltma
- İndeksler
- Normalleşme ve denormalizasyon
- Asit ve baz tutarlılık modelleri
- Thororem
- Pacelc teoremi
- İşlemler
- Dağıtılmış İşlemler
- Kırma
- Tutarlı karma
- Veritabanı federasyonu
- N-katmanlı mimarlık
- Mesaj Komisyoncuları
- Mesaj Kuyrukları
- Yayınla
- Kurumsal Servis Otobüsü (ESB)
- Monolitler ve mikro hizmetler
- Etkinlik Odaklı Mimari (EDA)
- Etkinlik Kaynağı
- Komuta ve Sorgu Sorumluluk Ayrıntısı (CQRS)
- API Ağ Geçidi
- Dinlenme, grafik, grpc
- Uzun yoklama, WebSockets, Sunucu Santimli Etkinlikler (SSE)