2017-02-28 7 views
1

Ich habe einige Dokumente, die ich von mongodb holen und auf Memcache setzen muss. Hier ist der CodeVerbindung zurückgesetzt von Peer pymongo

import memcache 
from pymongo import MongoClient 

db = mongo_client.job_db.JobParsedData 
jobs = db.find().sort("JobId", 1) 

def set_to_memcache_raw(jobs): 
    print("Setting raw message to memcache") 
    count = 0 
    for item in jobs: 
     job_id = item.get('JobId') 
     job_details = item.get('JobDetails') 
     if job_id.strip(): 
      count += 1 
      memcache_obj.set(job_id, job_details, time=72000) 
      if count % 1000 == 0: 
       print("Inserted {} keys in memcache".format(count)) 
      if count >= 1000000: 
       break 

Aber nach einiger ungerade Anzahl von Iterationen der Code throw dieser Fehler -

Traceback (most recent call last): 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 450, in receive_message 
    self.sock, operation, request_id, self.max_message_size) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/network.py", line 137, in receive_message 
    header = _receive_data_on_socket(sock, 16) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/network.py", line 164, in _receive_data_on_socket 
    chunk = sock.recv(length) 
ConnectionResetError: [Errno 104] Connection reset by peer 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "memcache-poc.py", line 56, in <module> 
    elapsed = time.time() - t0 
    File "memcache-poc.py", line 52, in main 
    jobs = db.find(query) 
    File "memcache-poc.py", line 17, in set_to_memcache_raw 
    print("Setting raw message to memcache") 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/cursor.py", line 1114, in next 
    if len(self.__data) or self._refresh(): 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/cursor.py", line 1056, in _refresh 
    self.__max_await_time_ms)) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/cursor.py", line 873, in __send_message 
    **kwargs) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/mongo_client.py", line 905, in _send_message_with_response 
    exhaust) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/mongo_client.py", line 916, in _reset_on_error 
    return func(*args, **kwargs) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/server.py", line 136, in send_message_with_response 
    response_data = sock_info.receive_message(1, request_id) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 452, in receive_message 
    self._raise_connection_failure(error) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 550, in _raise_connection_failure 
    _raise_connection_failure(self.address, error) 
    File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 211, in _raise_connection_failure 
    raise AutoReconnect(msg) 
pymongo.errors.AutoReconnect: xxx.xxx.xxx.xxx:27017: [Errno 104] Connection reset by peer 

Ich habe durch Links gegangen wie

pymongo-errors

mongodb-TCP keep-alive

why-does-pymongo-throw-autoreconnect

Sie ist keine Frage der Steckdose Inaktivität in dem obigen Code als meine Jobs Objekt ist ein Iterator und jedes Mal, next() auf diesem Objekt aufgerufen wird, wird das nächste Dokument (von Mongo selbst)

Ich holt habe mongodb in der Azure-Cloud installiert und mein TCP-Status für die Instanz ist 7200 Sekunden lang am Leben. Ich erhalte diese Figur durch diesen Befehl Brennen

sysctl net.ipv4.tcp_keepalive_time 
7200 

Do einen Versuch cacth Block über die for-Schleife in diesem Fall hilft

+0

Es tut nicht weh, sich selbst zu versuchen, als zu fragen. – Saleem

+0

können Sie schreiben, bei welcher genauen Zeile Sie die Ausnahme erhalten? und wenn Sie mehrere Elemente in jeder Schleife einfügen, warum erstellen Sie nicht eine Liste von Elementen einfügen und sie versuchen, sie auf einmal einfügen (das ist nicht im Zusammenhang mit oben genannten Fehler, nur ein Vorschlag) – Darpan

+0

Der Code wirft Ausnahme bei "für Artikel in Jobs:" Zeile. Auch Memcache unterstützt nicht das Setzen mehrerer Schlüssel gleichzeitig, also muss ich in jedem Loop einen Eintrag in Memcache schreiben. –

Antwort

3

Nach den Informationen unten für die Ausgabe aus dem pymongo api Dokument here, die Ausnahme müssen manuell behandelt werden.

exception pymongo.errors.AutoReconnect(message='', errors=None)

ausgelöst, wenn eine Verbindung zur Datenbank und ein Versuch, Auto-Wiederaufnahme verloren gemacht werden.

Um eine automatische Wiederverbindung zu ermöglichen, müssen Sie diese Ausnahme behandeln und erkennen, dass die Operation, die sie verursacht hat, nicht unbedingt erfolgreich war. Zukünftige Operationen werden versuchen, eine neue Verbindung zur Datenbank zu öffnen (und wird diese Ausnahme fortsetzen, bis die erste erfolgreiche Verbindung hergestellt ist).

Ich suchte einige bestehende Lösung für das Problem, siehe unten.

  1. Ein Code-Schnipsel aus here für graziös die AutoReconnect Ausnahme PyMongo Handhabung.
  2. Verwenden Sie eine Middleware namens MongoDBProxy, um automatisch AutoReconnect Ausnahme behandelt.

Ich hoffe, es hilft.

Verwandte Themen