为什么 rabbitmq 在队列目录中生成大量 idx 文件

why rabbitmq generate lots of idx file in queue directory

我使用 docker 设置了一个 RabbitMQ 服务器,如下所示。然后配置芹菜以将其用作代理。

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

而芹菜配置是:

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

Run_tasks代码:

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

任务代码

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)

run_taks 代码会生成一个 url 的列表并将它们发送到 RabbitMQ,然后任务将使用它们,并检查某些条件是否发生,如果发生再次将结果发送给 Rabbtmq ,否则将数据存入数据库。

这里的问题。当任务运行长时间,24小时甚至更长时间时,RabbitMQ会在目录"mnesia/rabbit@rabbit/queues"中生成大量的idx文件。总大小为40G。

那么这里的问题是,如何停止自动生成这些大文件或保持较小的文件大小?

.idx 文件是队列索引段。让您的应用程序使用排队的消息和 acknowledge them,然后将更新队列索引并在不再需要时删除它们的段文件。

当然,您也可以清除或删除队列。