当我在Celery中向数据库插入数据时,会遗漏一些数据

时间:2017-09-22 14:17:30

标签: mysql sqlalchemy rabbitmq celery

我用RabbitMQ + Celery + flask + sqlalchemy ORM插入数据。 芹菜工人在两台服务器上共计16个。 数据量约为一百万。

如果数据一个接一个地排队到MQ并从Celery一个接一个地插入, 一切都好。 所有数据都插入良好。

但是当我尝试在芹菜中使用forloop批量插入一些大小(大约5000,1000等)时,会遗漏一些数据。 我写了很多日志,但我找不到任何错误或特殊的东西。 (如果数据的数量是100,000而不是100万,也可以)

简单的逻辑是......

tasks.py

@celery.task(bind=True, acks_late=False, ignore_result=True, max_retries=None)
def insert_data(self):
    logger.info("START")
    InsertData(somedata..)
    logger.info("END")

@celery.task(bind=True, acks_late=False, ignore_result=True, max_retries=None)
def insert_data_bulk(self):
    logger.info("START")
    for i in range(5000):
        InsertData(somedata..)
    logger.info("END")

def InsertData(data):
    logger.info("Insert START")
    # my_db_engine's option : {'echo': True, 'pool_recycle': 3600, 'pool_size': 10, 'pool_reset_on_return': 'commit', 'isolation_level': 'AUTOCOMMIT'}

    ss = scoped_session(sessionmaker(autocommit=False, autoflush=False,
                                       bind=my_db_engine))
    t = mymodel(**data)
    ss.add(t)
    ss.commit()
    logger.info("Insert END")

test.py

for i in range(1000000):
    insert_data_one.apply_async() # make one million messages for MQ

for i in range(200):
    insert_data_bulk.apply_async() # make 200 message for MQ

insert_data_one表现良好。

  

log is ..

     
    
        
  1. START
  2.     
  3. 插入START
  4.     
  5. 插入END
  6.     
  7. END
  8.        

但是insert_data_bulk会随机删除一些数据!!

  

log is ..

     
    
        
  1. START
  2.     
  3. 插入START
  4.     
  5. END(3。插入END< - 有时会错过日志。)     或..
  6.     
  7. START
  8.     
  9. END(错过了2,3,我从未找到它们)
  10.        

数据库中的总行数随时都不同。

我没有设置Celery的超时。 数据库的超时与我的sqlalchemy选项匹配。

你有什么想法吗? 请提供任何检查提示; - (

0 个答案:

没有答案