Önceden dağıtılmış işlemler olmadan dağıtılmış işlemleri kullanamazdım, çünkü bu çok fazla karmaşıklık yaratırdı. İnternette birçok açık kaynak dağıtılmış işlem çerçevesi olmasına rağmen, bunlar çok olgun değiller ve çok fazla iş doğrulamasına sahip değiller. Dağıtılmış ileti kuyruğu ara yazılımları gibi çok sayıda olgun çözüme sahip diğer dağıtılmış ara yazılımlara benzemez: Apache Kafka, Apache RocketMQ, Apache Pulsar, bu üçü Apache üst düzey projelerdir; başka bir örnek dağıtılmış görev planlamasıdır, ayrıca XXL-JOB, Elastic-Job gibi birçok açık kaynak birçok şirket tarafından kullanılmaktadır.
Fescar hakkında konuşmadan önce, işte ünlü 2PC: XA İşlemlerine kısa bir giriş. XA protokolünde iki aşama vardır:
Birinci aşama: işlem yöneticisi, işlemde yer alan her veri tabanının bu işlemi önceden gerçekleştirmesini ve gönderilip gönderilemeyeceğini yansıtmasını gerektirir İkinci aşama: işlem koordinatörü, her veri tabanının verileri işlemesini veya verileri geri almasını ister.
Avantajlar: Verilerin güçlü tutarlılığını sağlamaya çalışın ve uygulama maliyeti düşüktür.Büyük ana veri tabanlarında kendi uygulaması vardır. MySQL 5.5'ten desteklenir.
Dezavantajları:
Genel olarak, XA protokolü nispeten basit ve düşük maliyetlidir, ancak tek nokta sorunu ve yüksek eşzamanlılığı destekleyememesi (eşzamanlı engelleme nedeniyle) hala en büyük zayıflıklarıdır.
XA protokolünün birçok sorunu olduğu görülebilir, bu nedenle dağıtılmış bir işlem çözümü olarak tartışıldığında acımasızca öldürülür, ancak XA, işi istila etmemesi (veritabanı seviyesi) ve işte ek kod yazmaya gerek olmaması açısından iyi bir avantaja sahiptir. , İşe daha fazla dikkat edin.
Makalemde, uygulama düzeyinde birkaç dağıtılmış işlem tanıttım, ancak bunlar iş için aşağı yukarı müdahaleci. Örneğin, TCC'mizde, yaygın olarak kullanılan bazı TCC çerçevelerinin, mevcut işletmeleri dönüştürmek için dene, onayla, iptal et ve diğer arayüzleri yazması gerekir. Yerel mesaj tablosu modu kullanılıyorsa, ek tabloların eklenmesi gerekir. RocketMQ gibi işlem mesajları kullanılıyorsa, mesaj kuyruğunu kullanmayan bazı işletmelerin mesaj kuyruğunu değiştirmesi gerekecektir. Saga modu benimsenirse ileri ve geri arayüzler de yazmamız gerekir. Görülebileceği gibi, hangi dağıtılmış işlem şeması benimsenirse, belirli iş dönüşümü ve işletmeye girme maliyetleri olacaktır.
Fescar, XA'nın müdahaleci olmayan avantajlarını diğer uygulama katmanı işlem protokollerinin yüksek performans avantajlarıyla birleştirir ve temelde iş koduna müdahale edilmeden uygulama katmanında iki aşamalı protokol işlemini gerçekleştirir.
Fescar, iki aşamalı kesinleştirme protokolünün dağıtılmış bir işlemi olmasına rağmen, yukarıdaki XA'nın bazı eksikliklerini çözer:
Aynı zamanda, Fescar aynı zamanda sıfıra yakın iş saldırısı avantajını da korur: İstediğimiz amaca ulaşmak için Fescar'ın veri proxy'sini yapılandırın, bir açıklama ekleyin ve bir Undolog tablosu ekleyin.
Fescar'ın tasarımının özü, rol sınıflandırmasıdır. Veritabanındaki hem XA hem de Fescar'ın iki rolü vardır: TM (işlem yöneticisi) ve RM (kaynak yöneticisi) ve Fescar'ın ayrıca bir TC'si (işlem koordinatörü) vardır. Öncelikle TC yoksa sadece TM ve RM varsa ne olacağına bir bakalım. Burada basit bir örnek vereceğim, Xiao Ming aşağıdaki şekilde gösterildiği gibi bir ürün satın almak için web sitesine gitti:
Xiaoming burada aslında TM (işlem yöneticisi) ve mallar ve hesaplar aslında RM'mizdir (kaynak yöneticisi) Normal şartlar altında, sorulan soru olmayabilir ve hesap ve envanter başarıyla düşülebilir. Xiaoming envanteri düşürmeyi başarır ancak hesabı düşürürken başarısız olursa, envanter kaynaklarımızı geri almamız gerekir. Xiao Ming, önceki aşamada düşülen malları telafi etmek için envanteri şu anda bilgilendirecek. Ancak, envanter geri alındığında envanter hizmeti kararsızdı ve geri alma bu sefer başarısız oldu. Genel olarak konuşursak, Xiao Ming başarılı olana kadar tekrar denemeye devam edecek. Yani Xiao Ming'in her zaman engellendiği ve hiçbir şey yapamadığı bir sorun var. Bu, ikinci aşama tamamlama / geri alma her zaman TM'yi engelleyeceği için de görülebilir.Netease DDB'nin XA protokolü, bu durum için bir asenkron evre işlemi yapacaktır. Ancak Fescar'da her şey TC tarafından yapılıyor.Tabii ki, TC sadece ikinci aşama başarısız tekrar denemesini yapmakla kalmayacak, aynı zamanda ikinci aşamada RM'nin tüm taahhütlerini ve geri dönüşlerini yapacak, böylece TM'miz daha az iş yapacaktır.
Fescar'da TM, RM ve TC arasındaki ilişki aşağıdaki resmi diyagramda gösterilmektedir:
Bu üç rol arasındaki işbölümü açıktır ve bu Fescar'ımızın gerçek özüdür.Ardından, Fescar'ı nasıl kullanacağınızla ilgili olarak size bu üç rol hakkında daha derin bir anlayış vereceğim.
Fescar'ın github https://github.com/fescar-group/fescar-samples adresinde basit bir örnek sağlanmıştır, burada bu örneği indirmemiz gerekiyor.
4.1 TC Fescar sunucusu oluşturma
Her şeyden önce, Fescar-Server'ı kurmak için çağrılabilecek bir işlem koordinatörü oluşturuyoruz.Resmi web sitesinin örneği, Nacos artı fescar-server'ın çalışması için oluşturulmuş jar paketini kullanmaktır. Burada bize kolaylık sağlamak için, fescar https://github.com/alibaba/fescar kodunu doğrudan indirebiliriz.
Sunucumuzu bulun:
Ana yöntemi doğrudan çalıştırın; bu, yerel olarak 8091 bağlantı noktası numaralı bir fescar-sunucu hizmeti başlatmamıza yardımcı olacaktır. Servis kaydı yapmak istiyorsak, kayıt defteri.conf altında türü değiştirebiliriz.
0.4.1 sürümünde, nacos, eureka, redis ve zk olmak üzere dört hizmet kaydının desteklendiği görülebilir. Şu anda, hizmet kaydı için redis kullanımıyla ilgili bir sorun var, ayrıca düzeltme için yetkiliye bir PR'dan bahsetmiştim. Elbette kolaylık sağlamak için aslında dosyayı seçiyoruz ve doğrudan bağlanmamız bizim için en uygun olanı.
Ana yöntemi çalıştırdıktan sonra Sunucu başlatıldı günlüğü görünürse, TC'mizin (işlem koordinatörümüz) başarıyla başladığı anlamına gelir.
4.2 ÇB'yi Tanı
Yukarıdaki işlem koordinatörü kuruldu. Yapmamız gereken bir sonraki şey TM ve RM'yi çalıştırmak ve ilgili işlemleri işlem koordinatörümüze devretmek. Şu anda fescar-sample projesini açmamız gerekiyor: Bu projede kullanılan RPC Dubbo olduğu için, varsayılan servis kayıt merkezi Nacos ve yerel olarak bir Nacos kurmamız gerekiyor. Spesifik kurulum kendimiz tarafından araştırılabilir.Bunu burada tartışmayacağım.
Buradaki resmi örnekte, iş ilişkisi aşağıdaki gibidir:
İşletmenin TM'iz olduğunu görebilir ve ilgili kodu bulabilirsiniz:
Koddan, dağıtılmış bir işlem başlatmak için @GlobalTransactional ek açıklamasını eklememiz gerektiğini biliyoruz.Elbette, Fescar aynı etkiyi elde etmek için bir API de sağlıyor. Ayrıca, Registry.conf'daki Type'ı dosyaya değiştirmemiz gerekir.
Örnekte değilse, ancak bizim gerçek işimizde, iş kodunu değiştirmeye hiç gerek yoksa, bu ek açıklamayı doğrudan dağıtılmış işlem başlatıcımıza ekleyin.
Bu GloblTranscational ek açıklaması tam olarak ne yapıyor? Aslında, bu ek açıklamaya sahip olanlar GlobalTransactionalInterceptor adlı bir özelliğe gidecek ve daha sonra bu özellik, aynı zamanda TM'nin temel yöntemi olan TrascationTemplate sınıfındaki excute yöntemine girecek:
Yukarıdaki kod kısmen silinir ve yalnızca temel işlem seçilir. TrascationTemplate, aslında Fescar tarafından sağlanan bir API'dir.Eğer ek açıklamalar kullanılmazsa, onu da taklit edebiliriz. Beş ana adım olduğu görülebilir:
TM'nin temel süreci esas olarak bu 5 adımdır ve diğer ayrıntılı açıklamalar sonraki kodda yansıtılacaktır.
4.3 RM'yi Anlamak
Yukarıdaki İşletmemiz bir iş talebini başlattığında, RM sürecimize geliriz Depolama ve Sipariş hizmetlerimiz artık dağıtılmış bir işlemde olduklarını nasıl bilirler? Bunun RPC çerçevesinin yardımıyla yapılması gerekiyor.Burada Dubbo kullanıyoruz. Fescar, aşağıdaki şekilde gösterildiği gibi Dubbo için bir filtre sağlar:
Burada xid'imizi dağıtılmış işlem kimliğimiz olan rpcContext'ten alacağız. Varsa, bu isteğin dağıtılmış bir işlemde olduğunu kanıtlarsa, XID, RootContext'e (fescar'ın yerel bağlamı) yerleştirilecektir. . Dubbo değilseniz, RPC'nizi de bu yönteme göre uyarlayabilirsiniz.
RM'de ne yapmalıyız? Sadece aşağıdaki iki adımı uygulayın:
Fescar'da yalnızca dataSource proxy'si değil, aynı zamanda aşağıda gösterildiği gibi bağlantı ve ifade de var:
Herkes SQL'imizin belirli bir şekilde yürütülmesinin İfade'ye dayanması gerektiğini bilir.Fescar'ın İfade Proxy'sinde aşağıdaki kodlar vardır:
Çalıştırma yönteminin ExecuteTemplate.execute olduğunu görebilirsiniz. Yürütme yönteminde, Undolog'umuz yürüttüğümüz ifade türüne göre kaydedilecektir. Özel yürütme süreci için aşağıdaki resmi resme bakın:
Genel olarak, RM'mizin iki ana temel süreci vardır: Biri dağıtılmış işlemlerin nasıl tanımlanacağı, diğeri ise orijinal basit SQL yürütme sürecimizin veri kaynağı aracımız aracılığıyla daha fazla şey yapmasına izin vermektir.
Bu makaleyi yazmanın amacı sadece herkesin Fescar'ı tanımasını sağlamak değil, aynı zamanda daha fazla kişiye mükemmel bir dağıtılmış işlem çerçevesinin ne yapması gerektiğini bilmesini sağlamaktır. Fescar'ın güncel sürümü 0.4.1 ve HA-Cluster, SpringCloud entegrasyonu gibi pek çok özellik henüz piyasaya sürülmedi. Bu nedenle, çevrimiçi kullanırsanız, Fescar tek nokta sorunlarıyla karşılaşabilirsiniz, bu nedenle çevrimiçi kullanım çok tavsiye edilmez. Fescar'ın mevcut planı, HA-Cluster'ı 0.5.x sürümünde başlatmaktır ve tek nokta sorunu o zaman çözülecektir.
Bu makalenin ilkesi şu anda görece yüzeyseldir.Eğer onu derinlemesine anlamanız gerekiyorsa, burada en son bir ilgili mimari video derleyeceğim ve Java mülakat materyallerini burada tamamlayacağım, bu da hala dağıtımda mücadele edenlere kesinlikle yardımcı olacaktır.
Elde etme yöntemi: ileri + arka planda "Java bilgileri" özel mesajını takip edin