SORU
29 Mayıs 2009, Cuma


Belleği geri Toplama

JSON belge koleksiyonları için doğrudan bir DİNLENME arayüzü (CouchDB Persevere sanırım) açığa ilgileniyorum. Koleksiyonu GET işlemleri nasıl girdiğimi sorun olursa koleksiyonu büyükse kök.

Örnek olarak sayıyorum açığa StackOverflow Questions tablo her satır maruz bir belge yok ki, ille de böyle bir tablo, sadece bir somut örnek oldukça büyük bir koleksiyon 'belge'). Koleksiyon /db/questions boş*, PUT /db/questions/XXX, GET /db/questions/XXX5* apı oyuna her zamanki CRUD. Standart yol almak için tüm koleksiyon için GET /db/questions ama eğer bu safça döker her satır gibi bir JSON nesne, bir yerine büyükçe indir ve bir sürü iş bir parçası olarak, sunucu.

Çözüm, tabii ki, çağırıyor. Dojo JsonRestStore özel bir aralığı ile Range Başlığı kullanarak RFC2616-uyumlu akıllı bir uzantısı ile kendi biriminde bu sorunu çözmüştür items. Sonuç sadece istenen dizi döndürür 206 Partial Content. Sorgu parametresi üzerinden bu yaklaşımın avantajı...sorguları (örneğin GET /db/questions/?score>200 veya somesuch evet, o > kodlanmış olur) sorgu dizesi bırakır.

Bu yaklaşım tamamen istiyorum davranışı kapsar. Sorun RFC 2616 206 yanıt (vurgu benim) olduğunu belirtir

istekAralık başlık alanını (section 14.35)dahil OLMALI istediğiniz aralığı gösteren, ve Eğer Menzilli bir eklemiş OLABİLİR istek koşullu yapmak için başlık alanı (section 14.27).

Bu başlığı standart kullanımı bağlamında mantıklı ama 206 yanıtı varsayılan saf müşterileri idare etmek/rastgele insanlar keşfetmek olmak istiyorum, çünkü bu bir sorun değildir.

Ayrıntılı RFC bir çözüm arıyorsanız bir göz attım ama benim çözümlerle mutsuz ediyor ve sorun almak ilgileniyorum.

Yaşadım fikirler:

  • Content-Range başlık 200 dönüş!- Bunun yanlış olduğunu sanmıyorum, ama yanıt sadece Kısmi bir İçeriği olduğunu daha belirgin bir göstergesi tercih ederim.
  • 400 Range Required dönüş- Gerekli başlıkları için 400 yanıt özel bir kod yok, varsayılan hata ve elle kullanılan bir okuma olmalı. Bu da web tarayıcı (veya Resty gibi diğer bazı istemci) arama daha zor hale getirir.
  • Sorgu parametresi kullanın- Standart yaklaşım, ama sorgu ad la bir Sebat ve bu kesim sorgulara izin vermek için umuyorum.
  • Sadece 206 dönüş!- Müşterilerin çoğu panik yapmayacak sanırım, daha ziyade RFC GEREKEN bir karşı çıkmak istemiyorum
  • Spec uzatın! 266 Partial Content dönüş- Tam olarak 206 gibi davranır ama Range Başlığı içermelidir OLMAYAN bir istek. 266 çarpışma sorunları çalıştırmak yapmamam gereken ve bana mantıklı geliyor ama bu tabu olarak kabul edilip edilmediğini anlamış değilim ya da değil yeterince yüksek olduğunu düşünüyorum.

Bu oldukça yaygın bir sorun olduğunu düşünürdüm ve bu fiili moda bir tür öyle yaptım görmek istiyorum ya da bir başkası tekerleği yeniden icat değil.

Koleksiyonunun büyük olduğunda HTTP üzerinden tam bir koleksiyonu sergilemek için en iyi yol nedir?

CEVAP
23 HAZİRAN 2009, Salı


Gerçekten bazı çocuklar ile aynı fikirde değilim. GERİSİ benim hizmet için bu özellikleri için haftalardır çalışıyorum. İşini bitiren gerçekten çok basittir. Benim çözüm sadece ne DİNLENMEK için insanlar topluluğu Ara mantıklı.

İstemci GEREKİR vardır bir "Aralık" Başlığı belirtmek için hangi bölümü koleksiyonu ihtiyacı var, veya başka bir şekilde hazır olmak için bir tanıtıcı 413 İSTENEN VARLIĞI ÇOK BÜYÜK hata ne zaman talep toplama çok büyük olduğu için alınan tek bir gidiş-dönüş.

Server 206 KISMİ bir yanıt İÇERİĞİ, İçerik Menzilli başlık gönderilen ve koleksiyon geçerli sürümünü belirlemek için ETag Başlığı belirtme ile gönderir. Ben genellikle Facebook gibi bir ETag {last_modification_timestamp}-{resource_id} kullanmak, ve bir koleksiyon ETag en son değiştirilen kaynağın içerdiği diye düşünüyorum.

Talep, belirli bir kısmını koleksiyonu, istemci GEREKİR "Aralık" başlığı ve dolgu "-Maç" başlığı ile ETag toplama elde daha önce gerçekleştirilen isteklerini elde diğer parçalar aynı koleksiyon. Sunucu bu nedenle koleksiyonu istenen kısmını göndermeden önce değişmedi doğrulayabilir. Eğer daha yeni bir sürüm varsa, 412 ÖNKOŞUL BAŞARISIZ oldu yanıt istemci sıfırdan koleksiyonu almak için davet döndü. Bu bazı kaynaklar ya da önce eklendi kaldırılmış olabileceğini ya da şu anda bir kısmı talep edince anlamına gelebilir, çünkü bu gereklidir.

-Değişmemiş-Eğer bu Yana önbellek optimize etmek için ETag/Maç Son Değişiklik ile tandem/kullanıyorum. Tarayıcılar ve vekiller kendi önbelleğe alma algoritmaları için bunlardan biri veya her ikisi güveniyor olabilir.

Bir URL arama/filtre bir sorgu dahil olmadığı sürece temiz olması gerektiğini düşünüyorum. Eğer bu konuda düşünüyorsanız, bir arama bir koleksiyon kısmi bir görünümü başka bir şey değildir. Arabalar yerine/arama?URL q=BMW türü, daha fazla araba görmeliyiz?üretici=BMW.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boniver

    boniver

    17 NİSAN 2006
  • Fullscreen

    Fullscreen

    23 Mart 2006
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006