ApsaraMQ for RocketMQ dağıtılmış işlemsel mesajları destekler. İşlemsel mesajlar, nihai tutarlılığın gerekli olduğu senaryolarda kullanılır. Bu konuda, ApsaraMQ for RocketMQ işlemsel mesajlarının kavramları, faydaları, kullanım senaryoları, etkileşim süreci, kullanım notları ve örnek kodları açıklanmaktadır.
Terimler
İşlemsel mesaj: ApsaraMQ for RocketMQ, ApsaraMQ for RocketMQ içinde işlem tutarlılığını sağlamak için X/Open XA'ya benzer bir dağıtılmış işlem işleme özelliği sunar.
Yarı mesaj: Geçici olarak teslim edilemeyen mesaja yarı mesaj denir. Üretici bir mesajı ApsaraMQ for RocketMQ broker'a gönderdiğinde ancak broker üreticiden ikinci onayı (ACK) almadığında mesaj "geçici olarak teslim edilemez" olarak işaretlenir. Bu durumdaki mesaja yarı mesaj adı verilir.ApsaraMQ for RocketMQ
Mesaj durumu kontrolü: Ağda geçici bir bağlantı sorunu oluşması veya üretici uygulamasının yeniden başlatılması durumunda işlemsel bir mesaj için ikinci ACK kaybolabilir. ApsaraMQ for RocketMQ broker'ı bir mesajın uzun süre yarı mesaj olarak kaldığını tespit ettiğinde, üreticiye mesajın nihai durumunun Commit mi yoksa Rollback mi olduğunu kontrol etmesi için bir istek gönderir.
Faydalar
ApsaraMQ for RocketMQ, dağıtılmış işlemsel mesajlar kullanarak uygulamaların birbirinden ayrıştırılmasını ve verilerin nihai tutarlılığının sağlanmasını gerçekleştirir. Geleneksel büyük işlemler daha küçük işlemlere bölünebilir. Bu yaklaşım verimliliği artırır. Ayrıca bir uygulamada istisna meydana geldiğinde çekirdek sistemin kullanılabilirliğini korur. Bir uygulama mesaj almaya devam edemiyorsa tüm mesajları geri almak yerine yalnızca ilgili uygulama için verileri tamamlayabilir veya düzeltebilirsiniz.
Senaryolar
Kullanıcılar e-ticaret uygulamalarında alışveriş sepetlerine ürün eklediğinde hem sepet sistemi hem de ticaret sistemi devreye girer. Dağıtılmış işlemsel mesajlar asenkron olarak işlenebilir. Bu yöntem iki sistem arasında nihai tutarlılığı garanti eder. Bu senaryoda ticaret sistemi kritik öneme sahiptir ve dağıtılmış işlem işleme özelliği siparişlerin başarıyla oluşturulmasını sağlamalıdır. Sepet sistemi, ApsaraMQ for RocketMQ üzerinden yalnızca siparişlerle ilgili konulara abone olabilir ve ardından ilgili işlemleri yürütebilir. Böylece dağıtılmış işlem işleme özelliği iki sistem arasındaki nihai tutarlılığı temin eder.
Etkileşim süreci
Aşağıdaki şekil işlemsel mesajların etkileşim sürecini göstermektedir. 
Bir işlemsel mesaj gönderme prosedürü aşağıdaki adımları içerir:
Üretici, ApsaraMQ for RocketMQ broker'a bir yarı mesaj gönderir.
ApsaraMQ for RocketMQ broker'ı mesajı kalıcı bir mesaja dönüştürür ve mesajın alındığını onaylamak için üreticiye bir ACK gönderir. Bu aşamada mesaj bir yarı mesajdır.
Üretici yerel bir işlem yürütür.
-
Üretici, yerel işlemin yürütme sonucunu iletmek için broker'a ikinci bir ACK gönderir. Yürütme sonucu Commit veya Rollback olabilir.
Broker tarafından alınan mesajın durumu Commit ise broker yarı mesajı teslim edilebilir olarak işaretler ve mesajı tüketiciye iletir.
Broker tarafından alınan mesajın durumu Rollback ise broker işlemi geri alır ve yarı mesajı tüketiciye iletmez.
Ağ bağlantısı kesilir veya üretici uygulaması yeniden başlatılır. Bu durumda broker ikinci bir ACK almazsa veya yarı mesajın durumu Unknown ise broker belirli bir süre bekler ve ardından üretici kümesindeki bir üreticiden yarı mesajın durumunu sorgulamak üzere istek gönderir.
Bir işlemsel mesajın durumunu kontrol etmeye ilişkin adımlar aşağıda verilmiştir:
Üretici isteği aldıktan sonra yarı mesajla eşleşen yerel işlemin yürütme sonucunu kontrol eder.
Üretici, yerel işlemin yürütme sonucuna göre ApsaraMQ for RocketMQ broker'ına başka bir ACK gönderir. Ardından broker, yarı mesajı 4. Adım'da açıklandığı şekilde işler.
Kullanım notları
Mesaj gönderme kuralları
-
Üretici bir mesajı broker'a gönderip yerel işlemi yürüttüğünde
executeyöntemi aşağıdaki durumlardan birini döndürür:TransactionStatus.CommitTransaction: İşlem onaylanır. Tüketici mesajı tüketebilir.TransactionStatus.RollbackTransaction: İşlem geri alınır. Mesaj atılır ve tüketilemez.TransactionStatus.Unknow: İşlem bilinmeyen bir durumdadır. Belirli bir süre sonra ApsaraMQ for RocketMQ broker'ı mesaj durumunu kontrol etmek için bir istek gönderir.
ONSFactory.createTransactionProducerçağrısıyla işlemsel mesajlar için bir üretici oluştururkenLocalTransactionCheckeryönteminin uygulama sınıfını belirtmeniz gerekir. Bu sayede istisnalar oluştuğunda broker işlemsel mesajların durumunu kontrol edebilir.-
Mesaj durumunu kontrol etme kuralları: Yerel işlem yürütüldükten sonra ApsaraMQ for RocketMQ broker'ı yürütme sonucunun
TransactionStatus.Unknowolduğunu belirten bir ACK alır veya üretici beklenmedik şekilde çıkar ve yerel işlemin yürütme sonucunu iletmez. Bu durumda ApsaraMQ for RocketMQ broker'ı yerel işlemin yürütme sonucunu kontrol etmesi için üreticiye istek gönderir. Broker sonucu alamazsa isteği belirtilen aralıklarla tekrar gönderir.Kontrol aralığı: Broker varsayılan olarak 12 saat boyunca her 30 saniyede bir yarı mesajın durumunu kontrol etmek için istek gönderir.
-
Yeni alınan bir yarı mesajın durumunun kontrol edilmesinden önceki bekleme süresi: Bu parametre kullanıcı tarafından tanımlanır. Broker periyodik mesaj durumu kontrolünü başlatması gerektiğinde ancak yeni alınan yarı mesajın durumunun kontrolünden önceki bekleme süresi henüz dolmadıysa broker mesajın durumunu kontrol etmez.
Aşağıdaki örnekte Java kullanılmaktadır. Ayar, yeni alınan bir yarı mesajın durumunun kontrol edilmesinden önceki bekleme süresinin 60 saniye olduğunu gösterir.
Message message = new Message(); message.putUserProperties(PropertyKeyConst.CheckImmunityTimeInSeconds,"60");NotAncak yeni alınan mesajın durumunun kontrol edilmesine kadar geçen gerçek süre, beklenen süreden 0 ila 30 saniye daha geç olabilir. Bunun nedeni broker'ın mesaj durumunu varsayılan bir aralıkla kontrol etmesidir.
Örneğin yeni alınan bir mesajın durumunun kontrolünden önceki bekleme süresini 60 saniye olarak ayarlarsanız ancak broker yeni bir yarı mesaj alındıktan sonraki 58. saniyede periyodik kontrolü başlatırsa mesaj kontrol edilmez. 30 saniye sonra broker yeni yarı mesaj alındıktan sonraki 88. saniyede başka bir periyodik kontrol başlatır. Bu durumda mesaj kontrol edilir. Mesajın kontrol edildiği zaman beklenen zamandan 28 saniye sonra gerçekleşir.
Mesaj tüketme kuralları
İşlemsel mesajlar diğer türdeki mesajlarla grup kimliklerini paylaşamaz. İşlemsel mesajların diğer türlerden farkı mesaj durumu kontrol mekanizması sunmalarıdır. ApsaraMQ for RocketMQ broker'ı mesaj üreticilerini grup kimliğine göre sorgulayabilir.
Örnek kod
Farklı programlama dillerinde işlemsel mesajları göndermek ve bunlara abone olmak için kullanılan örnek kodlar aşağıdaki konularda sunulmaktadır:
-
TCP
Java SDK İşlemsel mesajları gönderme ve alma
C/C++ SDK İşlemsel mesajları gönderme ve alma
.NET SDK İşlemsel mesajları gönderme ve alma
-
HTTP
Python SDK İşlemsel mesajları gönderme ve alma
Node.js SDK İşlemsel mesajları gönderme ve alma
Java SDK İşlemsel mesajları gönderme ve alma