Ön uçta hesaplamalar yapmak ne zaman uygundur?


21

Ekibim WEB tabanlı bir finans uygulaması geliştiriyor ve bir meslektaşımla hesaplamaların nerede saklanacağına dair biraz tartışma vardı - sadece arka uçta mı yoksa bazılarını da ön uçta mı tutuyorsunuz?

Kısa açıklama: Ön uç için Java (ZK, Spring) ve arka uç için Progress 4gl kullanıyoruz. Bazı sert matematik ve veritabanından veri içeren hesaplamalar arka uçta tutulur, bu yüzden onlardan bahsetmiyorum. Kullanıcının X değerini girdiği durumdan bahsediyorum, daha sonra Y değerine eklenir (ekranda gösterilir) ve sonuç Z alanında gösterilir. Saf ve basit jQuery-ish işlemleri, yani.

Peki, burada en iyi uygulama hangisidir?

1) JavaScript ile arka uç ve arkaya gitmekten tasarruf eden değerler ekleyin ve daha sonra "kaydetme" sırasında arka uçtan doğrulayın?

2) Tüm iş mantığını aynı yerde tutun - bu nedenle değerleri arka uca getirin ve hesaplamaları orada yapın?

3) Ön uçtaki hesaplamaları yapın; ardından verileri arka uca gönderin, orada doğrulayın, hesaplamaları tekrar yapın ve yalnızca sonuçlar geçerli ve eşitse bunları kullanıcıya gösterin?

4) Başka bir şey mi?

Not: Java'da bazı temel doğrulama işlemleri yapıyoruz, ancak çoğu diğer iş mantığı gibi hala arka uçta.

Her şeyi bir arka uçta yeniden hesaplayarak gönderilecek verilerin artışı sorun olmaz (küçük XML boyutu; sunucular ve bant genişliği kullanıcılar tarafından yapılan işlemlerin artan miktarına dayanır).


1
Temel kural: kuvvetle yazılmış bir dil kullandığında.
Den

1
Tüm mantık arka uçtaysa Otomatik Birim Testi daha kolay olacaktır. % 90'ının arka uç olması ve% 10'unun arka uçta olması gerekiyorsa,% 100'ü arka uca koyardım.
Ian

3
@Ian: Kodunuzu iyi yapılandırırsanız ön uç kodları için otomatik birim testi de yapabilirsiniz.
Lie Ryan

1
Temel kural: Ne zaman ondan kurtulabilirsiniz.
goldilocks

3
Temel kural: Kullanıcının JavaScript'inizi hacklediğini ve kendi hesaplamalarını yaptığını varsayın. Güvenlik açısından, hesaplamalar arka uçta yapılmalıdır. Her ikisini de yapabilirsiniz: JS daha hızlı geri bildirim sağlayabilir, ancak gerçekte sayılan hesaplamalar sunucuda yapılır.

Yanıtlar:


36

Her zaman olduğu gibi, bu tür kararlar, bazıları birbiriyle çatışan farklı hedefler arasında bir denge içerir.

  • Verimlilik, hem kullanıcının bilgisayarında daha fazla güç kullandığından hem de sunucunuz daha az güç kullandığından ve kullanıcı daha hızlı geri bildirim gördüğünden, kullanıcı deneyimini geliştirdiği için ön uçta hesaplamalar yapmanızı önerir.

  • Güvenlik herhangi devlet değiştiren işlemleri istemektedir olamaz veri kontrol veya istemci bilgisayarda olarak hesaplanmakta istemci bilgisayar kötü amaçlı bir saldırganın kontrolü altında olabileceğinden, güveniyor. Bu nedenle, güvenilmeyen kaynakların sunucu tarafında gelen her şeyi doğrulamanız gerekir .

  • Programlama verimliliği ve sürdürülebilirliği, boşa harcanan çaba nedeniyle aynı hesaplamayı iki kez yapmamanız gerektiğini gösterir.

Yüzeysel olarak bu, her şeyin sunucu tarafında yapılması gerektiği gibi geliyor, ancak her zaman böyle değil. Çoğaltılan kodu kolayca koruyabiliyorsanız (örn. Sunucu tarafı Java doğrulayıcınızdan otomatik olarak bir javascript doğrulayıcısı oluşturarak), hesaplamayı tekrarlamak iyi bir çözüm olabilir. İlgili verilerin tümü önemsizse, örneğin kullanıcı değerleri manipüle ederse sizi değil, yalnızca kendilerini aldatabilirse, sunucu tarafı doğrulaması gerekli değildir. Senin tepki süresi tamamen farklı darboğazlar hakim ise o kadar gidiş-dönüş gecikmesi algılanabilir olmadığını, daha sonra UX hususlar dikkate zorunda nedenle vb belirleyici olmaz ne kadar güçlü bu baskıların her durumunuza olduğunu ve buna göre karar .


4
Bu Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.doğru değil eklemek istiyorum çünkü [1] Ön uçtaki doğrulama, gerekirse düzeltmeleri yapmak için kullanıcıya hızlı geri bildirim sağlayabilir. [2] Arka uçtaki doğrulama o kadar duyarlı değildir ve dolayısıyla kullanıcıya düzeltme yapmak için en iyi fırsatı sunmaz. Kullanıcının daha fazla iş beklemesi ve yeniden yapması gerekir. Bu yüzden iki onaylamanın tamamen aynı olmadığını düşünüyorum.
InformedA

9
Ben anlatmak istediğim bu değil - maintainability yapar "kendinizi tekrar etmeyin" olduğunu ima eder ve bu ilkeye göre tekrarlama kesinlikle kötü. Başka bir şey olmasaydı, bunu yapmamalısın. Orada çünkü yine genellikle iyi bir fikir olduğunu gerçektir olan hızlı geri dönüş yoluyla yani bu ilkeyi daha iyi kullanılabilirlik çelişen diğer hususlar.
Kilian Foth

@randomA Sunucuda doğrulanması gereken bir şeyin yalnızca sunucuda hesaplanması gerektiği anlamına gelirse, istemciye döndürülen "sunucu doğrulanmış değer" (veya buna bağlı herhangi bir şey) sunucuya geri gönderilen bir noktada, yine de doğrulamak zorundasınız - işe yaramaz. Ya da daha verimsiz olabilecek bazı güvenli referans sistemine ihtiyacınız vardır. İstemcide bir hesaplama yapabilir, istemcide yapabilirseniz , aynı zamanda müşterinin size söylediklerine asla güvenemezseniz söyleyebilirim .
goldilocks

@goldilocks Kalın harflerle söylediğiniz şey de aynı fikirde olduğum şeydir, arka uçtaki her şeyi doğrulamanız gerekir. Demek istediğim şuydu: ön uçtaki doğrulama daha duyarlı, yani arka uçtaki doğrulama ile tamamen aynı değil.
InformedA

13

Arka uçta hesaplamalar yapmak için güçlü nedenler var

  • İş mantığı sunum katmanına ait değil
  • JavaScript'teki iş mantığı bir tehdit oluşturuyor
  • Her zaman doğru olmayan bir ön uç -> bir arka uç ilişkisi olduğunu varsayıyorsunuz , arka uçların yetenekli veya birden fazla ön uç uygulamasına hizmet ettiği düşünülmelidir, bu nedenle hiçbir şey üstlenemezsiniz.
  • Hesaplamalar büyük miktarda veri kullanıyorsa, verileri ön uçta tutmak etkili olmaz
  • Hesaplamalar veritabanını kullanıyorsa, ön uçta çoğaltamazsınız

Benim önerim

  • Veritabanında yabancı anahtarlar, birincil anahtarlar, kontrol kısıtlamaları ve tetikleyiciler dahil olmak üzere modelde mümkün olduğunca fazla iş kuralının uygulanmasını sağlayın
  • İş kurallarına uyulmadığında iş katmanının istisnalar atmasını sağlayın (veritabanı bir hata döndürdüğü veya iş katmanının kendisi verileri doğruladığı için)
  • Yalnızca ve yanıt süresi kabul edilemezse, Ajax kullanarak doğrulama veya önişleme yapın (çalışma JavaScript'te gerçekten yapılmayacak, sayfayı yeniden yüklemek zorunda kalmadan arka uçta yapılacaktır)
  • JavaScript'te boş bir değere veya çok uzun veya aralık dışı değerlere izin vermemek gibi basit doğrulama yapabilirsiniz (ikincisi için arka uçtaki aralıkları oluşturmak isteyebilirsiniz)

2
Veritabanının iş kurallarını uygulamasına ilişkin sorun, ihlalleri ön uçlara bildirmektir! Kullanıcı arabirimi iş kurallarını uygularsa, kullanıcıya anlamlı hata mesajlarını hızla geri bildirebilir. Arka uç bunu yaparsa, hatalar birer birer bildirildiği için ön ve arka uçlar arasında çok fazla iki yönlü trafik vardır.
James Anderson

@JamesAnderson Artık "ön uç" yok. Aynı veritabanına birkaç ön uç veya birkaç ön uca birkaç veritabanı olabilir. Ayrıca, arka uç iş kurallarını uygulamak, ön uçun bunu yapmasının yasak olduğu anlamına gelmez. Bunu ikinci mermi noktasında vurguladım.
Tulains Córdova
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.