2016-07-29 32 views
1

Ich schreibe eine E-Commerce-Plug-in-App in Python/Django, die in Shopify-Filialen integriert ist. Immer wenn ein Kunde für ein Geschäft zur Kasse kommt, sendet Shopify eine Anfrage an meine App mit Warenkorb- und Zieladressdaten, und meine App muss mit Versandpreisinformationen antworten. Das Problem ist, dass ich einen externen API-Aufruf zwischen ihnen machen muss, der mir die Anfrage schickt und ihnen die Antwort schickt, und meine WSGI-Mitarbeiter werden unter mäßiger Last sehr leicht befüllt.Einstellung von Django WSGI-Mitarbeitern mit langer externer API-Antwort

Ich versuche unnötige Skalierung zu vermeiden. Sollte ich einfach meine Anzahl von Arbeitern nach der empfohlenen cores * 2 + 1 erhöhen? Überwache ich einfach die CPU-Last, um diese Zahl anzupassen? Was ist die ideale CPU-Last, nach der ich suchen sollte? Da ich auch kurze nicht gesperrte Anfragen von der gleichen App aus übergebe, wird dies zu Problemen führen?

Ist Django für diese Art von Anwendungsfall einfach nicht geeignet? Wenn ja, was ist eine gute Übereinstimmung, und was wäre der beste Weg, um es anzuwenden, ohne meine gesamte App neu zu schreiben?

EDIT: Mein WSGI Server ist Gunicorn

+0

Welche Art von "Arbeitern" verwenden Sie? Was wsgi Server ist das? –

+0

Gunicorn, aktualisierte Frage. – Julien

Antwort

1

Es gibt ein paar Dinge, die Sie tun können, um die Leistung von gunicorn hier zu verbessern. Angesichts Ihres Designs ist es fast sicher, dass Ihre Mitarbeiter IO-gebunden sind. Für einen Anfang könnten Sie sie so konfigurieren, dass sie mehrere Threads pro Worker verwenden. Die Dokumente schlagen 2-4 vor.

Aufgrund der IO-gebundenen Natur Ihrer Site scheint es jedoch wahrscheinlich, dass Sie mit einem der asynchronen Arbeitertypen noch bessere Verbesserungen erhalten. Details siehe: the design docs: Ich glaube nicht, dass zwischen Gevent und Eventlet viel zu wählen ist, persönlich hatte ich gute Ergebnisse von Ersterem.

+1

Seien Sie sich bewusst, dass die Verwendung von gevent oder eventlet eine noch schlimmere Situation verursachen kann, wenn Sie nicht verstehen, wie sie funktioniert. Die Dinge werden die Dinge nicht durch einfaches Umschalten verbessern. Sie müssen sicherstellen, dass Sie keine Module verwenden, die blockiert werden und die nicht von gevent oder eventlet gepatcht werden, damit sie ordnungsgemäß funktionieren. Habe alles, was blockiert und ist nicht Greenleet bewusst, und dein gesamter Prozess wird hängen bleiben und alle Nebenwirkungsvorteile verlieren. Immer sicherer Multithreading zu verwenden. –