Burada uygulama uyumsuzluğu için bir kullanıcı süreciniz olabileceğini düşünüyorum.
Birincisi: Bir kullanıcı dürüstçe bir dosyada aynı anda birden fazla değişiklik yapmak isteyecek mi? Yeniden adlandırma (yol değişikliği içerebilir veya içermeyebilir mi?), Sahiplik değişikliği ve belki de dosya içeriğinin değiştirilmesi (tartışma amacıyla) ayrı eylemler gibi görünür.
Cevabın "evet" olduğu durumu ele alalım - kullanıcılarınız bu değişiklikleri aynı anda yapmak istiyor.
- Bu durumda, şiddetle birden fazla etkinlik gönderir herhangi uygulanmasına karşı öneriyoruz RenameFileCommand
, MoveFileCommand
, ChangeOwnerCommand
bu temsil etmek - tek kullanıcı amacını.
Neden? Çünkü olaylar başarısız olabilir. Belki son derece nadirdir, ancak kullanıcı atomik görünen bir işlem sundu - aşağı akış olaylarından tek biri başarısız olursa, uygulama durumunuz şimdi geçersizdir.
Ayrıca, olay işleyicilerinin her biri arasında açıkça paylaşılan bir kaynak üzerindeki yarış tehlikelerini de davet ediyorsunuz. "ChangeOwnerCommand" komutunu, dosya adı ve dosya yolu önemli olmayacak şekilde yazmanız gerekir, çünkü komutun alındığı tarihe kadar güncel olmayabilirler.
Dosyaları taşıma ve yeniden adlandırma ile olay güdümlü dinlendirici bir sistem uygularken, eTag sistemi gibi bir şey kullanarak tutarlılığı sağlamayı tercih ediyorum - düzenlenen kaynağın sürümünün kullanıcının en son aldığı sürüm olduğundan emin olun ve eğer başarısız olursa o zamandan beri değiştirildi. Ancak bu tek kullanıcı işlemi için birden fazla komut gönderiyorsanız, her komuttan sonra kaynak sürümünüzü artırmanız gerekir; böylece kullanıcının düzenlediği kaynağın gerçekten son okuduğu kaynakla aynı sürüm olduğunu bilmenin hiçbir yolu yoktur .
Bununla ne demek istediğim - başka biri dosya üzerinde hemen hemen aynı anda başka bir işlem yaparsa. 6 komut herhangi bir sırada birikebilir. Sadece 2 atom komutumuz olsaydı, önceki komut başarılı olabilir ve sonraki komut başarısız olabilir "kaynak son alındığı zamandan beri değiştirildi". Ancak komutlar atomik olmadığında buna karşı bir koruma yoktur, bu nedenle sistem tutarlılığı ihlal edilir.
İlginçtir ki, REST'te , Thoughtworks teknoloji radarı, Ocak 2015'te önerilen " PUT'sız Dinlenme" adlı olay tabanlı mimari gibi bir şeye doğru bir hareket var . Burada PUT olmadan Rest hakkında çok daha uzun bir blog var .
Temel olarak, fikir POST, PUT, DELETE ve GET'in küçük uygulamalar için iyi olduğu, ancak koy ve gönder ve silme işleminin diğer uçta nasıl yorumlanabileceğini varsaymaya başlamanız gerektiğinde, bağlantıyı tanıtırsınız. (örneğin "banka hesabımla ilişkili kaynağı Sildiğimde, hesap kapatılmalıdır") Ve önerilen çözüm, REST'e daha fazla Olay kaynaklı bir şekilde davranmaktır. ie Kullanıcının tek bir olay kaynağı olarak POST yapmasını sağlar.
Diğer durum daha basit. Kullanıcılarınız tüm bu işlemleri aynı anda yapmak istemiyorsa, onlara izin vermeyin. Her kullanıcının amacı için bir etkinlik GÖNDERİN. Artık kaynaklarınızda etag sürüm oluşturmayı kullanabilirsiniz.
Kaynaklarınız için çok farklı bir API kullanan diğer uygulamalara gelince. Bu bela gibi kokuyor. RESTful API'nizin üzerine eski API'nin bir cephesini yapıp cepheye yönlendirebilir misiniz? örn., REST sunucusu üzerinden bir dosyaya birden çok güncelleme gerçekleştiren bir hizmeti ifşa etmek?
RESTful arayüzünü eski çözümün üzerine veya eski arayüzün REST çözümünün üzerine kurmazsanız ve her iki API'yi paylaşılan bir veri kaynağına işaret etmeye devam ederseniz, büyük baş ağrıları yaşayacaksınız.