Lignum: dağıtılmış mesaj kuyruğu
Tüm WFH karmaşası ve yalıtılmış durum arasında, Consul'u kullanarak dağıtılmış kilitleri incelemeye koyuldum, basit test programı kısa sürede Lignum adlı dağıtılmış bir mesaj kuyruğu oluşturmaya giden bir yol haline geldi .
Bu, Lignum mesaj kuyruğuna giriş niteliğinde bir makaledir.
Dağıtık sistem nedir?
Orada birçok tanım var, basit bir google araması birden çok yanıtla sonuçlanacak. Dağıtılmış sistemi, ortak bir amaç için çalışan özerk veya bireysel program veya sistemler topluluğu olarak tanımlayabilirim.
Anlamı, ortak bir amaca hizmet etmek için çeşitli iletişim araçlarıyla birbirine bağlanan birden fazla sistem. Birinin web sayfası istediği ve diğerinin web sayfalarını sunduğu sistemler olabilir. Bir son kullanıcı için bu sistemler tek bir sistem olarak görünebilir, ancak görevi yerine getirmek için birbirleriyle iletişim kuran bu tür yüzlerce sistem olabilir.
Mesaj kuyruğu nedir?
Diğer servislerin FIFO sırasına göre mesaj okuması ve yazması için kuyruk veri yapısı sağlayan sistem.
Kuyruk, üretici hizmetinin mesaj yazmasına ve tüketicinin eşzamansız olarak tüketmesine olanak tanır. Üretici ve tüketicinin birbirinden haberdar olması gerekmez.
İleti kuyruğunun iki temel özelliği şunlardır:
- Konu
Mesajları, adlandırılmış tampona gönderilir, bunlara konu adı verilir. Konudan mesajlar üretir ve tüketiriz. - Mesaj
Bu, başkalarının tüketmesi için konuya yazdığımız asıl mesajdır.
Dağıtılmış mesaj kuyruğu nedir?
Diğer hizmetler için tek bir varlık olarak hizmet vermek üzere topluca çalışan birden çok düğümde barındırılan bir ileti kuyruğu oluşturduğumuzda.
Sağlanacak kullanıcı mesajlarını barındıran birden fazla kuyruk olacak
- Güvenilirlik ve yüksek kullanılabilirlik
- Hata toleransı
- Verim
- Okuma yükünü birden çok düğümle paylaşma
Lignum , o sırada Kafka üzerinde çalışırken mesaj kuyruğuna doğru dönmeye başlayan Consul session lock kullanarak dağıtılmış kilitlemeyi öğrenmek için bir test programı olarak başlatıldı.
Bu Go'da yazılmıştır. Aklımda test odaklı geliştirme ile başladım ama kısa süre sonra bir karmaşaya dönüştü.
Lignum tam teşekküllü bir mesaj kuyruğu değil, devam eden bir çalışma. Yapabilirsin
- Konuya mesaj gönder
- Konudaki mesajları tüket
- Mesaj tüm düğümlere kopyalanır, yani konudan gelen mesajı okumak için herhangi bir düğüm kullanılabilir.
- Diskteki kalıcı mesajlar
- Lignum herhangi bir özel kurulum gerektirmeden küme modunda çalışabilir
- Küme yönetimi, oturum kilitleriyle Consul tarafından kolaylaştırılır
- Her düğüm, lideri almak için Konsolos'a bağlanacaktır. Lider bulunamazsa, düğümlerden biri lider olarak seçilecektir.
- Diğer tüm düğümler kendisini liderin takipçisi olarak kaydedecektir.
- Lidere gönderilen mesaj takipçi düğüme kopyalanacaktır.
- İki çoğaltma modu vardır
a. WAL replikasyonu
b. Canlı çoğaltma - Lider düşerse, takipçilerden herhangi biri lider olarak seçilir.
Şu anda lignum, iki çoğaltma stratejisi modu uygulamaktadır.
- WAL çoğaltma
- Canlı çoğaltma.
WAL çoğaltma
Mesaj, config( message.initial-szie-per-topic
) içinde tanımlanan arabellek boyutunun üzerine çıktığında her konu için günlük dosyası oluşturulur. Lignum .qwal
her konu için WAL dosyası( ) oluşturur. İleti sayısı arabellek boyutuna ulaştığında, bu dosya dosya olarak diske boşaltılır log
. Lignum, bu günlük dosyası oluşturma işlemlerini sık sık izler ve takipçilere gönderir. Tüm takipçiler, nihai/gecikmeli tutarlılık sağlayarak liderle periyodik olarak senkronize edilir.
Canlı çoğaltma
Bu bir akış kopyasıdır, takipçi zaten lidere kayıtlı olduğunda, konu daha sonra oluşturulmuşsa mesajları senkronize etme konusunda endişelenmemize gerek yoktur. Sadece liderde olduğu gibi gelen mesajları takipçiye iletebiliriz. Bu stratejide, mesajlar kayıtlı takipçiye anında gönderilir. Bu şekilde Lignum güçlü bir tutarlılık sağlayabilir.
Lignum nasıl çalıştırılır
- Önkoşul
— Consul Dockerfile'ı README'de
belirtildiği gibi kullanabilirsiniz - Depoyu klonla
https://github.com/NishanthSpShetty/lignum.git
config.yml
başvurabilirsiniz .make run
- Mesaj gönder
curl --request POST \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"message":"this is a test message"
}'
curl --request GET \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"from": 0,
"to": 3
}'
Hangi teslimat garantisini sunuyor?
Mesajlar kalıcı olduğundan ve tüketici her an ofseti okuyabildiğinden teslimat garantisi tüketiciye aittir. Lignum, mesaj sıralamasını garanti eder.
Mevcut kümeye düğüm ekleyelim
- Yapılandırmayı sunucunuza göre değiştirin.
- Önceki çalıştırmayla aynı ana bilgisayarda çalışıyorsa, yapılandırma dosyasındaki bağlantı noktası, veri dizini ve çoğaltma bağlantı noktası değerlerini değiştirin.
- Koşmak
make run
Bu, Lignum'a kısa bir giriş niteliğindedir. Gelecekte iç kısımları ve geliştirme detayları hakkında ayrı bir belge hazırlayacağım.
Kod Github'da: Lignum .
Kontrol edin ve geri bildirimde bulunun, katkılarınızı bekliyoruz.
Üzerinde çalıştığım diğer harika projeler için Github profilime göz atın
LinkedIn'de benimle bağlantı kurun
https://www.linkedin.com/in/nishanthspshetty/