django üzerinde multitenant uygulama için optimum mimarlık
Multitenancy bir uygulama oluşturmak için doğru/uygun şekilde üzerine titremek oldum Django üzerinde.
Bunun bir açıklaması:
Uygulama birkaç kiracı (tenant1, tenant2, ...,) tarafından kullanılabilir.
Tüm bireysel kiracı veri diğer kiracıların erişim (ve kullanıcılarının) karşı güvenli olmalı.
İsteğe bağlı olarak kiracı uygulama nesneleri için özel ek alanlar oluşturabilir.
Tabii ki, bir kiracı temel donanım Limitleri numarası "sistem".
1) alt-etki alanı (örn kiracı özgü kullanarak her kiracı Ayıran temel tabakası veritabanları
2) bazı Kullanarak KİMLİK kiracı modeli veritabanında kiracı-veri ayırmak için
Dağıtım süreçleri, sistem-parçalar performans düşünüyorum (web sunucusu, veritabanı sunucusu(ler), düğümlü bir çalışma(s),...)
En iyi Kur ne olurdu ? Burada yanlısı ve con değil mi?
Ne düşünüyorsun?
CEVAP
8 ** Bir multitenancy aşağıdaki mimarisi kullanılarak inşa. Bazı yararlı ipuçları bulabilirsiniz umarım.
- Her kiracı alt etki alanı (t1.example.com alır
- Django kullanarak url uygulama istekleri yeniden yazmak example.com/t1 gibi bir şeyler yazılmış
- Tüm url tanımlar
(r'^(?P<tenant_id>[\w\-] )
gibi bir şey ile öneki - middleware ve tenant_id süreçleri tüketir ve isteği (örneğin istek ekler.kiracı = 't1')
- Şimdi mevcut kiracı tenant_id argüman her görünüm belirtmeden her görünümünde kullanılabilir
- Bazı durumlarda isteği mevcut yok. Geçerli iş parçacığı (current language
threading.local
kullanmaya benzer) tenant_id bağlayarak bu sorunu çözdüm - Dekoratörler (e.oluşturmak bir kiracı farkında)
login_required
g, middlewares veya görüş korumak ve doğru modelleri seçmek için fabrikalar - Veritabanları ile ilgili iki farklı senaryo kullandım:
- Kur birden çok veritabanı ve yapılandırma mevcut kiracı göre routing. Bu ilk kullandım ama yaklaşık bir yıl sonra bir veritabanı geçti. Nedenleri şunlardı:
- Verileri ayırmak için yüksek güvenlikli bir çözüme ihtiyacımız yoktu
- Farklı kiracılar hemen hemen hepsi aynı model kullanılmış
- Veritabanları (ve kolay güncelleme/geçiş süreci inşa etmedi) bir sürü yönetmek zorunda kaldık
- Yani kullanıcılar için bazı basit eşleme tabloları ve farklı modelleri ile bir veritabanı kullanın. Ek ve kiracı belirli model alanlar eklemek model inheritance kullanıyoruz.
- Kur birden çok veritabanı ve yapılandırma mevcut kiracı göre routing. Bu ilk kullandım ama yaklaşık bir yıl sonra bir veritabanı geçti. Nedenleri şunlardı:
Çevre ile ilgili aşağıdaki ayarları kullanıyoruz:
Benim açımdan bu Kur takip pro ve con:
Pro:
- Bir uygulama örneği mevcut kiracı bilerek
- Projenin büyük bir bölümü kiracı belirli sorunları ile rahatsız etmek yok
- Tüm kiracılar arasındaki paylaşım varlıklar için kolay bir çözüm (örneğin mesajlar)
Contra:
- Oldukça büyük bir veritabanı
- Çok benzer bazı tablolar model mirası sayesinde
- Veritabanı katmanında güvenli değil
Tabii en iyi mimari şiddetle kiracı sayısı, modelleri delta, güvenlik gereksinimleri ve gereksinimlerinize bağlıdır.
Güncelleme: Yapımızı gözden geçirdik, öneririmdeğilnokta 2-3 de belirttiği gibi, URL yeniden yazma. Daha iyi bir çözüm İsteği tenant_id
Başlık koymak ve (4) tenant_id
isteği dışında request.META.get('TENANT_ID', None)
gibi bir şey ayıklamak için olduğunu düşünüyorum. Bu şekilde tarafsız bir URL almak ve çok daha kolay Django-dahili fonksiyonlar (örneğin {% url ...%}
reverse()
) veya harici uygulamaları kullanmak için.
Benim C sunucusunun IP adresini almak ...
Nasıl Linux üzerinde başka bir uygulam...
Nasıl yabancı anahtarlar için destek e...
Nasıl birden fazla dosya üzerinde djan...
NameError: global name 'execfile&...