2017-03-16 3 views
0

erzeugen Ich richte einen RabbitMQ-Server mit Docker wie unten. Konfigurieren Sie dann den Sellerie, um ihn als Makler zu verwenden.warum rabbitmq viele Idx-Datei in der Warteschlange Verzeichnis

rabbit: 
     hostname: rabbit 
     image: rabbitmq:latest 
     environment: 
      - RABBITMQ_DEFAULT_USER=admin 
      - RABBITMQ_DEFAULT_PASS=mypass 
     ports: 
      - "5673:5672" 

worker: 
     build: 
      context: . 
      dockerfile: dockerfile 
     volumes: 
      - .:/app 
     links: 
      - rabbit 
     depends_on: 
      - rabbit 

Und die Sellerie-Konfiguration ist:

from __future__ import absolute_import 
from celery import Celery 
app = Celery('test_celery',broker='amqp://admin:[email protected]:5673',backend='rpc://',include=['test_celery.tasks']) 

Run_tasks Code:

from .tasks import longtime_add 
import time 
if __name__ == '__main__': 
    url = ['http://example1.com' , 'http://example2.com' , 'http://example3.com' , 'http://example4.com' , 'http://example5.com' , 'http://example6.com' , 'http://example7.com' , 'http://example8.com'] # change them to your ur list. 
    for i in url: 
     result = longtime_add.delay(i) 
     print 'Task result:',result.result 

Aufgaben Code

from __future__ import absolute_import 
from test_celery.celery import app 
import time,requests 
from pymongo import MongoClient 
client = MongoClient('10.1.1.234', 27018) # change the ip and port to your mongo database's 
db = client.mongodb_test 
collection = db.celery_test 
post = db.test 
@app.task(bind=True,default_retry_delay=10) # set a retry delay, 10 equal to 10s 
def longtime_add(self,i): 
    try: 
     r = requests.get(i) 
     if some conditions happend: 
      longtime_add.delay(i) 
     elif some other conditions happened: 
      post.insert({'status':r.status_code,"creat_time":time.time()})    
    except Exception as exc: 
     raise self.retry(exc=exc) 

Der run_taks Code eine Liste von URL generieren und senden sie dann zu RabbitMQ Aufgaben werden sie konsumieren und prüfen, ob bestimmte Bedingungen erfüllt sind oder nicht, falls dies passiert, senden Sie das Ergebnis erneut an Rabbtmq, andernfalls speichern Sie die Daten in der Datenbank.

Die Frage hier. Wenn Tasks für eine lange Zeit laufen, 24 Stunden oder sogar lange, werden viele IDX-Dateien im Verzeichnis "mnesia/rabbit @ rabbit/queues" von RabbitMQ erzeugt. Die Gesamtgröße beträgt 40G.

Also die Frage hier, wie man diese große Datei automatisch erzeugt oder in einer kleinen Größe halten?

Antwort

0

.idx-Dateien sind Warteschlangen-Indexsegmente. Lassen Sie Ihre Apps in Warteschlange eingereihte Nachrichten und acknowledge them, dann werden Warteschlangenindizes aktualisiert und ihre Segmentdateien gelöscht, wenn sie nicht mehr benötigt werden.

Sie können natürlich auch Warteschlangen löschen oder löschen.

+0

Die Funktion, die ich oben verwendet habe, ist die richtige Art, Aufgaben zu konsumieren? Oder wie korrigiere ich den Code? –

+0

Siehe http://www.rabbitmq.com/getstarted.html und http://www.rabbitmq.com/tutorials/amqp-concepts.html, wenn der Unterschied nicht klar ist. Ich vermute, dass es einen Sellerie-Arbeiter gibt, der Nachrichten in die Warteschleife stellt, aber nie konsumiert wird. Es sollte ziemlich einfach in der Verwaltungsoberfläche zu sehen sein. –

Verwandte Themen