2017-06-09 28 views
10

3 üyeli bir MongoDB çoğaltma kümesi ve içinde verileri depolayan bir Python uygulaması var.Pymongo AutoReconnect istisnası insert_many yöntemi ile nasıl kullanılır

def safe_mongo_call(method, num_retries, *args, **kwargs): 
    while True: 
     try: 
      return method(*args, **kwargs) 
     except (pymongo.errors.AutoReconnect, 
       pymongo.errors.ServerSelectionTimeoutError) as e: 
      if num_retries > 0: 
       logger.debug('Retrying MongoDB operation: %s', str(e)) 
       num_retries -= 1 
      else: 
       raise 

Emin olsa toplu kullanarak yazdığında bu özel durumları nasıl işleneceğini, mesela değilim şu şekildedir: bir ambalaj kağıdı ile tek bir belge ekler kullanırken

Ben pymongo en AutoReconnect istisna işleyebilir insert_many yöntemi. documentation'a göre, toplu yazma işlemleri atomik değildir, bu nedenle istisnalardan biri oluşsa bile, veritabanına yazılan bazı belgeler zaten başarılı olabilir. Bu nedenle, sarmalayıcı yöntemini yukarıdaki gibi tekrar kullanamıyorum.

Bu durumların üstesinden gelmenin en iyi yolu nedir? Bu durum için

+0

İlgili: https : //gist.github.com/anthonywu/1696591 – TheChetan

+1

Sağladığınız kod, temelde söz konusu makalede yazdığımla aynı şeyi yapar. Kullanım durumum farklıdır ve belgelerin bir kısmı veritabanına yazılabildiği için yeniden denenemeyen toplu işlemleri içerir. –

cevap

3

test autoreconnect yerine gönderilir ve operasyon ilerleme bilgisi kaybolmuş gibi görünür https://api.mongodb.com/python/current/examples/bulk.html#ordered-bulk-write-operations

Ama bağlantı kaybı durumunda yapılmış ne hakkında ayrıntılı bilgi vermesi gerekir BulkWriteError (var pymongo == 3.5.1)

Her halükarda ne yazıldığını ve ne yapılmadığını yeniden yapılandırmanız ve kalan öğeler için işlemi yeniden denemeniz gerekir. bir Nesne Kimliği sürece atanan eklenecek her bir doküman: aslında yazılmış ne olup önceden bilgi ancak bir kroki çözüm olarak hala yapılabilir

yok gibi İkinci durumda biraz zor olurdu _id zaten hazır. Bunu kendiniz halledebilirsiniz - belgelerin üzerinde yineleyin, eksik olanlar için _id'u manuel olarak atayın ve kimlikleri geçici bir değişkene kaydedin. Bir istisnaya bastığınızda, son _id'u başarılı bir şekilde ekleyerek, en kötü ~ O (logN) sorgularına sahip olmak için ikili arama benzeri bir yaklaşımdan yararlanın ve belki de toplu işlemlerin daha küçük gruplar halinde bölünmesini sağlayın (https://api.mongodb.com/python/current/examples/bulk.html#bulk-insert). Ancak elbette bu yaklaşımın uygulanabilirliği, mongod örneklerinizde sahip olduğunuz yük profiline ve ek sorgulamaların kabul edilip edilemeyeceğine bağlıdır. BulkWriteError beklendiği gibi atıldıysa, eklenmeyen belgeleri yakalayıp yalnızca bu dokümanlar için işlemi yeniden deneyebilirsiniz. Geri autoreconnect sorununa

, ben şahsen Mongo-piton sürücüsü konular izleyicimizde bilet açsan, büyük ihtimalle yüksektir onun bir hata ya da bilerek böyle yapılıyor ya

+0

Tüm bunları kontrol ettim ama sorun şu ki, 'AutoReconnect' atılırsa, o zamana kadar ne yapıldığı hakkında bilgi eksik. Ne yazıldığını * nasıl yeniden yapılandıracağınızı * açıklayabilir misiniz? Çünkü o kadar kolay olmadığından, yazımların nereden gelebileceğinden çok sayıda yer olabilir ve ayrıca öğeler aynı semantik tuşlara sahip olabilir (çoğaltılamazlar). –

+0

Cevabımı Artırdı – ffeast

+0

Bir biletin açılması, en azından bu şekilde yapılmasının teknik nedenlerinin olup olmadığını öğrenmek için iyi bir yön olabilir. –