1. RocketMQ nedir?
Yüksek performans, yüksek güvenilirlik, yüksek gerçek zamanlı ve dağıtılmış özelliklere sahip bir kuyruk modelinin mesaj ara yazılımıdır.
Üretici, Tüketici ve kuyruğun tümü dağıtılabilir,
Yapımcı sırayla bazı sıralara mesaj gönderir. Sıra kümesine Konu denir. Tüketici yayın tüketimini kullanıyorsa, bir tüketici örneği bu konuya karşılık gelen tüm kuyrukları tüketir. Küme tüketimi yaparsa, birden fazla tüketici örneği ortalama olarak bu konuya karşılık gelen kuyruk kümesini tüketir.
Sıkı mesaj sırasını garanti edebilir
Zengin mesaj çekme modu sağlayın
Verimli abone yatay genişletme yeteneği
Gerçek zamanlı haber abonelik mekanizması
Milyar düzeyinde mesaj biriktirme yeteneği
Daha az bağımlı
İki, mesaj tekrarlanıyor
Yukarıdaki mesaj sırası problemini çözerken, mesaj tekrarlama olan yeni bir problem ortaya çıktı. Peki RocketMQ mesaj tekrarlama problemini nasıl çözer? Yine de "sadece" çözülmez.
Tekrarlanan mesajların temel nedeni şudur: ağa erişilemez. Veri ağ üzerinden değiş tokuş edildiği sürece, bu problem önlenemez. Yani bu sorunun çözümü, bu sorunu atlamaktır. Soru şu hale gelir: Tüketici iki özdeş mesaj alırsa ne yapılmalı?
Madde 1'in anlaşılması kolaydır İdeopotans korunduğu sürece, kaç tane yinelenen mesaj gelirse gelsin, nihai işlem sonucu aynı olacaktır. İkinci ilke, başarıyla işlenen mesajın kimliğini kaydetmek için bir günlük tablosu kullanmaktır.Yeni gelen mesajın kimliği zaten günlük tablosundaysa, mesaj işlenmeyecektir.
İlk çözüm açıkça tüketici tarafında uygulanacak ve mesajlaşma sisteminin bir işlevi değil. Madde 2, mesaj sisteminde veya iş tarafında uygulanabilir. Normal şartlar altında, yinelenen mesajların olasılığı aslında çok azdır.Mesaj sistemi tarafından uygulanırsa, mesaj sisteminin verimini ve yüksek kullanılabilirliğini kesinlikle etkileyecektir. Bu nedenle, işin kendi başına mesaj kopyalama sorununu çözmesine izin vermek en iyisidir. RocketMQ, mesaj çoğaltma sorununun nedenini çözmez.
RocketMQ mesajların tekrarlanmayacağını garanti etmez.İşletmenizin mesajların kesinlikle tekrarlanmamasını sağlaması gerekiyorsa, bunları işletme tarafında tekilleştirmeniz gerekir.
Üç, iş haberleri
RocketMQ sadece sıradan mesajları, sıralı mesajları değil, aynı zamanda işlem mesajlarını da destekler. İlk önce işlem mesajının ne olduğunu ve işlem mesajlarını destekleme ihtiyacını tartışın. Örnek olarak bir transfer senaryosunu ele alalım: Bob, Smith'e 100 yuan aktarıyor.
Bağımsız bir ortamda, işlemlerin yürütülmesi muhtemelen aşağıdaki gibidir:
Bağımsız bir ortamda transfer işlemlerinin şematik diyagramı
Kullanıcı belirli bir ölçüde büyüdüğünde, Bob ve Smith'in hesap ve bakiye bilgileri artık aynı sunucuda olmadığında, yukarıdaki süreç şu şekilde olur:
Bir küme ortamında transfer işlemlerinin şematik diyagramı
Şu anda, bunun aynı zamanda bir transfer işi olduğunu göreceksiniz ve bir küme ortamında, zaman alıcı gerçekte ikiye katlanıyor, ki bu açıkça kabul edilemez. Bu problem nasıl çözülür?
Büyük işlem = küçük işlem + eşzamansız
Eşzamansız olarak yürütmek için büyük bir işlemi birden çok küçük işleme bölün. Bu, temel olarak, makineler arası işlemlerin yürütme verimliliğini tek bir makineninkiyle tutarlı olacak şekilde optimize eder. Transfer işlemi aşağıdaki iki küçük işleme ayrılabilir:
Küçük işlem + eşzamansız mesaj
Şekilde yerel işlemlerin gerçekleştirilmesi (Bob hesap kesintisi) ve asenkron mesajların gönderilmesi aynı anda başarılı veya başarısız olacak şekilde garanti edilmelidir, yani kesinti başarılı olursa mesaj başarıyla gönderilmelidir, kesinti başarısız olursa, daha fazla mesaj gönderilemez. Soru şu: Önce ödemeyi keselim mi yoksa önce mesajı mı gönderelim?
Önce mesajın ilk gönderildiği duruma bakın.Genel şema aşağıdaki gibidir:
İşlem mesajı: önce mesajı gönder
Sorun şu ki, mesaj başarılı bir şekilde gönderilirse, ancak kesinti başarısız olursa, tüketici mesajı tüketecek ve ardından Smith hesabına para ekleyecektir.