Burada benzer sorular olduğunu biliyorum ama işlemlere ihtiyacım olursa ya da atomik işlemler veya iki fazlı taahhüt kullanıyorsam normal RDBMS sistemlerine geri dönmemi söylüyorlar . İkinci çözüm en iyi seçim gibi görünüyor. Üçüncüsünü takip etmek istemiyorum çünkü birçok şey yanlış gidebilir ve her açıdan test edemiyorum. Atomik işlemler yapmak için projemi yeniden düzenlerken zorlanıyorum. Bunun sınırlı bakış açımdan gelip gelmediğini bilmiyorum (şimdiye kadar sadece SQL veritabanlarıyla çalıştım) veya gerçekten yapılamıyor mu.
Şirketimizde MongoDB'yi test etmek istiyoruz. Nispeten basit bir proje seçtik - bir SMS geçidi. Yazılımımızın hücresel şebekeye SMS mesajları göndermesine izin verir ve ağ geçidi kirli işi yapar: aslında farklı iletişim protokolleri aracılığıyla sağlayıcılarla iletişim kurmak. Ağ geçidi ayrıca mesajların faturalandırılmasını yönetir. Hizmete başvuran her müşteri bir miktar kredi almak zorundadır. Bir mesaj gönderildiğinde sistem kullanıcının bakiyesini otomatik olarak azaltır ve bakiye yetersiz olduğunda erişimi reddeder. Ayrıca üçüncü taraf SMS sağlayıcılarının müşterileri olduğumuz için, onlarla kendi dengelerimiz de olabilir. Bunları da takip etmeliyiz.
Bazı karmaşıklığı (harici faturalandırma, sıraya alınmış SMS gönderme) kesersem, gerekli verileri MongoDB ile nasıl saklayabileceğimi düşünmeye başladım. SQL dünyasından, kullanıcılar için ayrı bir tablo, SMS mesajları için başka bir tablo ve kullanıcıların dengesi ile ilgili işlemleri saklamak için bir tablo oluşturacağım. Diyelim ki MongoDB'deki herkes için ayrı koleksiyonlar oluşturuyorum.
Bu basitleştirilmiş sistemde aşağıdaki adımlarla bir SMS gönderme görevi düşünün:
kullanıcının dengesinin yeterli olup olmadığını kontrol edin; yeterli kredi yoksa erişimi reddet
mesajı SMS koleksiyonuna ayrıntılar ve maliyetle birlikte gönderip saklayın (canlı sistemde mesajın bir
status
niteliği olacaktır ve bir görev teslim için alıp SMS'in mevcut durumuna göre ayarlayacaktır)kullanıcıların bakiyesini gönderilen mesajın maliyetine göre azaltmak
işlemi işlem koleksiyonuna kaydet
Şimdi bunun sorunu ne? MongoDB atom güncellemelerini sadece bir belgede yapabilir. Önceki akışta, bir tür hatanın içeri girmesi ve mesajın veritabanında depolanması, ancak kullanıcının bakiyesi güncellenmemesi ve / veya işlem günlüğe kaydedilmemesi olabilir.
İki fikir buldum:
Kullanıcılar için tek bir koleksiyon oluşturun ve bakiyeyi alan olarak, kullanıcıyla ilgili işlemleri ve mesajları kullanıcının belgesinde alt belgeler olarak saklayın. Belgeleri atomik olarak güncelleyebildiğimiz için bu işlem sorununu çözer. Dezavantajları: kullanıcı çok sayıda SMS mesajı gönderirse, dokümanın boyutu büyüyebilir ve 4 MB doküman sınırına ulaşılabilir. Belki böyle senaryolarda tarih belgeleri oluşturabilirim, ama bunun iyi bir fikir olacağını düşünmüyorum. Aynı büyük belgeye giderek daha fazla veri aktarırsam sistemin ne kadar hızlı olacağını da bilmiyorum.
Kullanıcılar için bir işlem ve işlemler için bir koleksiyon oluşturun. İki tür işlem olabilir: pozitif bakiye değişikliği ile kredi alımı ve negatif bakiye değişikliği ile gönderilen mesajlar . İşlemin bir alt belgesi olabilir; örneğin gönderilen mesajlarda SMS'in detayları işleme dahil edilebilir. Dezavantajları: Geçerli kullanıcı bakiyesini saklamıyorum, bu yüzden bir kullanıcı mesajın geçip geçemeyeceğini söylemek için her mesaj göndermeye çalıştığında hesaplamam gerekiyor. Korkarım depolanan işlemlerin sayısı arttıkça bu hesaplama yavaşlayabilir.
Hangi yöntemi seçeceğime biraz kafam karıştı. Başka çözümler var mı? Bu tür sorunların nasıl çözüleceğine dair çevrimiçi olarak en iyi uygulamaları bulamadım. Sanırım NoSQL dünyasına aşina olmaya çalışan birçok programcı başlangıçta benzer sorunlarla karşılaşıyor.